#!/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
: > /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'

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\n'
run xmlwf xmlwf
run 'xmlwf namespaces' xmlwf -n
run 'xmllint stream' xmllint --stream --noout --nonet
run 'xmllint DOM' xmllint --noout --nonet
run XMLStarlet xmlstarlet val -w -q
run RXP rxp -xs
run 'RXP namespaces' rxp -Nxs
run Xerces-C SAX2Count -v=never -s -n
run 'Xerces-C namespaces' SAX2Count -v=never -s
run 'C# XmlReader JIT' /opt/csharp/jit/XmlReaderLint/XmlReaderLint
run 'C# XmlReader NativeAOT' /opt/csharp/aot/XmlReaderLint/XmlReaderLint
run 'C# TurboXml JIT' /opt/csharp/jit/TurboXmlLint/TurboXmlLint
run 'C# TurboXml NativeAOT' /opt/csharp/aot/TurboXmlLint/TurboXmlLint
run 'C# AngleSharp JIT' /opt/csharp/jit/AngleSharpLint/AngleSharpLint
run 'C# AngleSharp NativeAOT' /opt/csharp/aot/AngleSharpLint/AngleSharpLint
run 'JAXB GraalVM Native' /opt/jaxb-xml-lint-native
run anyxml-Rust xmlprocess show
run 'Python xq' xq empty

printf 'Python xmltodict'
for file in $files; do
  python -m xmltodict 2147483647 <"/bench/$file" >/dev/null 2>&1
  printf '\t%s' "$?"
done
printf '\n'

run 'Perl XML::Twig' xml_grep --strict --files --cond 0
run 'PHP sclable' /opt/php-sclable/vendor/bin/xmllint -s
run 'PHP mickaelandrieu' /opt/php-mickael/vendor/bin/xml-linter
run JAXB java -jar /opt/jaxb-xml-lint.jar

printf 'BaseX'
for file in $files; do
  java -cp /opt/BaseX.jar org.basex.BaseX -ODTD=false -OXINCLUDE=false -i"/bench/$file" -z . >/dev/null 2>&1
  printf '\t%s' "$?"
done
printf '\n'

printf 'SaxonJ'
for file in $files; do
  java -cp '/opt/saxon/saxon-he-12.10.jar:/opt/saxon/lib/*' net.sf.saxon.Query \
    --allowedProtocols:#none -dtd:off -s:"/bench/$file" '-qs:count(/*)' -o:/dev/null >/dev/null 2>&1
  printf '\t%s' "$?"
done
printf '\n'

printf 'Saxon .NET'
for file in $files; do
  SaxonHE12NetXQuery -dtd:off -s:"/bench/$file" '-qs:count(/*)' -o:/dev/null >/dev/null 2>&1
  printf '\t%s' "$?"
done
printf '\n'

printf 'Xerces-J sample'
for file in $files; do
  java -cp '/opt/xerces-2_12_2/xercesSamples.jar:/opt/xerces-2_12_2/xercesImpl.jar:/opt/xerces-2_12_2/xml-apis.jar' \
    sax.Counter -N -V -S "/bench/$file" >/dev/null 2>&1
  printf '\t%s' "$?"
done
printf '\n'
