1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 var runeMergeTests = []struct {
15 left, right, merged []rune
17 leftPC, rightPC uint32
28 // identical runes, identical targets
32 []uint32{mergeFailed},
36 // identical runes, different targets
40 []uint32{mergeFailed},
47 []rune{69, 69, 71, 71},
55 []rune{69, 69, 71, 71},
60 // successful interleave
61 []rune{60, 60, 71, 71, 101, 101},
62 []rune{69, 69, 88, 88},
63 []rune{60, 60, 69, 69, 71, 71, 88, 88, 101, 101},
64 []uint32{1, 2, 1, 2, 1},
68 // left surrounds right
72 []uint32{mergeFailed},
76 // right surrounds left
80 []uint32{mergeFailed},
84 // overlap at interval begin
88 []uint32{mergeFailed},
92 // overlap ar interval end
96 []uint32{mergeFailed},
100 // overlap from above
104 []uint32{mergeFailed},
108 // overlap from below
112 []uint32{mergeFailed},
116 // out of order []rune
117 []rune{69, 74, 60, 65},
120 []uint32{mergeFailed},
125 func TestMergeRuneSet(t *testing.T) {
126 for ix, test := range runeMergeTests {
127 merged, next := mergeRuneSets(&test.left, &test.right, test.leftPC, test.rightPC)
128 if !reflect.DeepEqual(merged, test.merged) {
129 t.Errorf("mergeRuneSet :%d (%v, %v) merged\n have\n%v\nwant\n%v", ix, test.left, test.right, merged, test.merged)
131 if !reflect.DeepEqual(next, test.next) {
132 t.Errorf("mergeRuneSet :%d(%v, %v) next\n have\n%v\nwant\n%v", ix, test.left, test.right, next, test.next)
137 var onePassTests = []struct {
141 {`^(?:a|(?:a*))$`, false},
142 {`^(?:(a)|(?:a*))$`, false},
143 {`^(?:(?:(?:.(?:$))?))$`, true},
145 {`^(?:(?:a{0,})*?)$`, false},
146 {`^(?:(?:a+)*)$`, true},
147 {`^(?:(?:a|(?:aa)))$`, true},
148 {`^(?:[^\s\S])$`, true},
149 {`^(?:(?:a{3,4}){0,})$`, false},
150 {`^(?:(?:(?:a*)+))$`, true},
154 {`^(?:(?:aa)|a)$`, true},
157 {`^(?:a|(?:aa))$`, true},
159 {`^a.[l-nA-Cg-j]?e$`, true},
161 {`^a(?:(b)|(c))c$`, true},
162 {`^a(?:(b*)|(c))c$`, false},
163 {`^a(?:b|c)$`, true},
164 {`^a(?:b?|c)$`, true},
165 {`^a(?:b?|c?)$`, false},
166 {`^a(?:b?|c+)$`, true},
167 {`^a(?:b+|(bc))d$`, false},
168 {`^a(?:bc)+$`, true},
169 {`^a(?:[bcd])+$`, true},
170 {`^a((?:[bcd])+)$`, true},
171 {`^a(:?b|c)*d$`, true},
172 {`^.bc(d|e)*$`, true},
173 {`^(?:(?:aa)|.)$`, false},
174 {`^(?:(?:a{1,2}){1,2})$`, false},
175 {`^l` + strings.Repeat("o", 2<<8) + `ng$`, true},
178 func TestCompileOnePass(t *testing.T) {
184 for _, test := range onePassTests {
185 if re, err = syntax.Parse(test.re, syntax.Perl); err != nil {
186 t.Errorf("Parse(%q) got err:%s, want success", test.re, err)
189 // needs to be done before compile...
191 if p, err = syntax.Compile(re); err != nil {
192 t.Errorf("Compile(%q) got err:%s, want success", test.re, err)
195 isOnePass := compileOnePass(p) != nil
196 if isOnePass != test.isOnePass {
197 t.Errorf("CompileOnePass(%q) got isOnePass=%v, expected %v", test.re, isOnePass, test.isOnePass)
202 // TODO(cespare): Unify with onePassTests and rationalize one-pass test cases.
203 var onePassTests1 = []struct {
207 {`^a(/b+(#c+)*)*$`, "a/b#c"}, // golang.org/issue/11905
210 func TestRunOnePass(t *testing.T) {
211 for _, test := range onePassTests1 {
212 re, err := Compile(test.re)
214 t.Errorf("Compile(%q): got err: %s", test.re, err)
217 if re.onepass == nil {
218 t.Errorf("Compile(%q): got nil, want one-pass", test.re)
221 if !re.MatchString(test.match) {
222 t.Errorf("onepass %q did not match %q", test.re, test.match)