| """unit tests for glob_match""" | |
| load("@bazel_skylib//lib:partial.bzl", "partial") | |
| load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") | |
| load("//lib:glob_match.bzl", "glob_match", "is_glob") | |
| def _glob_match_test(ctx, expr, matches, non_matches, mps_matches = None, mps_non_matches = None): | |
| """`mps sands for `match path segment` | |
| """ | |
| env = unittest.begin(ctx) | |
| if mps_matches == None: | |
| mps_matches = matches | |
| if mps_non_matches == None: | |
| mps_non_matches = non_matches | |
| for path in matches: | |
| asserts.equals(env, True, glob_match(expr, path), "Expected expr '{}' to match on path '{}'".format(expr, path)) | |
| for path in non_matches: | |
| asserts.equals(env, False, glob_match(expr, path), "Expected expr '{}' to _not_ match on path '{}'".format(expr, path)) | |
| for path in mps_matches: | |
| asserts.equals(env, True, glob_match(expr, path, match_path_separator = True), "Expected expr '{}' with match_path_separator to match on path '{}'".format(expr, path)) | |
| for path in mps_non_matches: | |
| asserts.equals(env, False, glob_match(expr, path, match_path_separator = True), "Expected expr '{}' with match_path_separator to _not_ match on path '{}'".format(expr, path)) | |
| return unittest.end(env) | |
| def _basic(ctx): | |
| env = unittest.begin(ctx) | |
| asserts.equals(env, True, glob_match("a", "a"), "single directory") | |
| asserts.equals(env, True, glob_match("a/", "a/"), "trailing slash single directory") | |
| asserts.equals(env, True, glob_match("/a", "/a"), "leading slash single directory") | |
| asserts.equals(env, True, glob_match("/a/", "/a/"), "leading slash and trailing slash single directory") | |
| asserts.equals(env, True, glob_match("a/b", "a/b"), "nested directory") | |
| asserts.equals(env, True, glob_match("a/b/", "a/b/"), "trailing slash nested directory") | |
| asserts.equals(env, True, glob_match("/a/b", "/a/b"), "leading slash nested directory") | |
| asserts.equals(env, True, glob_match("/a/b/", "/a/b/"), "leading and trailing slash nested directory") | |
| return unittest.end(env) | |
| basic_test = unittest.make(_basic) | |
| def _star(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "*", | |
| matches = ["express"], | |
| non_matches = ["@eslint/plugin-foo"], | |
| mps_matches = ["express", "@eslint/plugin-foo"], | |
| mps_non_matches = [], | |
| ) | |
| star_test = unittest.make(_star) | |
| def _trailing_star(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "x/*", | |
| matches = ["x/y", "x/y.z"], | |
| non_matches = ["x", "x/y/z"], | |
| mps_matches = ["x/y/z"], | |
| mps_non_matches = ["x"], | |
| ) | |
| trailing_star_test = unittest.make(_trailing_star) | |
| def _globstar(ctx): | |
| return _glob_match_test(ctx, "**", ["@eslint/plugin-foo", "express"], []) | |
| globstar_test = unittest.make(_globstar) | |
| def _globstar_slash(ctx): | |
| return _glob_match_test(ctx, "**/*", ["@eslint/plugin-foo", "express"], []) | |
| globstar_slash_test = unittest.make(_globstar_slash) | |
| def _qmark(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "?", | |
| matches = ["a", "b"], | |
| non_matches = ["/", "aa", "bb"], | |
| mps_matches = ["a", "b", "/"], | |
| mps_non_matches = ["aa", "bb"], | |
| ) | |
| qmark_test = unittest.make(_qmark) | |
| def _qmark_qmark(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "??", | |
| matches = ["aa", "ba"], | |
| non_matches = ["/", "a", "b"], | |
| ) | |
| qmark_qmark_test = unittest.make(_qmark_qmark) | |
| def _wrapped_qmark(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "f?n", | |
| matches = ["fun", "fin"], | |
| non_matches = ["funny", "fit", "bob", "f/n"], | |
| mps_matches = ["fun", "fin", "f/n"], | |
| mps_non_matches = ["funny", "fit", "bob"], | |
| ) | |
| wrapped_qmark_test = unittest.make(_wrapped_qmark) | |
| def _mixed_wrapped_qmark(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "f?n*", | |
| matches = ["fun", "fin", "funny"], | |
| non_matches = ["fit", "bob", "f/n", "f/n/uny"], | |
| mps_matches = ["fun", "fin", "f/n", "funny", "f/n/uny"], | |
| mps_non_matches = ["fit", "bob"], | |
| ) | |
| mixed_wrapped_qmark_test = unittest.make(_mixed_wrapped_qmark) | |
| def _leading_star_test(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "*/foo.*", | |
| matches = ["fum/foo.x", "a/foo.bcd"], | |
| non_matches = ["foo.x", "a/b/foo.x", "a/foo"], | |
| mps_matches = ["fum/foo.x", "a/b/foo.x", "a/foo.bcd"], | |
| mps_non_matches = ["foo.x", "a/foo"], | |
| ) | |
| leading_star_test = unittest.make(_leading_star_test) | |
| def _ending_star(ctx): | |
| return _glob_match_test(ctx, "eslint-*", ["eslint-plugin-foo"], ["@eslint/plugin-foo", "express", "eslint", "-eslint"]) | |
| ending_star_test = unittest.make(_ending_star) | |
| def _wrapping_star(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "*plugin*", | |
| matches = ["eslint-plugin-foo"], | |
| non_matches = ["@eslint/plugin-foo", "express"], | |
| mps_matches = ["eslint-plugin-foo", "@eslint/plugin-foo"], | |
| mps_non_matches = ["express"], | |
| ) | |
| wrapping_star_test = unittest.make(_wrapping_star) | |
| def _wrapped_star(ctx): | |
| return _glob_match_test(ctx, "a*c", ["ac", "abc", "accc", "acacac", "a1234c", "a12c34c"], ["abcd"]) | |
| wrapped_star_test = unittest.make(_wrapped_star) | |
| def _starting_star(ctx): | |
| return _glob_match_test(ctx, "*-positive", ["is-positive"], ["is-positive-not"]) | |
| starting_star_test = unittest.make(_starting_star) | |
| def _mixed_trailing_globstar(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "foo*/**", | |
| matches = ["foo/fum/bar", "foostar/fum/bar", "foo/a", "foob/c", "foo/", "fooa/"], | |
| non_matches = ["fo/fum/bar", "fostar/fum/bar", "foo", "foostar", "afoo", "b/foo/c"], | |
| ) | |
| mixed_trailing_globstar_test = unittest.make(_mixed_trailing_globstar) | |
| def _mixed_leading_globstar(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "**/foo*", | |
| matches = ["fum/bar/foo", "fum/bar/foostar", "foo", "foostar", "as/foo"], | |
| non_matches = ["fum/bar/fo", "fum/bar/fostar"], | |
| ) | |
| mixed_leading_globstar_test = unittest.make(_mixed_leading_globstar) | |
| def _mixed_leading_globstar2(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "**/*foo", | |
| matches = ["fum/bar/foo", "fum/bar/starfoo", "foo", "xfoo"], | |
| non_matches = ["fum/bar/foox", "fum/bar/foo/y"], | |
| ) | |
| mixed_leading_globstar2_test = unittest.make(_mixed_leading_globstar2) | |
| def _mixed_wrapping_globstar(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "**/foo*/**", | |
| matches = ["fum/bar/foo/fum/bar", "fum/bar/foostar/fum/bar", "foo/a", "foob/c", "foo/"], | |
| non_matches = ["fum/bar/fo/fum/bar", "fum/bar/fostar/fum/bar", "foo", "foostar"], | |
| ) | |
| mixed_wrapper_globstar_test = unittest.make(_mixed_wrapping_globstar) | |
| def _all_of_ext(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "**/*.tf", | |
| matches = ["a.tf", "a/b.tf", "ab/cd/e.tf"], | |
| non_matches = ["a/b.tfg", "a/tf", "a/b.tf/g"], #TODO: "a/.tf", ".tf" | |
| ) | |
| all_of_ext_test = unittest.make(_all_of_ext) | |
| def _all_of_name(ctx): | |
| return _glob_match_test( | |
| ctx, | |
| "**/foo", | |
| matches = ["a/b/c/foo", "foo/foo", "a/foo/foo", "foo"], | |
| non_matches = ["foox", "foo/x"], | |
| ) | |
| all_of_name_test = unittest.make(_all_of_name) | |
| def _is_glob(ctx): | |
| env = unittest.begin(ctx) | |
| asserts.equals(env, False, is_glob("")) | |
| asserts.equals(env, False, is_glob("/")) | |
| asserts.equals(env, False, is_glob(".")) | |
| asserts.equals(env, False, is_glob("./")) | |
| asserts.equals(env, False, is_glob("..")) | |
| asserts.equals(env, False, is_glob("../")) | |
| asserts.equals(env, False, is_glob("/./.")) | |
| asserts.equals(env, False, is_glob("/../.")) | |
| asserts.equals(env, False, is_glob("/a/b/c/d")) | |
| asserts.equals(env, False, is_glob("/a/.")) | |
| asserts.equals(env, True, is_glob("*")) | |
| asserts.equals(env, True, is_glob("**")) | |
| asserts.equals(env, True, is_glob("?")) | |
| asserts.equals(env, True, is_glob("/*")) | |
| asserts.equals(env, True, is_glob("/**")) | |
| asserts.equals(env, True, is_glob("/?")) | |
| asserts.equals(env, True, is_glob(".*")) | |
| asserts.equals(env, True, is_glob(".?")) | |
| asserts.equals(env, True, is_glob("./foo/**/bar")) | |
| asserts.equals(env, True, is_glob("*.txt")) | |
| asserts.equals(env, True, is_glob("a/?.txt")) | |
| return unittest.end(env) | |
| is_glob_test = unittest.make(_is_glob) | |
| def glob_match_test_suite(): | |
| unittest.suite( | |
| "glob_match", | |
| partial.make(basic_test, timeout = "short"), | |
| partial.make(star_test, timeout = "short"), | |
| partial.make(trailing_star_test, timeout = "short"), | |
| partial.make(globstar_test, timeout = "short"), | |
| partial.make(globstar_slash_test, timeout = "short"), | |
| partial.make(qmark_test, timeout = "short"), | |
| partial.make(qmark_qmark_test, timeout = "short"), | |
| partial.make(wrapped_qmark_test, timeout = "short"), | |
| partial.make(mixed_wrapped_qmark_test, timeout = "short"), | |
| partial.make(leading_star_test, timeout = "short"), | |
| partial.make(ending_star_test, timeout = "short"), | |
| partial.make(wrapping_star_test, timeout = "short"), | |
| partial.make(wrapped_star_test, timeout = "short"), | |
| partial.make(all_of_ext_test, timeout = "short"), | |
| partial.make(all_of_name_test, timeout = "short"), | |
| partial.make(starting_star_test, timeout = "short"), | |
| partial.make(mixed_trailing_globstar_test, timeout = "short"), | |
| partial.make(mixed_leading_globstar_test, timeout = "short"), | |
| partial.make(mixed_leading_globstar2_test, timeout = "short"), | |
| partial.make(mixed_wrapper_globstar_test, timeout = "short"), | |
| ) | |
| unittest.suite( | |
| "is_glob", | |
| partial.make(is_glob_test, timeout = "short"), | |
| ) |