Nix/tests/functional/lang/eval-okay-regex-split.nix
John Ericson 68c81c7375 Put functional tests in tests/functional
I think it is bad for these reasons when `tests/` contains a mix of
functional and integration tests

 - Concepts is harder to understand, the documentation makes a good
   unit vs functional vs integration distinction, but when the
   integration tests are just two subdirs within `tests/` this is not
   clear.

 - Source filtering in the `flake.nix` is more complex. We need to
   filter out some of the dirs from `tests/`, rather than simply pick
   the dirs we want and take all of them. This is a good sign the
   structure of what we are trying to do is not matching the structure
   of the files.

With this change we have a clean:
```shell-session
$ git show 'HEAD:tests'
tree HEAD:tests

functional/
installer/
nixos/
```
2023-10-06 09:05:56 -04:00

49 lines
1.8 KiB
Nix

with builtins;
# Non capturing regex returns empty lists
assert split "foobar" "foobar" == ["" [] ""];
assert split "fo*" "f" == ["" [] ""];
assert split "fo+" "f" == ["f"];
assert split "fo*" "fo" == ["" [] ""];
assert split "fo*" "foo" == ["" [] ""];
assert split "fo+" "foo" == ["" [] ""];
assert split "fo{1,2}" "foo" == ["" [] ""];
assert split "fo{1,2}" "fooo" == ["" [] "o"];
assert split "fo*" "foobar" == ["" [] "bar"];
# Capturing regex returns a list of sub-matches
assert split "(fo*)" "f" == ["" ["f"] ""];
assert split "(fo+)" "f" == ["f"];
assert split "(fo*)" "fo" == ["" ["fo"] ""];
assert split "(f)(o*)" "f" == ["" ["f" ""] ""];
assert split "(f)(o*)" "foo" == ["" ["f" "oo"] ""];
assert split "(fo+)" "foo" == ["" ["foo"] ""];
assert split "(fo{1,2})" "foo" == ["" ["foo"] ""];
assert split "(fo{1,2})" "fooo" == ["" ["foo"] "o"];
assert split "(fo*)" "foobar" == ["" ["foo"] "bar"];
# Matches are greedy.
assert split "(o+)" "oooofoooo" == ["" ["oooo"] "f" ["oooo"] ""];
# Matches multiple times.
assert split "(b)" "foobarbaz" == ["foo" ["b"] "ar" ["b"] "az"];
# Split large strings containing newlines. null are inserted when a
# pattern within the current did not match anything.
assert split "[[:space:]]+|([',.!?])" ''
Nix Rocks!
That's why I use it.
'' == [
"Nix" [ null ] "Rocks" ["!"] "" [ null ]
"That" ["'"] "s" [ null ] "why" [ null ] "I" [ null ] "use" [ null ] "it" ["."] "" [ null ]
""
];
# Documentation examples
assert split "(a)b" "abc" == [ "" [ "a" ] "c" ];
assert split "([ac])" "abc" == [ "" [ "a" ] "b" [ "c" ] "" ];
assert split "(a)|(c)" "abc" == [ "" [ "a" null ] "b" [ null "c" ] "" ];
assert split "([[:upper:]]+)" " FOO " == [ " " [ "FOO" ] " " ];
true