-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse_tests.ml
72 lines (65 loc) · 2 KB
/
parse_tests.ml
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
open Utils
open Parse
open Unparse
let normalize =
Str.global_replace (Str.regexp " ") ""
>> Str.global_replace (Str.regexp "1len") "len"
let is_equivalent input output =
String.equal
(normalize input)
(normalize output)
let parse_then_print input =
print_endline ("Parsing '" ^ input ^ "'.");
match parse refine input with
| Ok r ->
let output =
srefine r
in
print_endline
("Parse success: " ^ output);
print_endline
("Is equivalent? " ^ string_of_bool (is_equivalent input output))
| Error msg ->
print_endline ("!!! Parse failure: " ^ msg)
let test_parse_roundtrip input =
parse refine input
|> Result.map (srefine >> is_equivalent input)
|> Result.value ~default:false
let parser_tests =
[ "_|_"
; "<>"
; "<> + <> + [<>]"
; "<a:<>, b : <>, c : <>>"
; "<a:<>, b : <>, c : <>> + <>"
; "{ [< a : _|_ >] | T }"
; "{ <> | F }"
; "{ <> | T }"
; "{ <> | T V F}"
; "{ <> | T V F V F}"
; "{ <> | 4len val <= 3len val }"
; "{ <> | 4len val <= 3len val V T }"
; "{ <> | 2len val + 3len val <= 4len val }"
; "{ <> | 2len val <= 3len val + 4len val }"
; "{ <> | T V 1len val <= 1len val }"
; "{ <> | 1len val <= 1len val V T }"
; "{ <> | 4len val + 2len val.x.myPath <= 23len val.zzz V T }"
; "{ <> | match(Left T) }"
; "{ <> | match(Left match(Right F)) }"
; "{ <> | match(Left match(Right F)) }"
; "{ <> | match(<x ~ F, y ~ match(Right T)>) }"
; "{ <> | 1len val <= 1len val}"
; "{ <> | 4 + 1len val <= 1len val}"
; "{ <> | 1len val <= 2 + 1len val}"
; "{ <> | 8 + 1len val <= 2 + 1len val}"
; "{ <> | 8 + len val + 4len val <= 2 + 2len val + len val.zz}"
; "{ <> | 1 <= 2 }"
; "{ <> | 3len val <= 2 + 2len val }"
; "{ <> | len val + 5len val <= 2len val }"
; "{ <> | 3len val <= 0 }"
; "{ <> | 1 <= 0 }"
]
let () =
List.iter parse_then_print parser_tests;
print_endline @@
"Pass all parser tests? "
^ string_of_bool (List.for_all test_parse_roundtrip parser_tests)