aboutsummaryrefslogtreecommitdiff
path: root/rego-proofs/compiler/test/compiler.ml
blob: 741ae3a67a403d79c498c010e39a0d13ba637113 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
open Core
open Compiler
open Compiler__

module To_test = struct
  let extract_variables = Compiler.extract_variables_wrapper
  let transform_ref_head = Compiler.transform_rule_with_ref_head
  let fmt = Lean.fmt_lean_expression
end

let strings =
  Alcotest.testable
    (Format.pp_print_list Format.pp_print_string)
    (List.equal String.equal)

let extract_query policy =
  match Ast.ast_of_string policy with
  | { policy = [ { body; _ } ]; _ } -> body
  | _ -> failwith "failed to parse"

let test_local_extraction_simple_1 () =
  let policy_code = {|
package test

q {
  x := 2
}
  |} in
  let { bound; _ } = To_test.extract_variables (extract_query policy_code) in
  Alcotest.(check strings)
    "expected identifier list" [ "x" ] bound

let test_local_extraction_simple_2 () =
  let policy_code = {|
package test

q {
  x := 2
  y := 3
  z := 4
}
  |} in
  let { bound; _ } = To_test.extract_variables (extract_query policy_code) in
  Alcotest.(check strings)
    "expected identifier list" [ "x"; "y"; "z" ] bound

let test_local_dependent_on_previously_defined_local () =
  let policy_code = {|
package test

q {
  x := 2
  y := x
}
  |} in
  let { bound; _ } = To_test.extract_variables (extract_query policy_code) in
  Alcotest.(check strings)
    "expected identifier list" [ "x"; "y" ] bound

let test_free_extraction_simple_1 () =
  let policy_code = {|
package test

q {
  y := 7
  y == 8
}
  |} in
  let { free; bound; _ } = To_test.extract_variables (extract_query policy_code) in
  Alcotest.(check strings)
    "expected identifier list" [] free;
  Alcotest.(check strings)
    "expected identifier list" [ "y" ] bound

let test_free_extraction_simple_2 () =
  let policy_code = {|
package test

q {
  y := z
  z = 7
}
  |} in
  let { free; bound; _ } = To_test.extract_variables (extract_query policy_code) in
  Alcotest.(check strings)
    "expected identifier list" [ "z" ] free;
  Alcotest.(check strings)
    "expected identifier list" [ "y" ] bound

let test_identifier () =
  let open Lean in
  let ast = Identifier "test" in
  Alcotest.(check string) "expected string" "test" (To_test.fmt ast)

let test_transform_simple_1 () =
  let open Ast in
  let rule = { head = ((Var "fruit", [Var "apple"; Var "seeds"]), Assignment (Assign, (Scalar (Number 12.))));
               default = false;
               body = [Expr (Term (Scalar (Bool true)), None)];
               otherwise = None } in
  Alcotest.(check int) "expected rules"
    2
    (To_test.transform_ref_head rule |> List.length)

let () =
  let open Alcotest in
  run "Compiler"
    [
      ( "free variable extraction",
        [
          test_case "free variable extraction simple (1)" `Quick
            test_free_extraction_simple_1;
          test_case "free variable extraction simple (2)" `Quick
            test_free_extraction_simple_2;
        ] );
      ( "local extraction",
        [
          test_case "local extraction simple (1)" `Quick
            test_local_extraction_simple_1;
          test_case "local extraction simple (2)" `Quick
            test_local_extraction_simple_2;
          test_case
            "local extraction with local dependent on previously-defined local \
             (1)"
            `Quick test_local_dependent_on_previously_defined_local
        ] );
      ( "nested definitions",
        [
          test_case "local nested definitions (1)" `Quick
            test_transform_simple_1;
        ] ) ;
      ( "ast formatting ",
        [ test_case "identifier compilation" `Quick test_identifier ] );
    ]

© 2015 - 2026 Jakob L. Kreuze