aboutsummaryrefslogtreecommitdiff
path: root/tests/expression_type_of.ml
blob: 706b3e7bfb0aa8b652e9eea6e35714947c8eeb11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
open OUnit2
module T = ImportExpression.T
module Types = ImportDataTypes.Types
module Expr = Expression_builder
module M = Expr.Make (ImportExpression.Type_of)

let eval = M.eval ~path_repr:(fun _ -> ())
let printer = Types.string_of_t
let test_expr expr = ImportExpression.Type_of.observe expr

let empty =
  "empty" >:: fun _ ->
  let expr = eval Expr.empty in
  let content = test_expr expr and expected = Types.None in

  assert_equal ~printer expected content

(** Control an if statement with a predicate which is not a boolean *)
let invalid_if =
  "invalid_if" >:: fun _ ->
  (* The expression we want to test *)
  let raw_expr =
    Expr.if_ Expr.literal_test Expr.integer_zero Expr.integer_one
  in

  let exn =
    ImportErrors.TypeError
      {
        expected = Types.Bool;
        actual = Types.String;
        expression = ImportExpression.Repr.repr Fun.id raw_expr;
        subset = "the predicate";
      }
  in
  assert_raises exn (fun () ->
      let expr = eval raw_expr in
      test_expr expr)

(** The application should infer that the expression is a string *)
let valid_if =
  "valid_if" >:: fun _ ->
  let expr =
    eval
    @@ Expr.if_
         (Expr.equal Expr.integer_one Expr.integer_zero)
         Expr.literal_test Expr.literal_test
  in
  let content = test_expr expr and expected = Types.String in
  assert_equal ~printer expected content

let upper =
  "upper" >:: fun _ ->
      let expr = eval @@ Expr.function' T.Upper [Expr.literal_test] in

  let content = test_expr expr and expected = Types.String in
  assert_equal ~printer expected content

let in_int =
  "in_int" >:: fun _ ->
  let expr = eval @@ Expr.in_ (Expr.path "external") [ Expr.integer_one ] in
  let content = test_expr expr and expected = Types.Bool in
  assert_equal ~printer expected content

let tests = "expression_type_of" >::: [ empty; invalid_if; valid_if; in_int ;
upper ]