aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-03-16 23:35:07 +0100
committerLudovic Courtès <ludo@gnu.org>2018-03-18 22:35:36 +0100
commite914b398af11f909e88a8bc85eeebb0768aacd54 (patch)
tree2e03d03eddd9e35bd34bce36768c2fad19c112e7 /tests
parent675e81a082b47aec7b3c2caa950953edb7c01c1e (diff)
downloadguix-e914b398af11f909e88a8bc85eeebb0768aacd54.tar.gz
guix-e914b398af11f909e88a8bc85eeebb0768aacd54.zip
glob: Support square brackets in patterns.
* guix/glob.scm (wildcard-indices): Remove. (parse-bracket): New procedure. (compile-glob-pattern): Rewrite. Support square brackets for sets and ranges. (glob-match?): Support sets and ranges. * tests/glob.scm (test-compile-glob-pattern) (test-glob-match): New macros. Use them to rewrite the existing tests, and add new tests.
Diffstat (limited to 'tests')
-rw-r--r--tests/glob.scm67
1 files changed, 39 insertions, 28 deletions
diff --git a/tests/glob.scm b/tests/glob.scm
index 033eeb10fe..71e2d3fce0 100644
--- a/tests/glob.scm
+++ b/tests/glob.scm
@@ -23,36 +23,47 @@
(test-begin "glob")
-(test-equal "compile-glob-pattern, no wildcards"
- "foo"
- (compile-glob-pattern "foo"))
+(define-syntax test-compile-glob-pattern
+ (syntax-rules (=>)
+ ((_ pattern => result rest ...)
+ (begin
+ (test-equal (format #f "compile-glob-pattern, ~s" pattern)
+ result
+ (compile-glob-pattern pattern))
+ (test-compile-glob-pattern rest ...)))
+ ((_)
+ #t)))
-(test-equal "compile-glob-pattern, Kleene star"
- '("foo" * "bar")
- (compile-glob-pattern "foo*bar"))
+(define-syntax test-glob-match
+ (syntax-rules (matches and not)
+ ((_ (pattern-string matches strings ... (and not others ...)) rest ...)
+ (begin
+ (test-assert (format #f "glob-match? ~s" pattern-string)
+ (let ((pattern (compile-glob-pattern pattern-string)))
+ (and (glob-match? pattern strings) ...
+ (not (glob-match? pattern others)) ...)))
+ (test-glob-match rest ...)))
+ ((_)
+ #t)))
-(test-equal "compile-glob-pattern, question mark"
- '(? "foo" *)
- (compile-glob-pattern "?foo*"))
+(test-compile-glob-pattern
+ "foo" => "foo"
+ "?foo*" => '(? "foo" *)
+ "foo[1-5]" => '("foo" (range #\1 #\5))
+ "foo[abc]bar" => '("foo" (set #\a #\b #\c) "bar")
+ "foo[a[b]c]bar" => '("foo" (set #\a #\[ #\b #\] #\c) "bar")
+ "[123]x" => '((set #\1 #\2 #\3) "x")
+ "[a-z]" => '((range #\a #\z)))
-(test-assert "literal match"
- (let ((pattern (compile-glob-pattern "foo")))
- (and (glob-match? pattern "foo")
- (not (glob-match? pattern "foobar"))
- (not (glob-match? pattern "barfoo")))))
-
-(test-assert "trailing star"
- (let ((pattern (compile-glob-pattern "foo*")))
- (and (glob-match? pattern "foo")
- (glob-match? pattern "foobar")
- (not (glob-match? pattern "xfoo")))))
-
-(test-assert "question marks"
- (let ((pattern (compile-glob-pattern "foo??bar")))
- (and (glob-match? pattern "fooxxbar")
- (glob-match? pattern "fooZZbar")
- (not (glob-match? pattern "foobar"))
- (not (glob-match? pattern "fooxxxbar"))
- (not (glob-match? pattern "fooxxbarzz")))))
+(test-glob-match
+ ("foo" matches "foo" (and not "foobar" "barfoo"))
+ ("foo*" matches "foo" "foobar" (and not "xfoo"))
+ ("foo??bar" matches "fooxxbar" "fooZZbar"
+ (and not "foobar" "fooxxxbar" "fooxxbarzz"))
+ ("foo?" matches "foox" (and not "fooxx"))
+ ("ab[0-9]c" matches "ab0c" "ab7c" "ab9c"
+ (and not "ab-c" "ab00c" "ab3"))
+ ("ab[cdefg]" matches "abc" "abd" "abg"
+ (and not "abh" "abcd" "ab[")))
(test-end "glob")