1
|
open Basetypes
|
2
|
open Corelang
|
3
|
open Datatype
|
4
|
open Json_parser
|
5
|
open LustreSpec
|
6
|
open OUnit2
|
7
|
|
8
|
module ParseExt =
|
9
|
struct
|
10
|
let parse_condition _ = Condition.tru
|
11
|
let parse_action _ = Action.nil
|
12
|
let parse_event json = Some Yojson.Basic.(json |> to_string)
|
13
|
end
|
14
|
|
15
|
module Parse = Parser (ParseExt)
|
16
|
|
17
|
let location = Location.dummy_loc
|
18
|
|
19
|
let string_of_var_type var_type =
|
20
|
match var_type with
|
21
|
| Tydec_bool -> "bool"
|
22
|
| Tydec_int -> "int"
|
23
|
| Tydec_real -> "real"
|
24
|
| _ -> "other"
|
25
|
|
26
|
let string_of_var_value value =
|
27
|
match value with
|
28
|
| Expr_const (Const_tag label) -> label
|
29
|
| Expr_const (Const_int v) -> string_of_int v
|
30
|
| Expr_const (Const_real (n, l, s)) -> (Num.string_of_num n) ^
|
31
|
" x 10^-" ^
|
32
|
(string_of_int l) ^
|
33
|
" (" ^ s ^ ")"
|
34
|
| _ -> "other value (not possible)"
|
35
|
|
36
|
let test_var_skeleton var id var_type value =
|
37
|
begin
|
38
|
assert_bool
|
39
|
"orig for user variables should be true"
|
40
|
var.var_orig;
|
41
|
assert_bool
|
42
|
"user variables are considered as constants"
|
43
|
var.var_dec_const;
|
44
|
assert_equal
|
45
|
~msg:("problem with variable " ^ var.var_id ^ " clock type")
|
46
|
Ckdec_any
|
47
|
var.var_dec_clock.ck_dec_desc;
|
48
|
assert_equal
|
49
|
~msg:("problem with variable " ^ var.var_id ^ " ident")
|
50
|
~printer:(fun x -> x)
|
51
|
id
|
52
|
var.var_id;
|
53
|
assert_equal
|
54
|
~msg:("problem with variable " ^ var.var_id ^ " type")
|
55
|
~printer:string_of_var_type
|
56
|
var_type
|
57
|
var.var_dec_type.ty_dec_desc;
|
58
|
match var.var_dec_value with
|
59
|
| Some { expr_desc = d } ->
|
60
|
assert_equal
|
61
|
~msg:("problem with variable " ^ var.var_id ^ " value")
|
62
|
~printer:string_of_var_value
|
63
|
value
|
64
|
d
|
65
|
| _ -> raise (OUnitTest.OUnit_failure
|
66
|
"User variables should have an initial value")
|
67
|
end
|
68
|
|
69
|
let test_simple_var_bool_false tests_ctxt =
|
70
|
let prog = Parse.parse_prog
|
71
|
(Yojson.Basic.from_file "../data-test/simple-var-bool-false.json") in
|
72
|
match prog with
|
73
|
| Program ("simple_var_bool_false", [ ], [ x ]) ->
|
74
|
test_var_skeleton x "my_bool_var_false"
|
75
|
Tydec_bool (Expr_const (Const_tag tag_false))
|
76
|
| _ -> raise (OUnitTest.OUnit_failure
|
77
|
"Program obtained from simple-var-bool-false.json is not correct")
|
78
|
|
79
|
let test_simple_var_bool_true tests_ctxt =
|
80
|
let prog = Parse.parse_prog
|
81
|
(Yojson.Basic.from_file "../data-test/simple-var-bool-true.json") in
|
82
|
match prog with
|
83
|
| Program ("simple_var_bool_true", [ ], [ x ]) ->
|
84
|
test_var_skeleton x "my_bool_var_true"
|
85
|
Tydec_bool (Expr_const (Const_tag tag_true))
|
86
|
| _ -> raise (OUnitTest.OUnit_failure
|
87
|
"Program obtained from simple-var-bool-true.json is not correct")
|
88
|
|
89
|
let test_simple_var_int_zero tests_ctxt =
|
90
|
let prog = Parse.parse_prog
|
91
|
(Yojson.Basic.from_file "../data-test/simple-var-int-zero.json") in
|
92
|
match prog with
|
93
|
| Program ("simple_var_int_zero", [ ], [ x ]) ->
|
94
|
test_var_skeleton x "my_int_var_zero"
|
95
|
Tydec_int (Expr_const (Const_int 0))
|
96
|
| _ -> raise (OUnitTest.OUnit_failure
|
97
|
"Program obtained from simple-var-int-zero.json is not correct")
|
98
|
|
99
|
let test_simple_var_int_pos tests_ctxt =
|
100
|
let prog = Parse.parse_prog
|
101
|
(Yojson.Basic.from_file "../data-test/simple-var-int-pos.json") in
|
102
|
match prog with
|
103
|
| Program ("simple_var_int_pos", [ ], [ x ]) ->
|
104
|
test_var_skeleton x "my_int_var_pos"
|
105
|
Tydec_int (Expr_const (Const_int 2))
|
106
|
| _ -> raise (OUnitTest.OUnit_failure
|
107
|
"Program obtained from simple-var-int-pos.json is not correct")
|
108
|
|
109
|
let test_simple_var_int_neg tests_ctxt =
|
110
|
let prog = Parse.parse_prog
|
111
|
(Yojson.Basic.from_file "../data-test/simple-var-int-neg.json") in
|
112
|
match prog with
|
113
|
| Program ("simple_var_int_neg", [ ], [ x ]) ->
|
114
|
test_var_skeleton x "my_int_var_neg"
|
115
|
Tydec_int (Expr_const (Const_int (-5)))
|
116
|
| _ -> raise (OUnitTest.OUnit_failure
|
117
|
"Program obtained from simple-var-int-neg.json is not correct")
|
118
|
|
119
|
let test_simple_var_real_zero tests_ctxt =
|
120
|
let prog = Parse.parse_prog
|
121
|
(Yojson.Basic.from_file "../data-test/simple-var-real-zero.json") in
|
122
|
match prog with
|
123
|
| Program ("simple_var_real_zero", [ ], [ x ]) ->
|
124
|
test_var_skeleton x "my_real_var_zero"
|
125
|
Tydec_real (Expr_const (Const_real (Num.num_of_int 0, 1, "0.0")))
|
126
|
| _ -> raise (OUnitTest.OUnit_failure
|
127
|
"Program obtained from simple-var-real-zero.json is not correct")
|
128
|
|
129
|
let test_simple_var_real_pos tests_ctxt =
|
130
|
let prog = Parse.parse_prog
|
131
|
(Yojson.Basic.from_file "../data-test/simple-var-real-pos.json") in
|
132
|
match prog with
|
133
|
| Program ("simple_var_real_pos", [ ], [ x ]) ->
|
134
|
test_var_skeleton x "my_real_var_pos"
|
135
|
Tydec_real (Expr_const (Const_real (Num.num_of_int 2115, 2, "21.15")))
|
136
|
| _ -> raise (OUnitTest.OUnit_failure
|
137
|
"Program obtained from simple-var-real-pos.json is not correct")
|
138
|
|
139
|
let test_simple_var_real_neg tests_ctxt =
|
140
|
let prog = Parse.parse_prog
|
141
|
(Yojson.Basic.from_file "../data-test/simple-var-real-neg.json") in
|
142
|
match prog with
|
143
|
| Program ("simple_var_real_neg", [ ], [ x ]) ->
|
144
|
test_var_skeleton x "my_real_var_neg"
|
145
|
Tydec_real (Expr_const (Const_real (Num.num_of_int (-224), 2, "-2.24")))
|
146
|
| _ -> raise (OUnitTest.OUnit_failure
|
147
|
"Program obtained from simple-var-real-neg.json is not correct")
|
148
|
|
149
|
let test_simple_var_real_e tests_ctxt =
|
150
|
let prog = Parse.parse_prog
|
151
|
(Yojson.Basic.from_file "../data-test/simple-var-real-e.json") in
|
152
|
match prog with
|
153
|
| Program ("simple_var_real_e", [ ], [ x ]) ->
|
154
|
test_var_skeleton x "my_real_var_e"
|
155
|
Tydec_real (Expr_const (Const_real (Num.num_of_int (-2115), 4, "-21.15e-02")))
|
156
|
| _ -> raise (OUnitTest.OUnit_failure
|
157
|
"Program obtained from simple-var-real-e.json is not correct")
|
158
|
|
159
|
let test_simple_var_real_wo_dec tests_ctxt =
|
160
|
assert_raises (Parse.JSON_parse_error("Invalid real constant 2500"))
|
161
|
(fun _ -> Parse.parse_prog (Yojson.Basic.from_file
|
162
|
"../data-test/simple-var-real-wo-dec.json"))
|
163
|
|
164
|
let var_suite =
|
165
|
"suite for variables" >:::
|
166
|
[ "simple test for variable (boolean, false)" >::
|
167
|
test_simple_var_bool_false;
|
168
|
"simple test for variable (boolean, true)" >::
|
169
|
test_simple_var_bool_true;
|
170
|
"simple test for variable (int, 0)" >::
|
171
|
test_simple_var_int_zero;
|
172
|
"simple test for variable (int, 2)" >::
|
173
|
test_simple_var_int_pos;
|
174
|
"simple test for variable (int, -5)" >::
|
175
|
test_simple_var_int_neg;
|
176
|
"simple test for variable (real, 0.0)" >::
|
177
|
test_simple_var_real_zero;
|
178
|
"simple test for variable (real, 21.15)" >::
|
179
|
test_simple_var_real_pos;
|
180
|
"simple test for variable (real, -2.24)" >::
|
181
|
test_simple_var_real_neg;
|
182
|
"simple test for variable (real, -21.15e-02)" >::
|
183
|
test_simple_var_real_e;
|
184
|
"simple test for variable (real, 2500)" >::
|
185
|
test_simple_var_real_wo_dec;
|
186
|
]
|
187
|
|
188
|
let _ =
|
189
|
run_test_tt_main var_suite
|