(***********************************************************************)
(*
- 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"
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
--- /dev/null
+#!/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"
+)
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
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 ()