1 1.2 spz #! /usr/bin/env bash 2 1.5 christos # EXPAT TEST SCRIPT FOR W3C XML TEST SUITE 3 1.5 christos # 4 1.1 tron # This script can be used to exercise Expat against the 5 1.6 wiz # w3c.org xml test suite, available from: 6 1.6 wiz # https://www.w3.org/XML/Test/xmlts20020606.zip 7 1.5 christos # 8 1.2 spz # To run this script, first set XMLWF below so that xmlwf can be 9 1.1 tron # found, then set the output directory with OUTPUT. 10 1.5 christos # 11 1.1 tron # The script lists all test cases where Expat shows a discrepancy 12 1.1 tron # from the expected result. Test cases where only the canonical 13 1.1 tron # output differs are prefixed with "Output differs:", and a diff file 14 1.1 tron # is generated in the appropriate subdirectory under $OUTPUT. 15 1.5 christos # 16 1.1 tron # If there are output files provided, the script will use 17 1.1 tron # output from xmlwf and compare the desired output against it. 18 1.1 tron # However, one has to take into account that the canonical output 19 1.1 tron # produced by xmlwf conforms to an older definition of canonical XML 20 1.1 tron # and does not generate notation declarations. 21 1.5 christos # 22 1.5 christos # __ __ _ 23 1.5 christos # ___\ \/ /_ __ __ _| |_ 24 1.5 christos # / _ \\ /| '_ \ / _` | __| 25 1.5 christos # | __// \| |_) | (_| | |_ 26 1.5 christos # \___/_/\_\ .__/ \__,_|\__| 27 1.5 christos # |_| XML parser 28 1.5 christos # 29 1.5 christos # Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake (at] users.sourceforge.net> 30 1.5 christos # Copyright (c) 2002 Karl Waclawek <karl (at] waclawek.net> 31 1.5 christos # Copyright (c) 2008-2019 Sebastian Pipping <sebastian (at] pipping.org> 32 1.5 christos # Copyright (c) 2017 Rhodri James <rhodri (at] wildebeest.org.uk> 33 1.6 wiz # Copyright (c) 2025 Hanno Bck <hanno (at] gentoo.org> 34 1.5 christos # Licensed under the MIT license: 35 1.5 christos # 36 1.5 christos # Permission is hereby granted, free of charge, to any person obtaining 37 1.5 christos # a copy of this software and associated documentation files (the 38 1.5 christos # "Software"), to deal in the Software without restriction, including 39 1.5 christos # without limitation the rights to use, copy, modify, merge, publish, 40 1.5 christos # distribute, sublicense, and/or sell copies of the Software, and to permit 41 1.5 christos # persons to whom the Software is furnished to do so, subject to the 42 1.5 christos # following conditions: 43 1.5 christos # 44 1.5 christos # The above copyright notice and this permission notice shall be included 45 1.5 christos # in all copies or substantial portions of the Software. 46 1.5 christos # 47 1.5 christos # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 48 1.5 christos # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 49 1.5 christos # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 50 1.5 christos # NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 51 1.5 christos # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 52 1.5 christos # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 53 1.5 christos # USE OR OTHER DEALINGS IN THE SOFTWARE. 54 1.1 tron 55 1.2 spz shopt -s nullglob 56 1.2 spz 57 1.4 maya # Note: OUTPUT must terminate with the directory separator. 58 1.4 maya OUTPUT="$PWD/tests/out/" 59 1.4 maya TS="$PWD/tests/" 60 1.4 maya 61 1.1 tron MYDIR="`dirname \"$0\"`" 62 1.1 tron cd "$MYDIR" 63 1.1 tron MYDIR="`pwd`" 64 1.3 christos #XMLWF="${1:-`dirname \"$MYDIR\"`/xmlwf/xmlwf}" 65 1.2 spz XMLWF=/usr/bin/xmlwf 66 1.4 maya # Unicode-aware diff utility 67 1.4 maya DIFF="${MYDIR}/udiffer.py" 68 1.1 tron 69 1.1 tron 70 1.1 tron # RunXmlwfNotWF file reldir 71 1.1 tron # reldir includes trailing slash 72 1.1 tron RunXmlwfNotWF() { 73 1.1 tron file="$1" 74 1.1 tron reldir="$2" 75 1.4 maya if $XMLWF -p "$file" > /dev/null; then 76 1.2 spz echo "Expected not well-formed: $reldir$file" 77 1.1 tron return 1 78 1.1 tron else 79 1.1 tron return 0 80 1.1 tron fi 81 1.1 tron } 82 1.1 tron 83 1.1 tron # RunXmlwfWF file reldir 84 1.1 tron # reldir includes trailing slash 85 1.1 tron RunXmlwfWF() { 86 1.1 tron file="$1" 87 1.1 tron reldir="$2" 88 1.4 maya $XMLWF -p -N -d "$OUTPUT$reldir" "$file" > outfile || return $? 89 1.1 tron read outdata < outfile 90 1.1 tron if test "$outdata" = "" ; then 91 1.1 tron if [ -f "out/$file" ] ; then 92 1.4 maya $DIFF "$OUTPUT$reldir$file" "out/$file" > outfile 93 1.1 tron if [ -s outfile ] ; then 94 1.1 tron cp outfile "$OUTPUT$reldir$file.diff" 95 1.1 tron echo "Output differs: $reldir$file" 96 1.1 tron return 1 97 1.1 tron fi 98 1.1 tron fi 99 1.1 tron return 0 100 1.1 tron else 101 1.1 tron echo "In $reldir: $outdata" 102 1.1 tron return 1 103 1.1 tron fi 104 1.1 tron } 105 1.1 tron 106 1.1 tron SUCCESS=0 107 1.1 tron ERROR=0 108 1.1 tron 109 1.1 tron UpdateStatus() { 110 1.1 tron if [ "$1" -eq 0 ] ; then 111 1.1 tron SUCCESS=`expr $SUCCESS + 1` 112 1.1 tron else 113 1.1 tron ERROR=`expr $ERROR + 1` 114 1.1 tron fi 115 1.1 tron } 116 1.1 tron 117 1.1 tron ########################## 118 1.1 tron # well-formed test cases # 119 1.1 tron ########################## 120 1.1 tron 121 1.1 tron cd "$TS/xmlconf" 122 1.1 tron for xmldir in ibm/valid/P* \ 123 1.1 tron ibm/invalid/P* \ 124 1.1 tron xmltest/valid/ext-sa \ 125 1.1 tron xmltest/valid/not-sa \ 126 1.1 tron xmltest/invalid \ 127 1.1 tron xmltest/invalid/not-sa \ 128 1.1 tron xmltest/valid/sa \ 129 1.1 tron sun/valid \ 130 1.1 tron sun/invalid ; do 131 1.1 tron cd "$TS/xmlconf/$xmldir" 132 1.1 tron mkdir -p "$OUTPUT$xmldir" 133 1.3 christos for xmlfile in $(ls -1 *.xml | sort -d) ; do 134 1.3 christos [[ -f "$xmlfile" ]] || continue 135 1.1 tron RunXmlwfWF "$xmlfile" "$xmldir/" 136 1.1 tron UpdateStatus $? 137 1.1 tron done 138 1.2 spz rm -f outfile 139 1.1 tron done 140 1.1 tron 141 1.1 tron cd "$TS/xmlconf/oasis" 142 1.1 tron mkdir -p "$OUTPUT"oasis 143 1.1 tron for xmlfile in *pass*.xml ; do 144 1.1 tron RunXmlwfWF "$xmlfile" "oasis/" 145 1.1 tron UpdateStatus $? 146 1.1 tron done 147 1.1 tron rm outfile 148 1.1 tron 149 1.1 tron ############################## 150 1.1 tron # not well-formed test cases # 151 1.1 tron ############################## 152 1.1 tron 153 1.1 tron cd "$TS/xmlconf" 154 1.1 tron for xmldir in ibm/not-wf/P* \ 155 1.2 spz ibm/not-wf/p28a \ 156 1.1 tron ibm/not-wf/misc \ 157 1.1 tron xmltest/not-wf/ext-sa \ 158 1.1 tron xmltest/not-wf/not-sa \ 159 1.1 tron xmltest/not-wf/sa \ 160 1.1 tron sun/not-wf ; do 161 1.1 tron cd "$TS/xmlconf/$xmldir" 162 1.1 tron for xmlfile in *.xml ; do 163 1.1 tron RunXmlwfNotWF "$xmlfile" "$xmldir/" 164 1.1 tron UpdateStatus $? 165 1.1 tron done 166 1.1 tron done 167 1.1 tron 168 1.1 tron cd "$TS/xmlconf/oasis" 169 1.1 tron for xmlfile in *fail*.xml ; do 170 1.1 tron RunXmlwfNotWF "$xmlfile" "oasis/" 171 1.1 tron UpdateStatus $? 172 1.1 tron done 173 1.1 tron 174 1.1 tron echo "Passed: $SUCCESS" 175 1.1 tron echo "Failed: $ERROR" 176