mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
https://github.com/MetaCubeX/mihomo/issues/2204
97 lines
3.9 KiB
Go
97 lines
3.9 KiB
Go
package wildcard
|
|
|
|
/*
|
|
* copy and modified from https://github.com/IGLOU-EU/go-wildcard/tree/ce22b7af48e487517a492d3727d9386492043e21
|
|
*
|
|
* Copyright (c) 2023 Iglou.eu <contact@iglou.eu>
|
|
* Copyright (c) 2023 Adrien Kara <adrien@iglou.eu>
|
|
*
|
|
* Licensed under the BSD 3-Clause License,
|
|
*/
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
// TestMatch validates the logic of wild card matching,
|
|
// it need to support '*', '?' and only validate for byte comparison
|
|
// over string, not rune or grapheme cluster
|
|
func TestMatch(t *testing.T) {
|
|
cases := []struct {
|
|
s string
|
|
pattern string
|
|
result bool
|
|
}{
|
|
{"", "", true},
|
|
{"", "*", true},
|
|
{"", "**", true},
|
|
{"", "?", false},
|
|
{"", "?*", false},
|
|
{"", "*?", false},
|
|
|
|
{"a", "", false},
|
|
{"a", "a", true},
|
|
{"a", "*", true},
|
|
{"a", "**", true},
|
|
{"a", "?", true},
|
|
{"a", "?*", true},
|
|
{"a", "*?", true},
|
|
|
|
{"match the exact string", "match the exact string", true},
|
|
{"do not match a different string", "this is a different string", false},
|
|
{"Match The Exact String WITH DIFFERENT CASE", "Match The Exact String WITH DIFFERENT CASE", true},
|
|
{"do not match a different string WITH DIFFERENT CASE", "this is a different string WITH DIFFERENT CASE", false},
|
|
{"Do Not Match The Exact String With Different Case", "do not match the exact string with different case", false},
|
|
{"match an emoji 😃", "match an emoji 😃", true},
|
|
{"do not match because of different emoji 😃", "do not match because of different emoji 😄", false},
|
|
{"🌅☕️📰👨💼👩💼🏢🖥️💼💻📊📈📉👨👩👧👦🍝🕰️💪🏋️♂️🏋️♀️🏋️♂️💼🚴♂️🚴♀️🚴♂️🛀💤🌃", "🌅☕️📰👨💼👩💼🏢🖥️💼💻📊📈📉👨👩👧👦🍝🕰️💪🏋️♂️🏋️♀️🏋️♂️💼🚴♂️🚴♀️🚴♂️🛀💤🌃", true},
|
|
{"🌅☕️📰👨💼👩💼🏢🖥️💼💻📊📈📉👨👩👧👦🍝🕰️💪🏋️♂️🏋️♀️🏋️♂️💼🚴♂️🚴♀️🚴♂️🛀💤🌃", "🦌🐇🦡🐿️🌲🌳🏰🌳🌲🌞🌧️❄️🌬️⛈️🔥🎄🎅🎁🎉🎊🥳👨👩👧👦💏👪💖👩💼🛀", false},
|
|
|
|
{"match a string with a *", "match a string *", true},
|
|
{"match a string with a * at the beginning", "* at the beginning", true},
|
|
{"match a string with two *", "match * with *", true},
|
|
{"do not match a string with extra and a *", "do not match a string * with more", false},
|
|
|
|
{"match a string with a ?", "match ? string with a ?", true},
|
|
{"match a string with a ? at the beginning", "?atch a string with a ? at the beginning", true},
|
|
{"match a string with two ?", "match a ??ring with two ?", true},
|
|
{"do not match a string with extra ?", "do not match a string with extra ??", false},
|
|
|
|
{"abc.edf.hjg", "abc.edf.hjg", true},
|
|
{"abc.edf.hjg", "ab.cedf.hjg", false},
|
|
{"abc.edf.hjg", "abc.edfh.jg", false},
|
|
{"abc.edf.hjg", "abc.edf.hjq", false},
|
|
|
|
{"abc.edf.hjg", "abc.*.hjg", true},
|
|
{"abc.edf.hjg", "abc.*.hjq", false},
|
|
{"abc.edf.hjg", "abc*hjg", true},
|
|
{"abc.edf.hjg", "abc*hjq", false},
|
|
{"abc.edf.hjg", "a*g", true},
|
|
{"abc.edf.hjg", "a*q", false},
|
|
|
|
{"abc.edf.hjg", "ab?.edf.hjg", true},
|
|
{"abc.edf.hjg", "?b?.edf.hjg", true},
|
|
{"abc.edf.hjg", "??c.edf.hjg", true},
|
|
{"abc.edf.hjg", "a??.edf.hjg", true},
|
|
{"abc.edf.hjg", "ab??.edf.hjg", false},
|
|
{"abc.edf.hjg", "??.edf.hjg", false},
|
|
}
|
|
|
|
for i, c := range cases {
|
|
t.Run(c.s, func(t *testing.T) {
|
|
result := Match(c.pattern, c.s)
|
|
if c.result != result {
|
|
t.Errorf("Test %d: Expected `%v`, found `%v`; With Pattern: `%s` and String: `%s`", i+1, c.result, result, c.pattern, c.s)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func FuzzMatch(f *testing.F) {
|
|
f.Fuzz(func(t *testing.T, s string) {
|
|
if !Match(string(s), string(s)) {
|
|
t.Fatalf("%s does not match %s", s, s)
|
|
}
|
|
})
|
|
}
|