module Check = Make_checkTest.M (Qsp_syntax.Type_of) let _position = (Lexing.dummy_pos, Lexing.dummy_pos) let _test_instruction : string -> Qsp_syntax.Report.t list -> unit = Check._test_instruction let type_mismatch () = _test_instruction {|abc = 'ABC'|} [ { level = Error; loc = _position; message = "The type Integer is expected but got String"; }; ] let type_mismatch2 () = _test_instruction {|abc[''] = $Var|} [ { level = Warn; loc = _position; message = "The type Integer is expected but got String"; }; ] let type_conversion () = _test_instruction {|abc = '123'|} [ { level = Warn; loc = _position; message = "The type Integer is expected but got Integer as String"; }; ] (** This expression is not considered as a string *) let type_conversion' () = _test_instruction {|abc = '<<123>>'|} [] let type_comparaison () = _test_instruction {|(abc = '123')|} [] let type_comparaison_mismatch () = _test_instruction {|(abc = 'ABC')|} [ { level = Warn; loc = _position; message = "The type String is expected but got Integer"; }; ] let wrong_predicate () = _test_instruction {| if $var and 1: 0 |} [ { level = Warn; loc = _position; message = "The type Bool is expected but got String"; }; ] let test = ( "Typechecking", [ Alcotest.test_case "Assign" `Quick type_mismatch; Alcotest.test_case "Assign array" `Quick type_mismatch2; Alcotest.test_case "Conversion" `Quick type_conversion; Alcotest.test_case "Conversion'" `Quick type_conversion'; Alcotest.test_case "Comparaison" `Quick type_comparaison; Alcotest.test_case "Comparaison Mismatch" `Quick type_comparaison_mismatch; Alcotest.test_case "Wrong predicate" `Quick wrong_predicate; ] )