; code : string
; out_lexing : (Tiger_parser.token list) option
; out_parsing : Tiger_absyn.t option
+ ; is_error_expected_parsing : (Tiger_error.t -> bool) option
; is_error_expected_semant : (Tiger_error.t -> bool) option
}
let case
?(out_lexing=None)
?(out_parsing=None)
+ ?(is_error_expected_parsing=None)
?(is_error_expected_semant=None)
~code
name
; code
; out_lexing
; out_parsing
+ ; is_error_expected_parsing
; is_error_expected_semant
}
| ast ->
Ok ast
-let pass_semant (absyn_opt : Tiger_absyn.t option)
+let pass_semant (absyn : Tiger_absyn.t)
: (unit, string) result
=
- match absyn_opt with
- | None ->
- Error "AST not provided"
- | Some absyn ->
- Ok (Tiger_semant.transProg absyn)
+ Ok (Tiger_semant.transProg absyn)
let str_exact str exact =
let len = String.length str in
; code
; out_lexing
; out_parsing
+ ; is_error_expected_parsing
; is_error_expected_semant
}
->
run_pass
~f:(fun () -> pass_parsing ~fake_filename:name ~code)
~expect_output:out_parsing
- ~is_error_expected:None
+ ~is_error_expected:is_error_expected_parsing
in
let res_sem =
- run_pass
- ~f:(fun () -> pass_semant res_pars.out_val)
- ~expect_output:(Some ())
- ~is_error_expected:is_error_expected_semant
+ (* TODO: Replace this hack with general test-dependency checking *)
+ match res_pars.out_val with
+ | None ->
+ { exe_stat = Skip
+ ; exe_msg = "No AST provided"
+ ; out_stat = Skip
+ ; out_val = None
+ ; out_msg = ""
+ }
+ | Some absyn ->
+ run_pass
+ ~f:(fun () -> pass_semant absyn)
+ ~expect_output:(Some ())
+ ~is_error_expected:is_error_expected_semant
in
let results =
(* Replacing out_val for type compatibility *)