4
let dels (s:string) = del s s
6
(************************************************************************
8
*************************************************************************)
10
(* Simplest square lens *)
12
let sqr0 = [ square "x" s ] *
13
test sqr0 get "xyxxyxxyx" = { "x" = "y" }{ "x" = "y" }{ "x" = "y" }
14
test sqr0 put "xyx" after set "/x[3]" "z" = "xyxxzx"
16
(* test mismatch tag *)
17
test sqr0 get "xya" = *
19
(* Test regular expression matching with multiple groups *)
20
let body = del /([f]+)([f]+)/ "ff" . del /([g]+)([g]+)/ "gg"
21
let sqr1 = [ square /([a-b]*)([a-b]*)([a-b]*)/ body . del /([x]+)([x]+)/ "xx" ] *
23
test sqr1 get "aaffggaaxxbbffggbbxx" = { "aa" }{ "bb" }
24
test sqr1 get "affggaxx" = { "a" }
25
test sqr1 put "affggaxx" after clear "/b" = "affggaxxbffggbxx"
27
(* Test XML like elements up to depth 2 *)
28
let b = del ">" ">" . del /[a-z ]*/ "" . del "</" "</"
29
let xml = [ del "<" "<" . square /[a-z]+/ b . del ">" ">" ] *
31
let b2 = del ">" ">" . xml . del "</" "</"
32
let xml2 = [ del "<" "<" . square /[a-z]+/ b2 . del ">" ">" ] *
34
test xml get "<a></a><b></b>" = { "a" }{ "b" }
36
(* test error on mismatch tag *)
37
test xml get "<a></a><b></c>" = *
39
(* test get nested tags of depth 2 *)
40
test xml2 get "<a><b></b><c></c></a>" =
46
(* test nested put of depth 2 *)
47
test xml2 put "<a></a>" after clear "/x/y" = "<a></a><x><y></y></x>"
49
(* test nested put of depth 3 : should fail *)
50
test xml2 put "<a></a>" after clear "/x/y/z" = *
52
(************************************************************************
53
* Recursive square lens
54
*************************************************************************)
57
let xml_element (body:lens) =
58
let g = del ">" ">" . body . del "</" "</" in
59
[ del "<" "<" . square /[a-z]+/ g . del ">" ">" ] *
61
let rec xml_rec = xml_element xml_rec
63
test xml_rec get "<a><b><c><d><e></e></d></c></b></a>" =
74
test xml_rec get "<a><b></b><c></c><d></d><e></e></a>" =
82
test xml_rec put "<a></a><b><c></c></b>" after clear "/x/y/z" = "<a></a><b><c></c></b><x><y><z></z></y></x>"
85
test xml_rec get "<a></c>" = *
86
test xml_rec get "<a><b></b></c>" = *
87
test xml_rec get "<a><b></c></a>" = *
89
(* test ctype_nullable and typecheck *)
90
let rec z = [ square "ab" z? ]
91
test z get "abab" = { "ab" }
93
(* test tip handling when using store inside body *)
95
let sto = store "c" . body* in
100
test cc get "abcabcabab" =
105
(* test correct put behavior *)
106
let input3 = "aaxyxbbaaaxyxbb"
108
let sqr3 = [ del /[a]*/ "a" . square /[x]/ b3 . del /[b]*/ "b" ]*
109
test sqr3 get input3 = { "x" }{ "x" }
110
test sqr3 put input3 after clear "/x[1]" = input3
113
let rec sqr4 = [ del /[a]+/ "a" . square /[b]|[c]/ (b4|sqr4) ]
114
test sqr4 put "aabaaacxcb" after rm "x" = "aabaaacxcb"