// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package match_test import ( "strings" "testing" match "." ) func TestMatch(t *testing.T) { for _, test := range []struct { pattern string path string expect bool }{ {"a", "a", true}, {"b", "a", false}, {"?", "a", true}, {"a/?/c", "a/x/c", true}, {"a/??/c", "a/x/c", false}, {"a/??/c", "a/xx/c", true}, {"a/???/c", "a/x z/c", true}, {"a/?/c", "a/xx/c", false}, {"a/?/?/c", "a/x/y/c", true}, {"a/?/?/?/c", "a/x/y/z/c", true}, {"a/???/c", "a/x/y/c", false}, {"a/?????", "a/x/y/c", false}, {"*", "a", true}, {"*", "abc", true}, {"*", "abc 123", true}, {"*", "xxx/yyy", false}, {"*/*", "xxx/yyy", true}, {"*/*", "xxx/yyy/zzz", false}, {"*/*/c", "xxx/yyy/c", true}, {"a/*/*", "a/xxx/yyy", true}, {"a/*/c", "a/xxx/c", true}, {"a/*/c", "a/xxx/c", true}, {"a/*/*/c", "a/b/c", false}, {"**", "a", true}, {"**", "abc", true}, {"**", "abc 123", true}, {"**", "xxx/yyy", true}, {"**", "xxx/yyy/zzz", true}, {"**/**", "xxx", false}, {"**/**", "xxx/yyy", true}, {"**/**", "xxx/yyy/zzz", true}, {"**/**/**", "xxx/yyy/zzz", true}, {"**/**/c", "xxx/yyy/c", true}, {"**/**/c", "xxx/yyy/c/d", false}, {"a/**/**", "a/xxx/yyy", true}, {"a/**/c", "a/xxx/c", true}, {"a/**/c", "a/xxx/yyy/c", true}, {"a/**/c", "a/xxx/y y/zzz/c", true}, {"a/**/c", "a/c", false}, {"a/**c", "a/c", true}, {"xxx/**.foo", "xxx/aaa.foo", true}, {"xxx/**.foo", "xxx/yyy/zzz/.foo", true}, {"xxx/**.foo", "xxx/yyy/zzz/bar.foo", true}, } { f, err := match.New(test.pattern) if err != nil { t.Errorf(`match.New("%v")`, test.pattern) continue } matched := f(test.path) switch { case matched && !test.expect: t.Errorf(`Path "%v" matched against pattern "%v"`, test.path, test.pattern) case !matched && test.expect: t.Errorf(`Path "%v" did not match against pattern "%v"`, test.path, test.pattern) } } } func TestErrOnPlaceholder(t *testing.T) { for _, pattern := range []string{"a/b••c", "a/b•c", "a/b/¿c"} { _, err := match.New(pattern) if err == nil { t.Errorf(`match.New("%v") did not return an expected error`, pattern) continue } if !strings.Contains(err.Error(), "Pattern must not contain") { t.Errorf(`match.New("%v") returned unrecognised error: %v`, pattern, err) continue } } }