Fix the xml_diff program to also check trailing events (after </root>)
authorKim Nguyễn <kn@lri.fr>
Sun, 10 Mar 2013 09:17:49 +0000 (10:17 +0100)
committerKim Nguyễn <kn@lri.fr>
Sun, 10 Mar 2013 09:17:49 +0000 (10:17 +0100)
Reformat output of XML query in test program
Fix testing scripts.

src/main.ml
tools/do_test.sh [new file with mode: 0755]
tools/gen_test.sh
tools/xml_diff.ml

index 3216e71..af1c930 100644 (file)
@@ -14,7 +14,7 @@
 (***********************************************************************)
 
 (*
-  Time-stamp: <Last modified on 2013-03-05 15:26:51 CET by Kim Nguyen>
+  Time-stamp: <Last modified on 2013-03-10 09:49:00 CET by Kim Nguyen>
 *)
 
 (** use: xml_file "XPath querie"
@@ -50,10 +50,10 @@ let () =
   fprintf err_formatter "Evaluating automaton:\n%!";
   let module Naive = Auto.Eval.Make(Tree.Naive) in
   let results = Naive.eval auto doc (Tree.Naive.root doc) in
+  output_string stdout "<xml_results>\n"
   List.iter (fun n ->
-    Tree.Naive.print_xml stderr doc n;
-    flush stderr;
-    output_string stderr "\n-------------------\n";
-  ) results
-
-
+    Tree.Naive.print_xml stdout doc n;
+    output_char stdout '\n'
+  ) results;
+  output_string stdout "\n<xml_results>";
+  flush stdout
diff --git a/tools/do_test.sh b/tools/do_test.sh
new file mode 100755 (executable)
index 0000000..05163b8
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+TESTPROG="../main.native"
+
+usage() {
+    echo "error: missing input, query file, xml_diff or $TESTPROG"
+    echo "usage: $0 file.xml"
+}
+
+FILE="$1"
+RESULTS="$FILE".results
+QUERIES="$FILE".queries
+
+if test ! -f "$FILE" -o ! -f "$QUERIES" -o ! -f "$TESTPROG" -o ! -f xml_diff
+then
+   usage;
+   exit 1
+fi
+
+
+mkdir -p "$RESULTS"
+
+cat "$QUERIES" | grep -v '^#' | ( TOTAL=0; TESTS=0;
+while read qname q
+do
+    TOTAL=$(($TOTAL + 1))
+    echo -n "Testing $qname: $q ... "
+    "$TESTROG" "$FILE" "$q" > "$RESULTS"/"$qname"_test.xml 2> "$RESULTS"/"$qname"_test.log
+    ./xml_diff "$RESULTS"/"$qname"_test.xml "$RESULTS"/"$qname".xml 2>> "$RESULTS"/"$qname"_test.log
+    case "$?" in
+        0)
+            TESTS=$(($TESTS + 1))
+            echo ok
+            ;;
+        *)
+            echo failed
+            echo ------- output -----------
+            cat "$RESULTS"/"$qname"_test.log
+            echo --------------------------
+            ;;
+    esac
+done;
+echo "Summary: $TESTS/$TOTAL tests successfull"
+)
index 111052f..3e5a34f 100755 (executable)
@@ -20,6 +20,6 @@ mkdir -p "$RESULTS"
 
 cat "$QUERIES" | grep -v '^#' | while read qname q
 do
-    echo "Computing $q" 
+    echo "Computing $q"
     java XPathEval "$FILE" "$q" > "$RESULTS"/"$qname".xml
 done
index b6b9695..1d85743 100644 (file)
@@ -57,6 +57,14 @@ let create_parser () =
 
 exception Diff of position
 
+let common_prefix ctx1 ctx2 len =
+  for i = 1 to len do
+    let e1,p1 = Queue.pop ctx1.events in
+    let e2,_ = Queue.pop ctx2.events in
+    if not (eq_event e1 e2) then raise (Diff p1)
+  done
+
+
 let diffs fd1 fd2 =
   let buffer1 = String.create 4096 in
   let buffer2 = String.create 4096 in
@@ -65,36 +73,40 @@ let diffs fd1 fd2 =
   let rec loop () =
     let read1 = input fd1 buffer1 0 4096 in
     let read2 = input fd2 buffer2 0 4096 in
-    if read1 == 0 && read2 == 0 then () else
+    if read1 == 0 && read2 == 0 then begin
+      let l1 = Queue.length ctx1.events in
+      let l2 = Queue.length ctx2.events in
+      if l1 > l2 then let _, p1 = Queue.pop ctx1.events in raise (Diff p1)
+      else if l2 > l1 then let _, p2 = Queue.pop ctx2.events in raise (Diff p2)
+      else common_prefix ctx1 ctx2 l1
+    end else begin
       let () = Expat.parse_sub parser1 buffer1 0 read1 in
       let () = Expat.parse_sub parser2 buffer2 0 read2 in
-      for i = 1 to min (Queue.length ctx1.events) (Queue.length ctx2.events) do
-        let e1,p1 = Queue.pop ctx1.events in
-        let e2,_ = Queue.pop ctx2.events in
-        if not (eq_event e1 e2) then
-          raise (Diff p1)
-      done;
+      common_prefix ctx1 ctx2 (min (Queue.length ctx1.events) (Queue.length ctx2.events));
       loop ()
+    end
   in
   loop ()
 
 let main () =
-  if Array.length Sys.argv != 3 then
-    Printf.eprintf "usage: %s file1.xml file2.xml\n%!" Sys.argv.(0)
-  else
+  if Array.length Sys.argv != 3 then begin
+    Printf.eprintf "usage: %s file1.xml file2.xml\n%!" Sys.argv.(0);
+    exit 2
+  end else
     let fn1 = Sys.argv.(1) in
     let fn2 = Sys.argv.(2) in
     try
       let fd1 = open_in fn1 in
       let fd2 = open_in fn2 in
-      let () =
-      try
-        diffs fd1 fd2
-      with
-        Diff p -> Printf.printf "File %s and %s differ at line %i, column %i\n%!"
-          fn1 fn2 p.line_num p.column_num
-      in close_in fd1; close_in fd2
+      let code =
+        try
+          diffs fd1 fd2; 0
+        with
+          Diff p -> Printf.eprintf "File %s and %s differ at line %i, column %i\n%!"
+            fn1 fn2 p.line_num p.column_num;1
+      in close_in fd1; close_in fd2; exit code
     with
-      _ -> Printf.eprintf "Error\n%!"
+      e -> Printf.eprintf "Error %s\n%!" (Printexc.to_string e); exit 3
+
 let () = main ()