mte/unikernel/duniverse/ocaml-re/lib_test/expect/test_stream.ml
2025-11-11 02:07:51 +01:00

203 lines
5.4 KiB
OCaml

open Import
module Stream = Re.Stream
let feed t str =
let res = Stream.feed t str ~pos:0 ~len:(String.length str) in
let () =
match res with
| No_match -> Printf.printf "%S did not match\n" str
| Ok s ->
let status =
match Stream.finalize s "" ~pos:0 ~len:0 with
| true -> "matched"
| false -> "unmatched"
in
Printf.printf "%S not matched (status = %s)\n" str status
in
res
;;
let%expect_test "out out of bounds" =
let stream = Re.any |> Re.compile |> Stream.create in
invalid_argument (fun () -> ignore (Stream.feed stream "foo" ~pos:2 ~len:3));
[%expect {| Invalid_argument "index out of bounds" |}];
invalid_argument (fun () -> ignore (Stream.finalize stream "foo" ~pos:2 ~len:3));
[%expect {| Invalid_argument "index out of bounds" |}];
let stream = Stream.Group.create stream in
invalid_argument (fun () -> ignore (Stream.Group.feed stream "foo" ~pos:2 ~len:3));
[%expect {| Invalid_argument "index out of bounds" |}];
invalid_argument (fun () -> ignore (Stream.Group.finalize stream "foo" ~pos:2 ~len:3));
[%expect {| Invalid_argument "index out of bounds" |}]
;;
let%expect_test "basic" =
let s = [ Re.bos; Re.str "abab" ] |> Re.seq |> Re.compile |> Stream.create in
ignore (feed s "x");
[%expect {| "x" did not match |}];
let suffix = "ab" in
let s =
match feed s suffix with
| Ok s -> s
| No_match -> assert false
in
[%expect {|
"ab" not matched (status = unmatched) |}];
(let (_ : _ Stream.feed) = feed s "ab" in
[%expect {|
"ab" not matched (status = matched) |}]);
let (_ : _ Stream.feed) = feed s "xy" in
[%expect {|
"xy" did not match |}]
;;
let%expect_test "eos" =
let s = [ Re.str "zzz"; Re.eos ] |> Re.seq |> Re.compile |> Stream.create in
ignore (feed s "zzz");
[%expect {| "zzz" not matched (status = matched) |}];
let s =
match feed s "z" with
| Ok s -> s
| No_match -> assert false
in
[%expect {| "z" not matched (status = unmatched) |}];
(let str = "zz" in
match Stream.finalize s str ~pos:0 ~len:(String.length str) with
| true -> ()
| false -> assert false);
[%expect {||}]
;;
let%expect_test "finalize empty" =
let s = "abde" in
let stream =
let stream = Re.str s |> Re.whole_string |> Re.compile |> Stream.create in
match feed stream s with
| Ok s -> s
| No_match -> assert false
in
assert (Stream.finalize stream "" ~pos:0 ~len:0);
[%expect {| "abde" not matched (status = matched) |}]
;;
let%expect_test "group - basic" =
let s =
let open Re in
str "foo" |> whole_string |> group |> compile |> Stream.create
in
let g = Stream.Group.create s in
let g =
match Stream.Group.feed g "f" ~pos:0 ~len:1 with
| No_match -> assert false
| Ok s -> s
in
(match Stream.Group.finalize g "oo" ~pos:0 ~len:2 with
| Ok _ -> ()
| No_match -> assert false);
[%expect {| |}]
;;
let pmarks set m =
Printf.printf "mark present %b\n" (Re.Stream.Group.Match.test_mark set m)
;;
let%expect_test "group - mark entire string must match" =
let m1, f = Re.(mark (char 'f')) in
let m2, oo = Re.(mark (str "oo")) in
let re =
let open Re in
[ f; oo ] |> seq |> compile
in
let s = Stream.create re in
let g = Stream.Group.create s in
let g =
match Stream.Group.feed g "f" ~pos:0 ~len:1 with
| No_match -> assert false
| Ok s -> s
in
let g =
match Stream.Group.finalize g "oo" ~pos:0 ~len:2 with
| Ok g -> g
| No_match -> assert false
in
pmarks g m1;
[%expect {| mark present true |}];
pmarks g m2;
[%expect {| mark present true |}]
;;
let%expect_test "group - partial mark match" =
let m, foo = Re.(mark (str "foo")) in
let re = Re.compile foo in
let s = Stream.create re in
let g = Stream.Group.create s in
let g =
match Stream.Group.feed g "xx" ~pos:0 ~len:2 with
| No_match -> assert false
| Ok g -> g
in
let g =
match Stream.Group.feed g "foo" ~pos:0 ~len:3 with
| Ok g -> g
| No_match -> assert false
in
let g =
match Stream.Group.finalize g "garb" ~pos:0 ~len:4 with
| Ok g -> g
| No_match -> assert false
in
pmarks g m;
[%expect {| mark present true |}]
;;
let print_match match_ n =
match Stream.Group.Match.get match_ n with
| None -> Printf.printf "match %d: <not found>\n" n
| Some s -> Printf.printf "match %d: %s\n" n s
;;
let%expect_test "group - match group" =
let stream =
let re = Re.Pcre.re "_([a-z]+)_" |> Re.whole_string |> Re.compile in
Stream.Group.create (Stream.create re)
in
let s = "_abc_" in
let () =
match Stream.Group.finalize stream s ~pos:0 ~len:(String.length s) with
| No_match -> assert false
| Ok m ->
for i = 0 to 1 do
print_match m i
done
in
[%expect {|
match 0: _abc_
match 1: abc
|}]
;;
let%expect_test "group - match group" =
let stream =
let re = Re.Pcre.re "_([a-z]+)__([a-z]+)_" |> Re.whole_string |> Re.compile in
Stream.Group.create (Stream.create re)
in
let s = "_abc_" in
let stream =
match Stream.Group.feed stream s ~pos:0 ~len:(String.length s) with
| No_match -> assert false
| Ok m -> m
in
let s = "_de_" in
let () =
match Stream.Group.finalize stream s ~pos:0 ~len:(String.length s) with
| No_match -> assert false
| Ok m ->
for i = 0 to 2 do
print_match m i
done
in
[%expect {|
match 0: _abc__de_
match 1: abc
match 2: de
|}]
;;