add test hierarchy
This commit is contained in:
parent
44d6f31a1d
commit
1fa727061b
@ -204,7 +204,6 @@ let rec assert_type_value_eq (a, b: (type_value * type_value)) : unit result = m
|
|||||||
@@ Assert.assert_list_same_size sa' sb' in
|
@@ Assert.assert_list_same_size sa' sb' in
|
||||||
trace (simple_error "sum type") @@
|
trace (simple_error "sum type") @@
|
||||||
bind_list_iter aux (List.combine sa' sb')
|
bind_list_iter aux (List.combine sa' sb')
|
||||||
|
|
||||||
)
|
)
|
||||||
| T_sum _, _ -> fail @@ different_kinds a b
|
| T_sum _, _ -> fail @@ different_kinds a b
|
||||||
| T_record ra, T_record rb -> (
|
| T_record ra, T_record rb -> (
|
||||||
|
@ -8,6 +8,6 @@ let compile_contract_basic () : unit result =
|
|||||||
in
|
in
|
||||||
ok ()
|
ok ()
|
||||||
|
|
||||||
let main = "Bin", [
|
let main = test_suite "Bin" [
|
||||||
test "compile contract basic" compile_contract_basic ;
|
test "compile contract basic" compile_contract_basic ;
|
||||||
]
|
]
|
||||||
|
@ -229,7 +229,7 @@ let sell () =
|
|||||||
ok ()
|
ok ()
|
||||||
|
|
||||||
|
|
||||||
let main = "Coase (End to End)", [
|
let main = test_suite "Coase (End to End)" [
|
||||||
test "buy" buy ;
|
test "buy" buy ;
|
||||||
test "dispatch buy" dispatch_buy ;
|
test "dispatch buy" dispatch_buy ;
|
||||||
test "transfer" transfer ;
|
test "transfer" transfer ;
|
||||||
|
@ -28,7 +28,7 @@ let multiple_vars () : unit result =
|
|||||||
let%bind _ = Assert.assert_equal_int ~msg:__LOC__ 42 result in
|
let%bind _ = Assert.assert_equal_int ~msg:__LOC__ 42 result in
|
||||||
ok ()
|
ok ()
|
||||||
|
|
||||||
let main = "Compiler (from Mini_C)", [
|
let main = test_suite "Compiler (from Mini_C)" [
|
||||||
test "identity" identity ;
|
test "identity" identity ;
|
||||||
test "multiple_vars" multiple_vars ;
|
test "multiple_vars" multiple_vars ;
|
||||||
]
|
]
|
||||||
|
@ -118,7 +118,7 @@ let pop () : unit result =
|
|||||||
simple_fail "display"
|
simple_fail "display"
|
||||||
(* ok () *)
|
(* ok () *)
|
||||||
|
|
||||||
let main = "Heap (End to End)", [
|
let main = test_suite "Heap (End to End)" [
|
||||||
test "is_empty" is_empty ;
|
test "is_empty" is_empty ;
|
||||||
test "get_top" get_top ;
|
test "get_top" get_top ;
|
||||||
test "pop_switch" pop_switch ;
|
test "pop_switch" pop_switch ;
|
||||||
|
@ -456,7 +456,7 @@ let guess_the_hash_mligo () : unit result =
|
|||||||
let make_expected = fun n -> e_pair (e_typed_list [] t_operation) (e_int (42 + n)) in
|
let make_expected = fun n -> e_pair (e_typed_list [] t_operation) (e_int (42 + n)) in
|
||||||
expect_eq_n program "main" make_input make_expected
|
expect_eq_n program "main" make_input make_expected
|
||||||
|
|
||||||
let main = "Integration (End to End)", [
|
let main = test_suite "Integration (End to End)" [
|
||||||
test "type alias" type_alias ;
|
test "type alias" type_alias ;
|
||||||
test "function" function_ ;
|
test "function" function_ ;
|
||||||
test "assign" assign ;
|
test "assign" assign ;
|
||||||
|
@ -1,9 +1,50 @@
|
|||||||
(* -*- compile-command: "cd .. ; dune runtest" -*- *)
|
(* -*- compile-command: "cd .. ; dune runtest" -*- *)
|
||||||
|
|
||||||
|
open Test_helpers
|
||||||
|
|
||||||
|
let rec test_height : test -> int = fun t ->
|
||||||
|
match t with
|
||||||
|
| Test _ -> 1
|
||||||
|
| Test_suite (_ , lst) -> (List.fold_left max 1 @@ List.map test_height lst) + 1
|
||||||
|
|
||||||
|
let extract_test : test -> test_case = fun t ->
|
||||||
|
match t with
|
||||||
|
| Test tc -> tc
|
||||||
|
| _ -> assert false
|
||||||
|
|
||||||
|
let extract_param : test -> (string * (string * test_case list) list) =
|
||||||
|
let extract_element = extract_test in
|
||||||
|
let extract_group : test -> (string * test_case list) = fun t ->
|
||||||
|
match t with
|
||||||
|
| Test tc -> ("isolated" , [ tc ])
|
||||||
|
| Test_suite (name , lst) -> (name , List.map extract_element lst) in
|
||||||
|
fun t ->
|
||||||
|
match t with
|
||||||
|
| Test tc -> ("" , [ ("isolated" , [ tc ] ) ])
|
||||||
|
| Test_suite (name , lst) -> (name , List.map extract_group lst)
|
||||||
|
|
||||||
|
let x : _ -> (unit Alcotest.test) = fun x -> x
|
||||||
|
|
||||||
|
(*
|
||||||
|
Alcotest.run parameters:
|
||||||
|
string * (string * f list) list
|
||||||
|
*)
|
||||||
|
|
||||||
|
let rec run_test ?(prefix = "") : test -> unit = fun t ->
|
||||||
|
match t with
|
||||||
|
| Test case -> Alcotest.run "isolated test" [ ("" , [ case ]) ]
|
||||||
|
| Test_suite (name , lst) -> (
|
||||||
|
if (test_height t <= 3) then (
|
||||||
|
let (name , tests) = extract_param t in
|
||||||
|
Alcotest.run (prefix ^ name) tests
|
||||||
|
) else (
|
||||||
|
List.iter (run_test ~prefix:(prefix ^ name ^ "_")) lst
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
let () =
|
let () =
|
||||||
(* Printexc.record_backtrace true ; *)
|
(* Printexc.record_backtrace true ; *)
|
||||||
Alcotest.run "LIGO" [
|
run_test @@ test_suite "LIGO" [
|
||||||
(* Multifix_tests.main ; *)
|
|
||||||
Integration_tests.main ;
|
Integration_tests.main ;
|
||||||
Compiler_tests.main ;
|
Compiler_tests.main ;
|
||||||
Transpiler_tests.main ;
|
Transpiler_tests.main ;
|
||||||
|
@ -1,16 +1,25 @@
|
|||||||
open! Trace
|
open! Trace
|
||||||
|
|
||||||
|
type test_case = unit Alcotest.test_case
|
||||||
|
type test =
|
||||||
|
| Test_suite of (string * test list)
|
||||||
|
| Test of test_case
|
||||||
|
|
||||||
let test name f =
|
let test name f =
|
||||||
Alcotest.test_case name `Quick @@ fun () ->
|
Test (
|
||||||
let result =
|
Alcotest.test_case name `Quick @@ fun () ->
|
||||||
trace (fun () -> error (thunk "running test") (thunk name) ()) @@
|
let result =
|
||||||
|
trace (fun () -> error (thunk "running test") (thunk name) ()) @@
|
||||||
f () in
|
f () in
|
||||||
match result with
|
match result with
|
||||||
| Ok ((), annotations) -> ignore annotations; ()
|
| Ok ((), annotations) -> ignore annotations; ()
|
||||||
| Error err ->
|
| Error err ->
|
||||||
Format.printf "Errors : {\n%a}\n%!" error_pp (err ()) ;
|
Format.printf "Errors : {\n%a}\n%!" error_pp (err ()) ;
|
||||||
raise Alcotest.Test_error
|
raise Alcotest.Test_error
|
||||||
|
)
|
||||||
|
|
||||||
|
let test_suite name lst = Test_suite (name , lst)
|
||||||
|
|
||||||
open Ast_simplified.Combinators
|
open Ast_simplified.Combinators
|
||||||
|
|
||||||
let expect ?options program entry_point input expecter =
|
let expect ?options program entry_point input expecter =
|
||||||
|
@ -1,12 +1,7 @@
|
|||||||
(* open Ligo_helpers.Trace
|
(* open Ligo_helpers.Trace
|
||||||
* open Ligo.Mini_c
|
* open Ligo.Mini_c
|
||||||
* open Combinators
|
* open Combinators *)
|
||||||
* open Test_helpers *)
|
open Test_helpers
|
||||||
|
|
||||||
(*
|
let main = test_suite "Transpiler (from Ast_typed)" [
|
||||||
How should one test the transpiler?
|
|
||||||
I'm doing the dumb thing.
|
|
||||||
*)
|
|
||||||
|
|
||||||
let main = "Transpiler (from Ast_typed)", [
|
|
||||||
]
|
]
|
||||||
|
@ -65,7 +65,7 @@ end
|
|||||||
(* TODO: deep types (e.g. record of record)
|
(* TODO: deep types (e.g. record of record)
|
||||||
TODO: negative tests (expected type error) *)
|
TODO: negative tests (expected type error) *)
|
||||||
|
|
||||||
let main = "Typer (from simplified AST)", [
|
let main = test_suite "Typer (from simplified AST)" [
|
||||||
test "int" int ;
|
test "int" int ;
|
||||||
test "unit" TestExpressions.unit ;
|
test "unit" TestExpressions.unit ;
|
||||||
test "int2" TestExpressions.int ;
|
test "int2" TestExpressions.int ;
|
||||||
|
@ -86,7 +86,6 @@ end
|
|||||||
open Errors
|
open Errors
|
||||||
|
|
||||||
let rec translate_type (t:AST.type_value) : type_value result =
|
let rec translate_type (t:AST.type_value) : type_value result =
|
||||||
trace (simple_info "") @@
|
|
||||||
match t.type_value' with
|
match t.type_value' with
|
||||||
| T_constant ("bool", []) -> ok (T_base Base_bool)
|
| T_constant ("bool", []) -> ok (T_base Base_bool)
|
||||||
| T_constant ("int", []) -> ok (T_base Base_int)
|
| T_constant ("int", []) -> ok (T_base Base_int)
|
||||||
@ -143,23 +142,13 @@ let tuple_access_to_lr : type_value -> type_value list -> int -> (type_value * [
|
|||||||
let node_tv = Append_tree.of_list @@ List.mapi (fun i a -> (i, a)) tys in
|
let node_tv = Append_tree.of_list @@ List.mapi (fun i a -> (i, a)) tys in
|
||||||
let%bind path =
|
let%bind path =
|
||||||
let aux (i , _) = i = ind in
|
let aux (i , _) = i = ind in
|
||||||
trace_option (simple_error "no leaf with given index") @@
|
trace_option (corner_case ~loc:__LOC__ "tuple access leaf") @@
|
||||||
Append_tree.exists_path aux node_tv in
|
Append_tree.exists_path aux node_tv in
|
||||||
let lr_path = List.map (fun b -> if b then `Right else `Left) path in
|
let lr_path = List.map (fun b -> if b then `Right else `Left) path in
|
||||||
let%bind (_ , lst) =
|
let%bind (_ , lst) =
|
||||||
let aux = fun (ty' , acc) cur ->
|
let aux = fun (ty' , acc) cur ->
|
||||||
let%bind (a , b) =
|
let%bind (a , b) =
|
||||||
let error =
|
trace_strong (corner_case ~loc:__LOC__ "tuple access pair") @@
|
||||||
let title () = "expected a pair" in
|
|
||||||
let content () = Format.asprintf "Big: %a.\tGot: %a\tFull path: %a\tSmall path: %a"
|
|
||||||
Mini_c.PP.type_ ty
|
|
||||||
Mini_c.PP.type_ ty'
|
|
||||||
PP_helpers.(list_sep bool (const ".")) path
|
|
||||||
PP_helpers.(list_sep lr (const ".")) (List.map snd acc)
|
|
||||||
in
|
|
||||||
error title content
|
|
||||||
in
|
|
||||||
trace_strong error @@
|
|
||||||
Mini_c.get_t_pair ty' in
|
Mini_c.get_t_pair ty' in
|
||||||
match cur with
|
match cur with
|
||||||
| `Left -> ok (a , acc @ [(a , `Left)])
|
| `Left -> ok (a , acc @ [(a , `Left)])
|
||||||
@ -173,12 +162,14 @@ let record_access_to_lr : type_value -> type_value AST.type_name_map -> string -
|
|||||||
let node_tv = Append_tree.of_list tys in
|
let node_tv = Append_tree.of_list tys in
|
||||||
let%bind path =
|
let%bind path =
|
||||||
let aux (i , _) = i = ind in
|
let aux (i , _) = i = ind in
|
||||||
trace_option (simple_error "no leaf with given index") @@
|
trace_option (corner_case ~loc:__LOC__ "record access leaf") @@
|
||||||
Append_tree.exists_path aux node_tv in
|
Append_tree.exists_path aux node_tv in
|
||||||
let lr_path = List.map (fun b -> if b then `Right else `Left) path in
|
let lr_path = List.map (fun b -> if b then `Right else `Left) path in
|
||||||
let%bind (_ , lst) =
|
let%bind (_ , lst) =
|
||||||
let aux = fun (ty , acc) cur ->
|
let aux = fun (ty , acc) cur ->
|
||||||
let%bind (a , b) = Mini_c.get_t_pair ty in
|
let%bind (a , b) =
|
||||||
|
trace_strong (corner_case ~loc:__LOC__ "recard access pair") @@
|
||||||
|
Mini_c.get_t_pair ty in
|
||||||
match cur with
|
match cur with
|
||||||
| `Left -> ok (a , acc @ [(a , `Left)])
|
| `Left -> ok (a , acc @ [(a , `Left)])
|
||||||
| `Right -> ok (b , acc @ [(b , `Right)] ) in
|
| `Right -> ok (b , acc @ [(b , `Right)] ) in
|
||||||
@ -213,7 +204,6 @@ and transpile_small_environment : AST.small_environment -> Environment.t result
|
|||||||
ok @@ Environment.add (name , tv') prec
|
ok @@ Environment.add (name , tv') prec
|
||||||
in
|
in
|
||||||
let%bind result =
|
let%bind result =
|
||||||
trace (simple_error "transpiling small environment") @@
|
|
||||||
bind_fold_right_list aux Environment.empty x' in
|
bind_fold_right_list aux Environment.empty x' in
|
||||||
ok result
|
ok result
|
||||||
|
|
||||||
@ -246,7 +236,7 @@ and translate_annotated_expression (ae:AST.annotated_expression) : expression re
|
|||||||
| E_literal l -> return @@ E_literal (translate_literal l)
|
| E_literal l -> return @@ E_literal (translate_literal l)
|
||||||
| E_variable name -> (
|
| E_variable name -> (
|
||||||
let%bind ele =
|
let%bind ele =
|
||||||
trace_option (simple_error "name not in environment") @@
|
trace_option (corner_case ~loc:__LOC__ "name not in environment") @@
|
||||||
AST.Environment.get_opt name ae.environment in
|
AST.Environment.get_opt name ae.environment in
|
||||||
let%bind tv = transpile_environment_element_type ele in
|
let%bind tv = transpile_environment_element_type ele in
|
||||||
return ~tv @@ E_variable name
|
return ~tv @@ E_variable name
|
||||||
|
Loading…
Reference in New Issue
Block a user