let color_off = "\027[0m" in
sprintf "%s%s%s" color_on string color_off
+let status indicator info =
+ match info with
+ | "" -> indicator
+ | _ -> sprintf "%s: %s" indicator info
+
+let status_pass ?(info="") () =
+ status (color Green "Pass") info
+
+let status_fail ?(info="") () =
+ status (color Red "Fail") info
+
+let status_skip ?(info="") () =
+ status (color Yellow "Skip") info
+
let case
?(out_lexing)
?(out_parsing)
| ast ->
Ok ast
+let pass_semant (absyn_opt : Tiger_absyn.t option) : (unit, string) result =
+ match absyn_opt with
+ | None ->
+ Error "AST not provided"
+ | Some absyn ->
+ Ok (Tiger_semant.transProg absyn)
+
let s = sprintf
let p = printf
let p_ln = print_newline
let output_value = None in
match f input with
| exception e ->
- let c, e =
+ let execution_status =
(match e with
| Tiger_error.T e when is_error_expected e ->
- (Green, Tiger_error.to_string e)
+ status_pass () ~info:(Tiger_error.to_string e)
| Tiger_error.T e ->
incr error_count;
- (Red, Tiger_error.to_string e)
+ status_fail () ~info:(Tiger_error.to_string e)
| e ->
incr error_count;
- (Red, Printexc.to_string e)
+ status_fail () ~info:(Printexc.to_string e)
)
in
- ( s "%s: %s" (color c "ERROR") e
+ ( execution_status
, output_status
, output_value
)
- | Error msg ->
+ | Error info ->
incr error_count;
- ( s "%s: %s" (color Red "ERROR") msg
+ ( status_fail ~info ()
, output_status
, output_value
)
| Ok produced ->
- let execution_status = s "%s" (color Green "OK") in
+ let execution_status = status_pass () in
let output_status =
match
Option.map expect_output (fun expected -> expected = produced)
with
| None ->
- s "%s" (color Yellow "expected output not provided")
+ status_skip () ~info:"expected output not provided"
| Some true ->
- s "%s" (color Green "OK")
+ status_pass ()
| Some false ->
incr error_count;
- s "%s" (color Red "ERROR")
+ status_fail ()
in
let output_value = Some produced in
(execution_status, output_status, output_value)
~expect_output:out_lexing
~is_error_expected
in
- let (stat_pars_exe, stat_pars_out_cmp, _) =
+ let (stat_pars_exe, stat_pars_out_cmp, absyn_opt) =
run_pass
~f:pass_parsing
~input:code
~expect_output:out_parsing
~is_error_expected
in
+ let (stat_semant_exe, stat_semant_out_cmp, _) =
+ run_pass
+ ~f:pass_semant
+ ~input:absyn_opt
+ ~expect_output:(Some ())
+ ~is_error_expected
+ in
p "%s" bar_sep; p_ln ();
p "Test: %S" name; p_ln ();
p_indent 1; p "Lexing:"; p_ln ();
p_indent 1; p "Parsing:"; p_ln ();
p_indent 2; p "exe: %s" stat_pars_exe ; p_ln ();
p_indent 2; p "out: %s" stat_pars_out_cmp; p_ln ();
+ p_indent 1; p "Semantic Analysis:"; p_ln ();
+ p_indent 2; p "exe: %s" stat_semant_exe ; p_ln ();
+ p_indent 2; p "out: %s" stat_semant_out_cmp; p_ln ();
);
p "%s" bar_end; p_ln ();
let failures = !error_count in