#!/bin/sh
set -u

printf '%s\n' '<?xml version="1.0" encoding="UTF-8"?><root><child attr="1">ok</child></root>' > /bench/valid.xml
printf '%s\n' '<root><child></root>' > /bench/mismatched.xml
printf '%s\n' '<root>&missing;</root>' > /bench/unknown-entity.xml
printf '%s\n' '<first/><second/>' > /bench/multiple-roots.xml
printf '%s\n' '<root attr="1" attr="2"/>' > /bench/duplicate-attribute.xml
printf '%s\n' '<root/>outside' > /bench/text-outside-root.xml
printf '%s\n' '<prefix:root/>' > /bench/unbound-prefix.xml
printf '<root>\001</root>\n' > /bench/forbidden-char.xml
printf '%s\n' '<root xmlns:a="urn:x" xmlns:b="urn:x" a:x="1" b:x="2"/>' > /bench/expanded-duplicate-attribute.xml
printf '%s\n' '<root xmlns:xml="urn:wrong"/>' > /bench/invalid-xml-prefix-binding.xml
printf '%s\n' '<!DOCTYPE root [<!ELEMENT root (#PCDATA)><!ENTITY ok "value">]><root>&ok;</root>' > /bench/legal-internal-dtd.xml
printf '%s\n' '<!DOCTYPE root SYSTEM "file:///etc/passwd"><root/>' > /bench/external-dtd.xml
printf '<root>\300\257</root>\n' > /bench/overlong-utf8.xml
printf '<root>\364\220\200\200</root>\n' > /bench/out-of-range-codepoint.xml
: > /bench/empty.xml

size=$(wc -c < /bench/input.xml)
head -c $((size - 32)) /bench/input.xml > /bench/truncated.xml
files='input.xml valid.xml mismatched.xml unknown-entity.xml multiple-roots.xml truncated.xml duplicate-attribute.xml text-outside-root.xml empty.xml unbound-prefix.xml forbidden-char.xml expanded-duplicate-attribute.xml invalid-xml-prefix-binding.xml legal-internal-dtd.xml external-dtd.xml overlong-utf8.xml out-of-range-codepoint.xml'

run() {
  name=$1
  shift
  printf '%s' "$name"
  for file in $files; do
    "$@" "/bench/$file" >/dev/null 2>&1
    printf '\t%s' "$?"
  done
  printf '\n'
}

printf 'command\tinput\tvalid\tmismatch\tentity\t2roots\ttruncated\tdup-attr\toutside-text\tempty\tunbound-prefix\tforbidden-char\texpanded-dup\tbad-xml-binding\tlegal-dtd\texternal-dtd\toverlong-utf8\tout-of-range-codepoint\n'
run 'JDK SAX JIT' java -cp /opt/java-parsers/classes JdkSaxLint
run 'JDK SAX GraalVM Native' /opt/java-parsers/native/jdk-sax-lint
run 'JDK StAX JIT' java -cp /opt/java-parsers/classes JdkStaxLint
run 'JDK StAX GraalVM Native' /opt/java-parsers/native/jdk-stax-lint
run 'Aalto JIT' java -cp '/opt/java-parsers/classes:/opt/java-parsers/lib/aalto-xml-1.4.0.jar:/opt/java-parsers/lib/stax2-api-4.3.0.jar' AaltoLint
run 'Aalto GraalVM Native' /opt/java-parsers/native/aalto-lint
run 'Woodstox JIT' java -cp '/opt/java-parsers/classes:/opt/java-parsers/lib/woodstox-core-7.2.1.jar:/opt/java-parsers/lib/stax2-api-4.3.0.jar' WoodstoxLint
run 'Woodstox GraalVM Native' /opt/java-parsers/native/woodstox-lint
