1
0
Fork 0
This repository has been archived on 2024-05-03. You can view files and clone it, but cannot push or open issues or pull requests.
unification-pfa/test/test_projet_pfa_23_24.ml

52 lines
1.7 KiB
OCaml
Raw Normal View History

2024-03-11 09:31:56 +01:00
open TypeInference
2024-03-11 15:18:02 +01:00
let tests_typeof =
2024-03-11 09:31:56 +01:00
let x = Identifier.fresh () in
let y = Identifier.fresh () in
[ (* IntConst *)
2024-03-28 17:17:16 +01:00
"0", Term.IntConst 0, Some Type.Int
; (* int -> int -> int = <fun> *)
2024-03-28 17:17:16 +01:00
( "fun x -> fun y -> x + y"
2024-03-11 15:18:02 +01:00
, Term.(Fun (x, Fun (y, Binop (Var x, Plus, Var y))))
, Some Type.(Arrow (Int, Arrow (Int, Int))) )
2024-03-28 17:17:16 +01:00
; (* Not typed variable *)
2024-04-13 15:51:57 +02:00
"x", Term.(Var "x"), Some (Type.Var "x")
; (* Binary operation *)
"1 + 2", Term.(Binop (IntConst 1, Plus, IntConst 2)), Some Type.Int
2024-03-28 17:17:16 +01:00
; (* Pair *)
"(1, 2)", Term.(Pair (IntConst 1, IntConst 2)), Some Type.(Product (Int, Int))
2024-03-28 17:17:16 +01:00
; (* Projection with first *)
"fst (1, 2)", Term.(Proj (First, Pair (IntConst 1, IntConst 2))), Some Type.Int
2024-03-28 17:17:16 +01:00
; (* Projection with second *)
"snd (1, 2)", Term.(Proj (Second, Pair (IntConst 1, IntConst 2))), Some Type.Int
2024-03-28 17:17:16 +01:00
; (* Apply (int) into (fun : int -> int) *)
( "(fun x -> x + 1) 5"
, Term.(App (Fun (x, Binop (Var x, Plus, IntConst 1)), IntConst 5))
2024-03-28 17:17:16 +01:00
, Some Type.Int )
; (* Apply product (int * int) into a not compatible function (fun : int -> int) *)
( "(fun x -> x + 1) (1, 2)"
, Term.(App (Fun (x, Binop (Var x, Plus, IntConst 1)), Pair (IntConst 1, IntConst 2)))
2024-03-28 17:17:16 +01:00
, None )
2024-03-11 15:18:02 +01:00
]
;;
2024-03-11 14:25:40 +01:00
2024-03-11 09:31:56 +01:00
let typeModule = (module Type : Alcotest.TESTABLE with type t = Type.t)
let check_typeof term_text term expected_type =
let open Alcotest in
2024-03-11 15:18:02 +01:00
test_case term_text `Quick (fun () ->
check (option typeModule) "Same type" expected_type (Inference.typeof term))
;;
2024-03-11 09:31:56 +01:00
let () =
let open Alcotest in
2024-03-11 15:18:02 +01:00
run
"Inference"
[ ( "typeof"
, List.map
(fun (term_text, term, expected_type) ->
check_typeof term_text term expected_type)
tests_typeof )
2024-03-11 09:31:56 +01:00
]
2024-03-11 15:18:02 +01:00
;;