6 Helm_registry.load_from "gTopLevel.conf.xml";;
9 HelmLogger.log ~append_NL:true (`Msg (`T s))
12 let dbd = Mysql.quick_connect
13 ~host:(Helm_registry.get "db.host")
14 ~user:(Helm_registry.get "db.user")
15 ~database:(Helm_registry.get "db.database")
18 let mqi_handle = MQIConn.init ~flags:mqi_flags ~log:mqi_debug_fun ()
23 exception Failure of string
24 let fail msg = raise (Failure msg)
26 let uri_predicate = ref (BatchParser.constants_only ~prefix:"")
28 module DisambiguateCallbacks =
30 let interactive_user_uri_choice
31 ~selection_mode ?ok ?enable_button_for_non_vars ~title ~msg ~id choices =
32 List.filter !uri_predicate choices
34 let interactive_interpretation_choice =
38 | _::tl -> n::(aux (n+1) tl)
42 let input_or_locate_uri ~title = fail ("Unknown identifier: " ^ title)
45 module Disambiguate' = Disambiguate.Make (DisambiguateCallbacks)
47 let debug_print s = prerr_endline ("^^^^^^ " ^ s)
49 let test_uri typecheck uri =
51 try ignore(CicTypeChecker.typecheck uri CicUniv.empty_ugraph);1
52 with CicTypeChecker.TypeCheckerFailure s |
53 CicTypeChecker.AssertFailure s -> 0
55 let obj,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
56 let (annobj, _, _, ids_to_inner_sorts, _, _, _) =
57 Cic2acic.acic_object_of_cic_object ~eta_fix:false obj
59 let ids_to_uris = Hashtbl.create 1023 in
60 let round_trip annterm =
61 debug_print "(1) acic -> ast";
63 Acic2Ast.ast_of_acic ids_to_inner_sorts (*ids_to_uris*) annterm
65 let new_pp = BoxPp.pp_term ast in
66 debug_print ("ast:\n" ^ new_pp);
67 let new_ast = CicTextualParser2.parse_term (Stream.of_string new_pp) in
68 debug_print ("new_ast:\n" ^ CicAstPp.pp_term ast);
70 Disambiguate'.disambiguate_term ~dbd [] [] new_ast
71 ~aliases:DisambiguateTypes.Environment.empty
72 ~initial_ugraph:CicUniv.empty_ugraph
75 (fun (domain, _, term, _) ->
77 ("domain: " ^ CicTextualParser2.EnvironmentP3.to_string domain) ;
78 debug_print ("term: " ^ CicPp.ppterm term)
83 | Cic.AConstant (_, _, _, None, ty, _) ->
84 debug_print "Cic.AConstant (ty)";
86 | Cic.AConstant (_, _, _, Some bo, ty, _) ->
88 debug_print "Cic.AConstant (bo)";
89 let n = round_trip bo in
91 debug_print "Cic.AConstant (ty)";
92 round_trip ty (* + n *)
93 | Cic.AVariable (_, _, None, ty, _) ->
94 debug_print "Cic.AVariable (ty)";
96 | Cic.AVariable (_, _, Some bo, ty, _) ->
98 debug_print "Cic.AVariable (bo)";
99 let n = round_trip bo in
101 debug_print "Cic.AVariable (ty)";
102 round_trip ty (* + n *)
103 | Cic.ACurrentProof (_, _, _, _, _, _, _) ->
105 | Cic.AInductiveDefinition _ ->
106 debug_print "AInductiveDefinition: boh ..." ;
112 (Sys.signal Sys.sigalrm
115 (* We do this in case that some "with _" intercepts the first exception *)
116 ignore (Unix.alarm 1) ;
121 let test_uri typecheck uri =
123 ignore (Unix.alarm !time_out) ;
124 if test_uri typecheck uri = 1 then `Ok else `Maybe
127 (* We do this to clear the alarm set by the signal handler *)
128 ignore (Unix.alarm 0) ;
132 prerr_endline (sprintf "Top Level Uncaught Exception: %s"
133 (Printexc.to_string exn));
137 let report (ok,nok,maybe,timeout) =
139 print_endline "TestLibrary report";
140 print_endline "Succeeded URIs:";
141 List.iter (fun s -> print_endline ("\t" ^ s)) (List.rev !ok);
142 print_endline "Failed URIs:";
143 List.iter (fun s -> print_endline ("\t" ^ s)) (List.rev !nok);
144 print_endline "Multiple answers URIs:";
145 List.iter (fun s -> print_endline ("\t" ^ s)) (List.rev !maybe);
147 print_endline ("URIs that timeout (" ^ string_of_int !time_out ^ "s):");
148 List.iter (fun s -> print_endline ("\t" ^ s)) (List.rev !timeout);
151 let do_uri typecheck (ok, nok, maybe, timeout) uri =
152 let uri_str = UriManager.string_of_uri uri in
153 printf "Testing URI: %-55s %!" (uri_str ^ " ...");
154 (match test_uri typecheck uri with
156 print_endline "
\e[01;32m[ OK ]
\e[00m";
159 print_endline "
\e[01;31m[ FAILED ]
\e[00m";
160 nok := uri_str :: !nok
162 print_endline "
\e[01;33m[ MANY ]
\e[00m";
163 maybe := uri_str :: !maybe
165 print_endline "
\e[01;34m[TIMEOUT!]
\e[00m";
166 timeout := uri_str :: !timeout)
168 let do_file typecheck status fname =
170 let ic = open_in fname in
173 let line = input_line ic in
175 let uri = UriManager.uri_of_string line in
176 do_uri typecheck status uri
177 with UriManager.IllFormedUri _ ->
178 printf "Error parsing URI '%s', ignoring it" line
183 printf "Error trying to access '%s' (%s), skipping the file\n%!"
184 fname (Printexc.to_string exn)
187 HelmLogger.register_log_callback
188 (fun ?(append_NL = true) msg ->
189 (if append_NL then prerr_endline else prerr_string)
190 (HelmLogger.string_of_html_msg msg));
191 let names = ref [] in
192 let tryvars = ref false in
193 let typecheck = ref false in
194 let prefix = ref "" in
195 let varsprefix = ref "####" in
196 let usage = "testlibrary [OPTION] ... (uri1 | file1) (uri2 | file2) ..." in
198 [ "-vars", Arg.Set tryvars, "try also variables" ;
199 "-novars", Arg.Clear tryvars, "do not try variables (default)" ;
200 "-prefix", Arg.Set_string prefix,
201 "limit object choices to URIs beginning with prefix" ;
202 "-varsprefix", Arg.Set_string varsprefix,
203 "limit variable choices to URIs beginning with prefix; overrides -prefix" ;
204 "-timeout", Arg.Set_int time_out,
205 "number of seconds before a timeout; 0 means no timeout";
206 "-typecheck", Arg.Set typecheck, "simply typechek the uri"
209 Arg.parse spec (fun name -> names := name :: !names) usage;
210 let names = List.rev !names in
211 if !varsprefix = "####" then varsprefix := !prefix ;
213 BatchParser.uri_pred_of_conf !tryvars ~prefix:!prefix ~varsprefix:!varsprefix;
214 let status = (ref [], ref [], ref [], ref []) in (* <ok, nok, maybe, timeout> URIs *)
218 let uri = UriManager.uri_of_string name in
219 do_uri !typecheck status uri
220 with UriManager.IllFormedUri _ ->
221 if Sys.file_exists name then
222 do_file !typecheck status name
224 printf "Don't know what to do with '%s', ignoring it\n%!" name)