70 lines
2.1 KiB
OCaml
70 lines
2.1 KiB
OCaml
|
|
open Import
|
||
|
|
|
||
|
|
let t re s =
|
||
|
|
let re = Re.compile re in
|
||
|
|
let res = Re.exec_partial re s in
|
||
|
|
Format.printf
|
||
|
|
"`%s@."
|
||
|
|
(match res with
|
||
|
|
| `Partial -> "Partial"
|
||
|
|
| `Full -> "Full"
|
||
|
|
| `Mismatch -> "Mismatch")
|
||
|
|
;;
|
||
|
|
|
||
|
|
let%expect_test "partial matches" =
|
||
|
|
let open Re in
|
||
|
|
t (str "hello") "he";
|
||
|
|
[%expect {| `Partial |}];
|
||
|
|
t (str "hello") "goodbye";
|
||
|
|
[%expect {| `Partial |}];
|
||
|
|
(* exec_partial 3 should be `Full *)
|
||
|
|
t (str "hello") "hello";
|
||
|
|
[%expect {| `Partial |}];
|
||
|
|
t (whole_string (str "hello")) "hello";
|
||
|
|
[%expect {| `Partial |}];
|
||
|
|
t (whole_string (str "hello")) "goodbye";
|
||
|
|
[%expect {| `Mismatch |}];
|
||
|
|
t (str "hello") "";
|
||
|
|
[%expect {| `Partial |}];
|
||
|
|
t (str "") "hello";
|
||
|
|
[%expect {| `Full |}];
|
||
|
|
t (whole_string (str "hello")) "";
|
||
|
|
[%expect {| `Partial |}]
|
||
|
|
;;
|
||
|
|
|
||
|
|
let t = exec_partial_detailed
|
||
|
|
|
||
|
|
let%expect_test "partial detailed" =
|
||
|
|
let open Re in
|
||
|
|
t (str "hello") "he";
|
||
|
|
[%expect {| `Partial 0 |}];
|
||
|
|
(* Because of how the matching engine currently works, situations where
|
||
|
|
the entirety of the input string cannot be a match like the test below
|
||
|
|
actually return the last character as a potential start instead of just
|
||
|
|
return `Partial (String.length input). This is still fine however as
|
||
|
|
it still respects the mli contract, as no match could start before
|
||
|
|
the given position, and is fine in practice as testing an extra
|
||
|
|
character on extra input doesn't add much more in terms of workload.
|
||
|
|
*)
|
||
|
|
t (str "hello") "goodbye";
|
||
|
|
[%expect {| `Partial 6 |}];
|
||
|
|
t (str "hello") "hello";
|
||
|
|
[%expect {| `Full [|0,5,"hello"|] |}];
|
||
|
|
t (whole_string (str "hello")) "hello";
|
||
|
|
[%expect {| `Full [|0,5,"hello"|] |}];
|
||
|
|
t (whole_string (str "hello")) "goodbye";
|
||
|
|
[%expect {| `Mismatch |}];
|
||
|
|
t (str "hello") "";
|
||
|
|
[%expect {| `Partial 0 |}];
|
||
|
|
t (str "") "hello";
|
||
|
|
[%expect {| `Full [|0,0,""|] |}];
|
||
|
|
t (whole_string (str "hello")) "";
|
||
|
|
[%expect {| `Partial 0 |}];
|
||
|
|
t (str "abc") ".ab.ab";
|
||
|
|
[%expect {| `Partial 4 |}];
|
||
|
|
t ~pos:1 (seq [ not_boundary; str "b" ]) "ab";
|
||
|
|
[%expect {| `Full [|1,2,"b"|] |}];
|
||
|
|
t (seq [ group (str "a"); rep any; group (str "b") ]) ".acb.";
|
||
|
|
[%expect {| `Full [|1,4,"acb";1,2,"a";3,4,"b"|] |}]
|
||
|
|
;;
|