From 80478f0eb936f38e0512371fc7a300cdc32775c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kim=20Nguy=E1=BB=85n?= Date: Sun, 10 Mar 2013 10:17:49 +0100 Subject: [PATCH] Fix the xml_diff program to also check trailing events (after ) Reformat output of XML query in test program Fix testing scripts. --- src/main.ml | 14 +++++++------- tools/do_test.sh | 44 +++++++++++++++++++++++++++++++++++++++++++ tools/gen_test.sh | 2 +- tools/xml_diff.ml | 48 +++++++++++++++++++++++++++++------------------ 4 files changed, 82 insertions(+), 26 deletions(-) create mode 100755 tools/do_test.sh diff --git a/src/main.ml b/src/main.ml index 3216e71..af1c930 100644 --- a/src/main.ml +++ b/src/main.ml @@ -14,7 +14,7 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) (** 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 "\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"; + flush stdout diff --git a/tools/do_test.sh b/tools/do_test.sh new file mode 100755 index 0000000..05163b8 --- /dev/null +++ b/tools/do_test.sh @@ -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" +) diff --git a/tools/gen_test.sh b/tools/gen_test.sh index 111052f..3e5a34f 100755 --- a/tools/gen_test.sh +++ b/tools/gen_test.sh @@ -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 diff --git a/tools/xml_diff.ml b/tools/xml_diff.ml index b6b9695..1d85743 100644 --- a/tools/xml_diff.ml +++ b/tools/xml_diff.ml @@ -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 () -- 2.17.1