Blame tests/modules/pass_square_rec.aug

Packit Service a2ae7a
module Pass_square_rec =
Packit Service a2ae7a
Packit Service a2ae7a
(*  Utilities lens *)
Packit Service a2ae7a
let dels (s:string) = del s s
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 *                        Recursive square lens
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
(* test square with left and right as dels *)
Packit Service a2ae7a
let lr (body:lens) =
Packit Service a2ae7a
    let k = key "c" . body* in
Packit Service a2ae7a
    let d = dels "ab" in
Packit Service a2ae7a
        [ square d k d ]
Packit Service a2ae7a
Packit Service a2ae7a
let rec lr2 = lr lr2
Packit Service a2ae7a
Packit Service a2ae7a
test lr2 get "abcabcabab" =
Packit Service a2ae7a
  { "c"
Packit Service a2ae7a
    { "c" }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
let open_tag = key /[a-z]+/
Packit Service a2ae7a
let close_tag = del /[a-z]+/ "a"
Packit Service a2ae7a
Packit Service a2ae7a
(* Basic element *)
Packit Service a2ae7a
let xml_element (body:lens) =
Packit Service a2ae7a
    let g = del ">" ">" . body . del "</" "</" in
Packit Service a2ae7a
        [ del "<" "<" . square open_tag g close_tag . del ">" ">" ] *
Packit Service a2ae7a
Packit Service a2ae7a
let rec xml_rec = xml_element xml_rec
Packit Service a2ae7a
Packit Service a2ae7a
test xml_rec get "<c><d><e></e></d></c>" =
Packit Service a2ae7a
  { "a"
Packit Service a2ae7a
    { "b"
Packit Service a2ae7a
      { "c"
Packit Service a2ae7a
        { "d"
Packit Service a2ae7a
          { "e" }
Packit Service a2ae7a
        }
Packit Service a2ae7a
      }
Packit Service a2ae7a
    }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
test xml_rec get "<c></c><d></d><e></e>" =
Packit Service a2ae7a
  { "a"
Packit Service a2ae7a
    { "b" }
Packit Service a2ae7a
    { "c" }
Packit Service a2ae7a
    { "d" }
Packit Service a2ae7a
    { "e" }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
test xml_rec put "<c></c>" after clear "/x/y/z" = "<c></c><x><y><z></z></y></x>"
Packit Service a2ae7a
Packit Service a2ae7a
(* mismatch tag *)
Packit Service a2ae7a
test xml_rec get "</c>" = *
Packit Service a2ae7a
test xml_rec get "</c>" = *
Packit Service a2ae7a
test xml_rec get "</c>" = *
Packit Service a2ae7a
Packit Service a2ae7a
Packit Service a2ae7a
(* test ctype_nullable and typecheck *)
Packit Service a2ae7a
let rec z =
Packit Service a2ae7a
	let k = key "ab" in
Packit Service a2ae7a
	let d = dels "ab" in
Packit Service a2ae7a
	[ square k z? d ]
Packit Service a2ae7a
test z get "abab" = { "ab" }
Packit Service a2ae7a
Packit Service a2ae7a
(* test tip handling when using store inside body *)
Packit Service a2ae7a
let c (body:lens) =
Packit Service a2ae7a
    let sto = store "c" . body* in
Packit Service a2ae7a
    let d = dels "ab" in
Packit Service a2ae7a
    let k = key "ab" in
Packit Service a2ae7a
        [ square k sto d ]
Packit Service a2ae7a
Packit Service a2ae7a
let rec cc = c cc
Packit Service a2ae7a
Packit Service a2ae7a
test cc get "abcabcabab" =
Packit Service a2ae7a
  { "ab" = "c"
Packit Service a2ae7a
    { "ab" = "c" }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
(* test mixing regular and recursive lenses *)
Packit Service a2ae7a
Packit Service a2ae7a
let reg1 =
Packit Service a2ae7a
	let k = key "y" in
Packit Service a2ae7a
	let d = dels "y" in
Packit Service a2ae7a
	let e = dels "" in
Packit Service a2ae7a
	[ square k e d ]
Packit Service a2ae7a
Packit Service a2ae7a
let reg2 =
Packit Service a2ae7a
	let k = key "y" in
Packit Service a2ae7a
	let d = dels "y" in
Packit Service a2ae7a
	[ square k reg1 d ]
Packit Service a2ae7a
Packit Service a2ae7a
let rec rec2 =
Packit Service a2ae7a
	let d1 = dels "x" in
Packit Service a2ae7a
	let k1 = key "x" in
Packit Service a2ae7a
	let body = reg2 | rec2 in
Packit Service a2ae7a
	[ square k1 body d1 ]?
Packit Service a2ae7a
Packit Service a2ae7a
test rec2 get "xyyyyx" =
Packit Service a2ae7a
  { "x"
Packit Service a2ae7a
    { "y"
Packit Service a2ae7a
      { "y" }
Packit Service a2ae7a
    }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
test rec2 put "" after clear "/x/y/y" = "xyyyyx"
Packit Service a2ae7a
Packit Service a2ae7a
(* test correct put behavior *)
Packit Service a2ae7a
let input3 = "aaxyxbbaaaxyxbb"
Packit Service a2ae7a
let b3 = dels "y"
Packit Service a2ae7a
let sqr3 =
Packit Service a2ae7a
	let k = key /[x]/ in
Packit Service a2ae7a
	let d = dels "x" in
Packit Service a2ae7a
	[ del /[a]*/ "a" . square k b3 d . del /[b]*/ "b" ]*
Packit Service a2ae7a
test sqr3 get input3 = { "x" }{ "x" }
Packit Service a2ae7a
test sqr3 put input3 after clear "/x[1]" = input3
Packit Service a2ae7a
Packit Service a2ae7a
let b4 = dels "x"
Packit Service a2ae7a
let rec sqr4 =
Packit Service a2ae7a
	let k = key /[b]|[c]/ in
Packit Service a2ae7a
	let d = del /[b]|[c]/ "b" in
Packit Service a2ae7a
	[ del /[a]+/ "a" . square k (b4|sqr4) d ]
Packit Service a2ae7a
test sqr4 put "aabaaacxcb" after rm "x" = "aabaaacxcb"
Packit Service a2ae7a
Packit Service a2ae7a
(* test concat multiple squares *)
Packit Service a2ae7a
let rex = /[a-z]/
Packit Service a2ae7a
let rec csqr =
Packit Service a2ae7a
	let k = key rex in
Packit Service a2ae7a
	let d = del rex "a" in
Packit Service a2ae7a
	let e = dels "" in
Packit Service a2ae7a
	[ square k e d . csqr* . square d e d ]
Packit Service a2ae7a
Packit Service a2ae7a
test csqr get "aabbccdd" =
Packit Service a2ae7a
  { "a"
Packit Service a2ae7a
    { "b" }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
test csqr put "aabbccdd" after clear "/a" = "aabbccdd"
Packit Service a2ae7a
test csqr put "aabb" after clear "/a/z" = "aazzaabb"