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

212 lines
5.6 KiB
OCaml

open Import
(* Tests based on description of Perl regular expressions given at
http://www.perl.com/CPAN-local/doc/manual/html/pod/perlre.html *)
let re ?opts s = Format.printf "%a@." Re.pp (Re.Perl.re ?opts s)
let try_parse ?opts s =
try
ignore (Re.Perl.re ?opts s);
print_endline "Prased successfully"
with
| Re.Perl.Parse_error -> print_endline "Parse error"
| Re.Perl.Not_supported -> print_endline "Not supported"
;;
let%expect_test "escaping meta characters" =
re "\\^";
[%expect {| (Set 94) |}];
re "\\.";
[%expect {| (Set 46) |}];
re "\\$";
[%expect {| (Set 36) |}];
re "\\|";
[%expect {| (Set 124) |}];
re "\\(";
[%expect {| (Set 40) |}];
re "\\)";
[%expect {| (Set 41) |}];
re "\\[";
[%expect {| (Set 91) |}];
re "\\]";
[%expect {| (Set 93) |}];
re "\\*";
[%expect {| (Set 42) |}];
re "\\+";
[%expect {| (Set 43) |}];
re "\\?";
[%expect {| (Set 63) |}];
re "\\\\";
[%expect {| (Set 92) |}]
;;
let%expect_test "basic metacharacters" =
re "^";
[%expect {| Beg_of_str |}];
re ".";
[%expect {| (Set 0-9, 11-255) |}];
re "$";
[%expect {| End_of_str |}];
re "a|b";
[%expect {| (Alternative (Set 97)(Set 98)) |}];
re "aa|bb";
[%expect {| (Alternative (Sequence (Set 97)(Set 97))(Sequence (Set 98)(Set 98))) |}];
re "(a)";
[%expect {| (Group (Set 97)) |}];
re "(a|b)c";
[%expect {| (Sequence (Group (Alternative (Set 97)(Set 98)))(Set 99)) |}];
re "[ab]";
[%expect {| (Alternative (Set 98)(Set 97)) |}];
re "[a-z]";
[%expect {| (Set 97-122) |}];
re "[a-z$%.]";
[%expect {| (Alternative (Set 46)(Set 37)(Set 36)(Set 97-122)) |}];
re "[-az]";
[%expect {| (Alternative (Set 122)(Set 97)(Set 45)) |}];
re "[az-]";
[%expect {| (Alternative (Set 122)(Set 45)(Set 97)) |}];
re "[a\\-z]";
[%expect {| (Alternative (Set 122)(Set 45)(Set 97)) |}];
re "[]a]";
[%expect {| (Alternative (Set 97)(Set 93)) |}];
re "[]-]";
[%expect {| (Alternative (Set 93)(Set 45)) |}];
re "[a^]";
[%expect {| (Alternative (Set 94)(Set 97)) |}];
re "[^a-z]";
[%expect {| (Complement (Set 97-122)) |}];
re "[^a-z$]";
[%expect {| (Complement (Set 36)(Set 97-122)) |}];
re "[a-\\sz]";
[%expect {| (Alternative (Set 122)(Set 97)(Set 45)(Set 9-13, 32)) |}]
;;
let%expect_test "greedy quantifiers" =
re "a*";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 0)) |}];
re "a+";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 1)) |}];
re "a?";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 0 1)) |}];
re "a{10}";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 10 10)) |}];
re "a{10,}";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 10)) |}];
re "a{10,12}";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 10 12)) |}]
;;
let%expect_test "non-greedy quantifiers" =
re "a*?";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 0)) |}];
re "a+?";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 1)) |}];
re "a??";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 0 1)) |}];
re "a{10}?";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 10 10)) |}];
re "a{10,}?";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 10)) |}];
re "a{10,12}?";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 10 12)) |}]
;;
let%expect_test "character sets" =
re "\\w";
[%expect
{|
(Alternative
(Set 48-57, 65-90, 97-122, 170, 181, 186, 192-214, 216-246, 248-255)
(Set 95)) |}];
re "\\W";
[%expect
{|
(Complement
(Set 48-57, 65-90, 97-122, 170, 181, 186, 192-214, 216-246, 248-255)
(Set 95)) |}];
re "\\s";
[%expect {| (Set 9-13, 32) |}];
re "\\S";
[%expect {| (Complement (Set 9-13, 32)) |}];
re "\\d";
[%expect {| (Set 48-57) |}];
re "\\D";
[%expect {| (Complement (Set 48-57)) |}]
;;
let%expect_test "zero-width assertions" =
re "\\b";
[%expect {| (Alternative Beg_of_wordEnd_of_word) |}];
re "\\B";
[%expect {| Not_bound |}];
re "\\A";
[%expect {| Beg_of_str |}];
re "\\Z";
[%expect {| Last_end_of_line |}];
re "\\z";
[%expect {| End_of_str |}];
re "\\G";
[%expect {| Start |}]
;;
let%expect_test "options" =
re ~opts:[ `Anchored ] "a";
[%expect {| (Sequence Start(Set 97)) |}];
re ~opts:[ `Caseless ] "b";
[%expect {| (No_case (Set 98)) |}];
re ~opts:[ `Dollar_endonly ] "$";
[%expect {| Last_end_of_line |}];
re ~opts:[ `Dollar_endonly; `Multiline ] "$";
[%expect {| End_of_line |}];
re ~opts:[ `Dotall ] ".";
[%expect {| (Set 0-255) |}];
re ~opts:[ `Multiline ] "^";
[%expect {| Beg_of_line |}];
re ~opts:[ `Multiline ] "$";
[%expect {| End_of_line |}];
re ~opts:[ `Ungreedy ] "a*";
[%expect {| (Sem_greedy Non_greedy (Repeat (Set 97) 0)) |}];
re ~opts:[ `Ungreedy ] "a*?";
[%expect {| (Sem_greedy Greedy (Repeat (Set 97) 0)) |}]
;;
let%expect_test "clustering" =
re "(?:a)";
[%expect {| (Set 97) |}];
re "(?:a|b)c";
[%expect {| (Sequence (Alternative (Set 97)(Set 98))(Set 99)) |}]
;;
let%expect_test "comment" =
re "a(?#comment)b";
[%expect {| (Sequence (Set 97)(Sequence )(Set 98)) |}];
try_parse "(?#";
[%expect {| Parse error |}]
;;
let%expect_test "backrefs" =
try_parse "\\0";
[%expect {| Not supported |}]
;;
let%expect_test "ordinary characters" =
re "a";
[%expect {| (Set 97) |}]
;;
let%expect_test "concacentation" =
re "ab";
[%expect {| (Sequence (Set 97)(Set 98)) |}]
;;
let%expect_test "sets in classes" =
re "[a\\s]";
[%expect {| (Alternative (Set 9-13, 32)(Set 97)) |}]
;;
let%expect_test "fixed bug" =
(try ignore (Re.compile (Re.Perl.re "(.*?)(\\WPl|\\Bpl)(.*)")) with
| _ -> failwith "bug in Re.handle_case");
[%expect {||}]
;;