"""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"), )