github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/pattern/pattern_test.go (about) 1 package pattern 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 var testFindIndexCases = []struct { 9 input string 10 pat string 11 off int 12 captures []Capture 13 }{ 14 {"", "", 0, []Capture{{0, 0, false}}}, 15 {"a", "a", 0, []Capture{{0, 1, false}}}, 16 {"b", "a", 0, nil}, 17 {"testfootest", "foo", 0, []Capture{{4, 7, false}}}, 18 {"testfootest", "foo.", 0, []Capture{{4, 8, false}}}, 19 {"baaac", "a+", 0, []Capture{{1, 4, false}}}, 20 {"bc", "a+", 0, nil}, 21 {"baaac", "a*", 0, []Capture{{0, 0, false}}}, 22 {"aaac", "a*", 0, []Capture{{0, 3, false}}}, 23 {"aab", "a+b+", 0, []Capture{{0, 3, false}}}, 24 {"aa", "a-", 0, []Capture{{0, 0, false}}}, 25 {"aab", "a-b", 0, []Capture{{0, 3, false}}}, 26 {"xaabaacba", "((a+)(b+))%2c%3", 0, []Capture{ 27 {1, 8, false}, 28 {1, 4, false}, 29 {1, 3, false}, 30 {3, 4, false}, 31 }}, 32 {"abaac", "[ab]*", 0, []Capture{{0, 4, false}}}, 33 {"abaac", "([ab]*)c", 0, []Capture{{0, 5, false}, {0, 4, false}}}, 34 {"a", "^a", 0, []Capture{{0, 1, false}}}, 35 {"ba", "^a", 0, nil}, 36 {"a", "a$", 0, []Capture{{0, 1, false}}}, 37 {"ab", "a$", 0, nil}, 38 {"$ab", "%$a", 0, []Capture{{0, 2, false}}}, 39 {"abcabc", "$", 0, []Capture{{6, 6, false}}}, 40 {"aabb", "%f[a]", 0, []Capture{{0, 0, false}}}, 41 {"aabb", "%f[b]", 0, []Capture{{2, 2, false}}}, 42 {"aa(bb)cc", "%b()", 0, []Capture{{2, 6, false}}}, 43 {"aa'bb'cc", "%b''", 0, []Capture{{2, 6, false}}}, 44 {"ab ! test", "[^%sa-z]", 0, []Capture{{3, 4, false}}}, 45 {`[]`, `^%[%]$`, 0, []Capture{{0, 2, false}}}, 46 {`["]`, `^%["%]$`, 0, []Capture{{0, 3, false}}}, 47 {`[string "]`, `^%[string "%]$`, 0, []Capture{{0, 10, false}}}, 48 {`[string "foo bar baz"]`, `^%[string [^x]*"%]$`, 0, []Capture{{0, 22, false}}}, 49 {`xyz`, `[^x]+`, 0, []Capture{{1, 3, false}}}, 50 {`xyz`, `[yz]+`, 0, []Capture{{1, 3, false}}}, 51 {`]]]a`, `[^]]`, 0, []Capture{{3, 4, false}}}, 52 {`xyz`, `()y()`, 0, []Capture{{1, 2, false}, {1, 1, true}, {2, 2, true}}}, 53 {"ab", "b", 1, []Capture{{1, 2, false}}}, 54 {" a ", "%w", 1, []Capture{{1, 2, false}}}, 55 {"x=y", "x%py", 0, []Capture{{0, 3, false}}}, 56 {"aa5bb", "[%d]", 0, []Capture{{2, 3, false}}}, 57 {"aa5bb", "[^%D]", 0, []Capture{{2, 3, false}}}, 58 {"aa", "%f[a]", 0, []Capture{{0, 0, false}}}, 59 {"aa", "%f[^a]", 0, []Capture{{2, 2, false}}}, 60 {"aa", "%f[^\x00]", 0, []Capture{{0, 0, false}}}, 61 {"aa", "%f[\x00]", 0, []Capture{{2, 2, false}}}, 62 } 63 64 func TestFindIndex(t *testing.T) { 65 for i, test := range testFindIndexCases { 66 got, err := FindIndex(test.input, test.pat, test.off) 67 if err != nil { 68 t.Fatal(err) 69 } 70 want := test.captures 71 if !reflect.DeepEqual(got, want) { 72 t.Errorf("%d: got %v, want %v", i+1, got, want) 73 } 74 } 75 } 76 77 var testFindAllIndexCases = []struct { 78 input string 79 pat string 80 allCaptures [][]Capture 81 }{ 82 {"abc", "", [][]Capture{ 83 {{0, 0, false}}, 84 {{1, 1, false}}, 85 {{2, 2, false}}, 86 {{3, 3, false}}, 87 }}, 88 {"a bc", " *", [][]Capture{ 89 {{0, 0, false}}, 90 {{1, 2, false}}, 91 {{3, 3, false}}, 92 {{4, 4, false}}, 93 }}, 94 {"abc abc ababcabc", "abc", [][]Capture{ 95 {{0, 3, false}}, 96 {{4, 7, false}}, 97 {{10, 13, false}}, 98 {{13, 16, false}}, 99 }}, 100 } 101 102 func TestFindAllIndex(t *testing.T) { 103 for i, test := range testFindAllIndexCases { 104 got, err := FindAllIndex(test.input, test.pat, -1) 105 if err != nil { 106 t.Fatal(err) 107 } 108 want := test.allCaptures 109 if !reflect.DeepEqual(got, want) { 110 t.Errorf("%d: got %v, want %v", i+1, got, want) 111 } 112 } 113 } 114 115 var testReplaceAllCases = []struct { 116 input string 117 pat string 118 repl string 119 output string 120 }{ 121 {"abc", "", "-", "-a-b-c-"}, 122 {"a bc", " *", "-", "-a-b-c-"}, 123 } 124 125 func TestReplaceAllFunc(t *testing.T) { 126 for i, test := range testReplaceAllCases { 127 got, _, err := ReplaceAllFunc(test.input, test.pat, func(caps []Capture) (string, error) { 128 return test.repl, nil 129 }, -1) 130 if err != nil { 131 t.Fatal(err) 132 } 133 want := test.output 134 if !reflect.DeepEqual(got, want) { 135 t.Errorf("%d: got %v, want %v", i+1, got, want) 136 } 137 } 138 }