X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_test.ml;h=fdab310e23eb122cf1b91246cb272fba9ad83678;hb=0f031bf216b72b6d6bbc3941f4244c898f134ce4;hp=bea861166c537611f36c435dcb07e2ca58bcc26a;hpb=39dd0869f1547263dc85545adbbdc0a80eaa09a9;p=tiger.ml.git diff --git a/compiler/src/lib/tiger/tiger_test.ml b/compiler/src/lib/tiger/tiger_test.ml index bea8611..fdab310 100644 --- a/compiler/src/lib/tiger/tiger_test.ml +++ b/compiler/src/lib/tiger/tiger_test.ml @@ -45,7 +45,7 @@ type t = ; code : string ; out_lexing : (Tiger_parser.token list) option ; out_parsing : Tiger_absyn.t option - ; is_error_expected : (Tiger_error.t -> bool) + ; is_error_expected_semant : (Tiger_error.t -> bool) } type color = @@ -69,19 +69,19 @@ let status indicator info = | "" -> indicator | _ -> sprintf "%s: %s" indicator info -let status_ok ?(info="") () = - status (color Green "OK") info +let status_pass ?(info="") () = + status (color Green "Pass") info -let status_error ?(info="") () = - status (color Red "ERROR") info +let status_fail ?(info="") () = + status (color Red "Fail") info -let status_warn ?(info="") () = - status (color Yellow "WARN") info +let status_skip ?(info="") () = + status (color Yellow "Skip") info let case ?(out_lexing) ?(out_parsing) - ?(is_error_expected=(fun _ -> false)) + ?(is_error_expected_semant=(fun _ -> false)) ~code name = @@ -89,7 +89,7 @@ let case ; code ; out_lexing ; out_parsing - ; is_error_expected + ; is_error_expected_semant } let bar_sep = String.make 80 '-' @@ -135,7 +135,7 @@ let p_ln = print_newline let p_indent n = p "%s" (indent n) let run tests = - let error_count = ref 0 in + let failure_count = ref 0 in let run_pass ~f ~input ~expect_output ~is_error_expected = let output_status = "n/a" in let output_value = None in @@ -144,13 +144,13 @@ let run tests = let execution_status = (match e with | Tiger_error.T e when is_error_expected e -> - status_ok () ~info:(Tiger_error.to_string e) + status_pass () ~info:(Tiger_error.to_string e) | Tiger_error.T e -> - incr error_count; - status_error () ~info:(Tiger_error.to_string e) + incr failure_count; + status_fail () ~info:(Tiger_error.to_string e) | e -> - incr error_count; - status_error () ~info:(Printexc.to_string e) + incr failure_count; + status_fail () ~info:(Printexc.to_string e) ) in ( execution_status @@ -158,50 +158,59 @@ let run tests = , output_value ) | Error info -> - incr error_count; - ( status_error ~info () + incr failure_count; + ( status_fail ~info () , output_status , output_value ) | Ok produced -> - let execution_status = status_ok () in + let execution_status = status_pass () in let output_status = match Option.map expect_output (fun expected -> expected = produced) with | None -> - status_warn () ~info:"expected output not provided" + status_skip () ~info:"expected output not provided" | Some true -> - status_ok () + status_pass () | Some false -> - incr error_count; - status_error () + incr failure_count; + status_fail () in let output_value = Some produced in (execution_status, output_status, output_value) in + let test_case_count = ref 0 in List.iter tests ~f:( - fun {name; code; out_lexing; out_parsing; is_error_expected} -> + fun + { name + ; code + ; out_lexing + ; out_parsing + ; is_error_expected_semant + } + -> + incr test_case_count; let (stat_lex_exe, stat_lex_out_cmp, _) = run_pass ~f:pass_lexing ~input:code ~expect_output:out_lexing - ~is_error_expected + ~is_error_expected:(fun _ -> false) in let (stat_pars_exe, stat_pars_out_cmp, absyn_opt) = run_pass ~f:pass_parsing ~input:code ~expect_output:out_parsing - ~is_error_expected + ~is_error_expected:(fun _ -> false) in let (stat_semant_exe, stat_semant_out_cmp, _) = run_pass ~f:pass_semant ~input:absyn_opt ~expect_output:(Some ()) - ~is_error_expected + ~is_error_expected:is_error_expected_semant in p "%s" bar_sep; p_ln (); p "Test: %S" name; p_ln (); @@ -216,8 +225,14 @@ let run tests = p_indent 2; p "out: %s" stat_semant_out_cmp; p_ln (); ); p "%s" bar_end; p_ln (); - let failures = !error_count in - let clr = (if failures = 0 then Green else Red) in - p "Failures: %s" (color clr (string_of_int failures)); p_ln (); + p "%s" + ( let info = + s "%d failures in %d test cases" !failure_count !test_case_count + in + match !failure_count with + | 0 -> status_pass () ~info + | _ -> status_fail () ~info + ); + p_ln (); p "%s" bar_end; p_ln (); - exit failures + exit !failure_count