1#! /bin/sh
2
3#   EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
4
5# This script can be used to exercise Expat against the
6# w3c.org xml test suite, available from
7# http://www.w3.org/XML/Test/xmlts20020606.zip.
8
9# To run this script, first set XMLWF so that xmlwf can be
10# found, then set the output directory with OUTPUT.
11
12# The script lists all test cases where Expat shows a discrepancy
13# from the expected result. Test cases where only the canonical
14# output differs are prefixed with "Output differs:", and a diff file
15# is generated in the appropriate subdirectory under $OUTPUT.
16
17# If there are output files provided, the script will use
18# output from xmlwf and compare the desired output against it.
19# However, one has to take into account that the canonical output
20# produced by xmlwf conforms to an older definition of canonical XML
21# and does not generate notation declarations.
22
23MYDIR="`dirname \"$0\"`"
24cd "$MYDIR"
25MYDIR="`pwd`"
26XMLWF="`dirname \"$MYDIR\"`/xmlwf/xmlwf"
27# XMLWF=/usr/local/bin/xmlwf
28TS="$MYDIR/XML-Test-Suite"
29# OUTPUT must terminate with the directory separator.
30OUTPUT="$TS/out/"
31# OUTPUT=/home/tmp/xml-testsuite-out/
32
33
34# RunXmlwfNotWF file reldir
35# reldir includes trailing slash
36RunXmlwfNotWF() {
37  file="$1"
38  reldir="$2"
39  $XMLWF -p "$file" > outfile || return $?
40  read outdata < outfile
41  if test "$outdata" = "" ; then
42      echo "Expected well-formed: $reldir$file"
43      return 1
44  else
45      return 0
46  fi 
47}
48
49# RunXmlwfWF file reldir
50# reldir includes trailing slash
51RunXmlwfWF() {
52  file="$1"
53  reldir="$2"
54  $XMLWF -p -d "$OUTPUT$reldir" "$file" > outfile || return $?
55  read outdata < outfile 
56  if test "$outdata" = "" ; then 
57      if [ -f "out/$file" ] ; then 
58          diff "$OUTPUT$reldir$file" "out/$file" > outfile 
59          if [ -s outfile ] ; then 
60              cp outfile "$OUTPUT$reldir$file.diff"
61              echo "Output differs: $reldir$file"
62              return 1
63          fi 
64      fi 
65      return 0
66  else 
67      echo "In $reldir: $outdata"
68      return 1
69  fi 
70}
71
72SUCCESS=0
73ERROR=0
74
75UpdateStatus() {
76  if [ "$1" -eq 0 ] ; then
77    SUCCESS=`expr $SUCCESS + 1`
78  else
79    ERROR=`expr $ERROR + 1`
80  fi
81}
82
83##########################
84# well-formed test cases #
85##########################
86
87cd "$TS/xmlconf"
88for xmldir in ibm/valid/P* \
89              ibm/invalid/P* \
90              xmltest/valid/ext-sa \
91              xmltest/valid/not-sa \
92              xmltest/invalid \
93              xmltest/invalid/not-sa \
94              xmltest/valid/sa \
95              sun/valid \
96              sun/invalid ; do
97  cd "$TS/xmlconf/$xmldir"
98  mkdir -p "$OUTPUT$xmldir"
99  for xmlfile in *.xml ; do
100      RunXmlwfWF "$xmlfile" "$xmldir/"
101      UpdateStatus $?
102  done
103  rm outfile
104done
105
106cd "$TS/xmlconf/oasis"
107mkdir -p "$OUTPUT"oasis
108for xmlfile in *pass*.xml ; do
109    RunXmlwfWF "$xmlfile" "oasis/"
110    UpdateStatus $?
111done
112rm outfile
113
114##############################
115# not well-formed test cases #
116##############################
117
118cd "$TS/xmlconf"
119for xmldir in ibm/not-wf/P* \
120              ibm/not-wf/misc \
121              xmltest/not-wf/ext-sa \
122              xmltest/not-wf/not-sa \
123              xmltest/not-wf/sa \
124              sun/not-wf ; do
125  cd "$TS/xmlconf/$xmldir"
126  for xmlfile in *.xml ; do
127      RunXmlwfNotWF "$xmlfile" "$xmldir/"
128      UpdateStatus $?
129  done
130  rm outfile
131done
132
133cd "$TS/xmlconf/oasis"
134for xmlfile in *fail*.xml ; do
135    RunXmlwfNotWF "$xmlfile" "oasis/"
136    UpdateStatus $?
137done
138rm outfile
139
140echo "Passed: $SUCCESS"
141echo "Failed: $ERROR"
142