github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libgo/go/old/regexp/find_test.go (about) 1 // Copyright 2010 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. 4 5 package regexp 6 7 import ( 8 "fmt" 9 "strings" 10 "testing" 11 ) 12 13 // For each pattern/text pair, what is the expected output of each function? 14 // We can derive the textual results from the indexed results, the non-submatch 15 // results from the submatched results, the single results from the 'all' results, 16 // and the byte results from the string results. Therefore the table includes 17 // only the FindAllStringSubmatchIndex result. 18 type FindTest struct { 19 pat string 20 text string 21 matches [][]int 22 } 23 24 func (t FindTest) String() string { 25 return fmt.Sprintf("pat: %#q text: %#q", t.pat, t.text) 26 } 27 28 var findTests = []FindTest{ 29 {``, ``, build(1, 0, 0)}, 30 {`^abcdefg`, "abcdefg", build(1, 0, 7)}, 31 {`a+`, "baaab", build(1, 1, 4)}, 32 {"abcd..", "abcdef", build(1, 0, 6)}, 33 {`a`, "a", build(1, 0, 1)}, 34 {`x`, "y", nil}, 35 {`b`, "abc", build(1, 1, 2)}, 36 {`.`, "a", build(1, 0, 1)}, 37 {`.*`, "abcdef", build(1, 0, 6)}, 38 {`^`, "abcde", build(1, 0, 0)}, 39 {`$`, "abcde", build(1, 5, 5)}, 40 {`^abcd$`, "abcd", build(1, 0, 4)}, 41 {`^bcd'`, "abcdef", nil}, 42 {`^abcd$`, "abcde", nil}, 43 {`a+`, "baaab", build(1, 1, 4)}, 44 {`a*`, "baaab", build(3, 0, 0, 1, 4, 5, 5)}, 45 {`[a-z]+`, "abcd", build(1, 0, 4)}, 46 {`[^a-z]+`, "ab1234cd", build(1, 2, 6)}, 47 {`[a\-\]z]+`, "az]-bcz", build(2, 0, 4, 6, 7)}, 48 {`[^\n]+`, "abcd\n", build(1, 0, 4)}, 49 {`[日本語]+`, "日本語日本語", build(1, 0, 18)}, 50 {`日本語+`, "日本語", build(1, 0, 9)}, 51 {`日本語+`, "日本語語語語", build(1, 0, 18)}, 52 {`()`, "", build(1, 0, 0, 0, 0)}, 53 {`(a)`, "a", build(1, 0, 1, 0, 1)}, 54 {`(.)(.)`, "日a", build(1, 0, 4, 0, 3, 3, 4)}, 55 {`(.*)`, "", build(1, 0, 0, 0, 0)}, 56 {`(.*)`, "abcd", build(1, 0, 4, 0, 4)}, 57 {`(..)(..)`, "abcd", build(1, 0, 4, 0, 2, 2, 4)}, 58 {`(([^xyz]*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 3, 4)}, 59 {`((a|b|c)*(d))`, "abcd", build(1, 0, 4, 0, 4, 2, 3, 3, 4)}, 60 {`(((a|b|c)*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 2, 3, 3, 4)}, 61 {`\a\b\f\n\r\t\v`, "\a\b\f\n\r\t\v", build(1, 0, 7)}, 62 {`[\a\b\f\n\r\t\v]+`, "\a\b\f\n\r\t\v", build(1, 0, 7)}, 63 64 {`a*(|(b))c*`, "aacc", build(1, 0, 4, 2, 2, -1, -1)}, 65 {`(.*).*`, "ab", build(1, 0, 2, 0, 2)}, 66 {`[.]`, ".", build(1, 0, 1)}, 67 {`/$`, "/abc/", build(1, 4, 5)}, 68 {`/$`, "/abc", nil}, 69 70 // multiple matches 71 {`.`, "abc", build(3, 0, 1, 1, 2, 2, 3)}, 72 {`(.)`, "abc", build(3, 0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3)}, 73 {`.(.)`, "abcd", build(2, 0, 2, 1, 2, 2, 4, 3, 4)}, 74 {`ab*`, "abbaab", build(3, 0, 3, 3, 4, 4, 6)}, 75 {`a(b*)`, "abbaab", build(3, 0, 3, 1, 3, 3, 4, 4, 4, 4, 6, 5, 6)}, 76 77 // fixed bugs 78 {`ab$`, "cab", build(1, 1, 3)}, 79 {`axxb$`, "axxcb", nil}, 80 {`data`, "daXY data", build(1, 5, 9)}, 81 {`da(.)a$`, "daXY data", build(1, 5, 9, 7, 8)}, 82 {`zx+`, "zzx", build(1, 1, 3)}, 83 84 // can backslash-escape any punctuation 85 {`\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~`, 86 `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)}, 87 {`[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~]+`, 88 `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)}, 89 {"\\`", "`", build(1, 0, 1)}, 90 {"[\\`]+", "`", build(1, 0, 1)}, 91 92 // long set of matches (longer than startSize) 93 { 94 ".", 95 "qwertyuiopasdfghjklzxcvbnm1234567890", 96 build(36, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 97 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 98 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 99 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36), 100 }, 101 } 102 103 // build is a helper to construct a [][]int by extracting n sequences from x. 104 // This represents n matches with len(x)/n submatches each. 105 func build(n int, x ...int) [][]int { 106 ret := make([][]int, n) 107 runLength := len(x) / n 108 j := 0 109 for i := range ret { 110 ret[i] = make([]int, runLength) 111 copy(ret[i], x[j:]) 112 j += runLength 113 if j > len(x) { 114 panic("invalid build entry") 115 } 116 } 117 return ret 118 } 119 120 // First the simple cases. 121 122 func TestFind(t *testing.T) { 123 for _, test := range findTests { 124 re := MustCompile(test.pat) 125 if re.String() != test.pat { 126 t.Errorf("String() = `%s`; should be `%s`", re.String(), test.pat) 127 } 128 result := re.Find([]byte(test.text)) 129 switch { 130 case len(test.matches) == 0 && len(result) == 0: 131 // ok 132 case test.matches == nil && result != nil: 133 t.Errorf("expected no match; got one: %s", test) 134 case test.matches != nil && result == nil: 135 t.Errorf("expected match; got none: %s", test) 136 case test.matches != nil && result != nil: 137 expect := test.text[test.matches[0][0]:test.matches[0][1]] 138 if expect != string(result) { 139 t.Errorf("expected %q got %q: %s", expect, result, test) 140 } 141 } 142 } 143 } 144 145 func TestFindString(t *testing.T) { 146 for _, test := range findTests { 147 result := MustCompile(test.pat).FindString(test.text) 148 switch { 149 case len(test.matches) == 0 && len(result) == 0: 150 // ok 151 case test.matches == nil && result != "": 152 t.Errorf("expected no match; got one: %s", test) 153 case test.matches != nil && result == "": 154 // Tricky because an empty result has two meanings: no match or empty match. 155 if test.matches[0][0] != test.matches[0][1] { 156 t.Errorf("expected match; got none: %s", test) 157 } 158 case test.matches != nil && result != "": 159 expect := test.text[test.matches[0][0]:test.matches[0][1]] 160 if expect != result { 161 t.Errorf("expected %q got %q: %s", expect, result, test) 162 } 163 } 164 } 165 } 166 167 func testFindIndex(test *FindTest, result []int, t *testing.T) { 168 switch { 169 case len(test.matches) == 0 && len(result) == 0: 170 // ok 171 case test.matches == nil && result != nil: 172 t.Errorf("expected no match; got one: %s", test) 173 case test.matches != nil && result == nil: 174 t.Errorf("expected match; got none: %s", test) 175 case test.matches != nil && result != nil: 176 expect := test.matches[0] 177 if expect[0] != result[0] || expect[1] != result[1] { 178 t.Errorf("expected %v got %v: %s", expect, result, test) 179 } 180 } 181 } 182 183 func TestFindIndex(t *testing.T) { 184 for _, test := range findTests { 185 testFindIndex(&test, MustCompile(test.pat).FindIndex([]byte(test.text)), t) 186 } 187 } 188 189 func TestFindStringIndex(t *testing.T) { 190 for _, test := range findTests { 191 testFindIndex(&test, MustCompile(test.pat).FindStringIndex(test.text), t) 192 } 193 } 194 195 func TestFindReaderIndex(t *testing.T) { 196 for _, test := range findTests { 197 testFindIndex(&test, MustCompile(test.pat).FindReaderIndex(strings.NewReader(test.text)), t) 198 } 199 } 200 201 // Now come the simple All cases. 202 203 func TestFindAll(t *testing.T) { 204 for _, test := range findTests { 205 result := MustCompile(test.pat).FindAll([]byte(test.text), -1) 206 switch { 207 case test.matches == nil && result == nil: 208 // ok 209 case test.matches == nil && result != nil: 210 t.Errorf("expected no match; got one: %s", test) 211 case test.matches != nil && result == nil: 212 t.Errorf("expected match; got none: %s", test) 213 case test.matches != nil && result != nil: 214 if len(test.matches) != len(result) { 215 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 216 continue 217 } 218 for k, e := range test.matches { 219 expect := test.text[e[0]:e[1]] 220 if expect != string(result[k]) { 221 t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test) 222 } 223 } 224 } 225 } 226 } 227 228 func TestFindAllString(t *testing.T) { 229 for _, test := range findTests { 230 result := MustCompile(test.pat).FindAllString(test.text, -1) 231 switch { 232 case test.matches == nil && result == nil: 233 // ok 234 case test.matches == nil && result != nil: 235 t.Errorf("expected no match; got one: %s", test) 236 case test.matches != nil && result == nil: 237 t.Errorf("expected match; got none: %s", test) 238 case test.matches != nil && result != nil: 239 if len(test.matches) != len(result) { 240 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 241 continue 242 } 243 for k, e := range test.matches { 244 expect := test.text[e[0]:e[1]] 245 if expect != result[k] { 246 t.Errorf("expected %q got %q: %s", expect, result, test) 247 } 248 } 249 } 250 } 251 } 252 253 func testFindAllIndex(test *FindTest, result [][]int, t *testing.T) { 254 switch { 255 case test.matches == nil && result == nil: 256 // ok 257 case test.matches == nil && result != nil: 258 t.Errorf("expected no match; got one: %s", test) 259 case test.matches != nil && result == nil: 260 t.Errorf("expected match; got none: %s", test) 261 case test.matches != nil && result != nil: 262 if len(test.matches) != len(result) { 263 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 264 return 265 } 266 for k, e := range test.matches { 267 if e[0] != result[k][0] || e[1] != result[k][1] { 268 t.Errorf("match %d: expected %v got %v: %s", k, e, result[k], test) 269 } 270 } 271 } 272 } 273 274 func TestFindAllIndex(t *testing.T) { 275 for _, test := range findTests { 276 testFindAllIndex(&test, MustCompile(test.pat).FindAllIndex([]byte(test.text), -1), t) 277 } 278 } 279 280 func TestFindAllStringIndex(t *testing.T) { 281 for _, test := range findTests { 282 testFindAllIndex(&test, MustCompile(test.pat).FindAllStringIndex(test.text, -1), t) 283 } 284 } 285 286 // Now come the Submatch cases. 287 288 func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte, t *testing.T) { 289 if len(submatches) != len(result)*2 { 290 t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test) 291 return 292 } 293 for k := 0; k < len(submatches); k += 2 { 294 if submatches[k] == -1 { 295 if result[k/2] != nil { 296 t.Errorf("match %d: expected nil got %q: %s", n, result, test) 297 } 298 continue 299 } 300 expect := test.text[submatches[k]:submatches[k+1]] 301 if expect != string(result[k/2]) { 302 t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test) 303 return 304 } 305 } 306 } 307 308 func TestFindSubmatch(t *testing.T) { 309 for _, test := range findTests { 310 result := MustCompile(test.pat).FindSubmatch([]byte(test.text)) 311 switch { 312 case test.matches == nil && result == nil: 313 // ok 314 case test.matches == nil && result != nil: 315 t.Errorf("expected no match; got one: %s", test) 316 case test.matches != nil && result == nil: 317 t.Errorf("expected match; got none: %s", test) 318 case test.matches != nil && result != nil: 319 testSubmatchBytes(&test, 0, test.matches[0], result, t) 320 } 321 } 322 } 323 324 func testSubmatchString(test *FindTest, n int, submatches []int, result []string, t *testing.T) { 325 if len(submatches) != len(result)*2 { 326 t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test) 327 return 328 } 329 for k := 0; k < len(submatches); k += 2 { 330 if submatches[k] == -1 { 331 if result[k/2] != "" { 332 t.Errorf("match %d: expected nil got %q: %s", n, result, test) 333 } 334 continue 335 } 336 expect := test.text[submatches[k]:submatches[k+1]] 337 if expect != result[k/2] { 338 t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test) 339 return 340 } 341 } 342 } 343 344 func TestFindStringSubmatch(t *testing.T) { 345 for _, test := range findTests { 346 result := MustCompile(test.pat).FindStringSubmatch(test.text) 347 switch { 348 case test.matches == nil && result == nil: 349 // ok 350 case test.matches == nil && result != nil: 351 t.Errorf("expected no match; got one: %s", test) 352 case test.matches != nil && result == nil: 353 t.Errorf("expected match; got none: %s", test) 354 case test.matches != nil && result != nil: 355 testSubmatchString(&test, 0, test.matches[0], result, t) 356 } 357 } 358 } 359 360 func testSubmatchIndices(test *FindTest, n int, expect, result []int, t *testing.T) { 361 if len(expect) != len(result) { 362 t.Errorf("match %d: expected %d matches; got %d: %s", n, len(expect)/2, len(result)/2, test) 363 return 364 } 365 for k, e := range expect { 366 if e != result[k] { 367 t.Errorf("match %d: submatch error: expected %v got %v: %s", n, expect, result, test) 368 } 369 } 370 } 371 372 func testFindSubmatchIndex(test *FindTest, result []int, t *testing.T) { 373 switch { 374 case test.matches == nil && result == nil: 375 // ok 376 case test.matches == nil && result != nil: 377 t.Errorf("expected no match; got one: %s", test) 378 case test.matches != nil && result == nil: 379 t.Errorf("expected match; got none: %s", test) 380 case test.matches != nil && result != nil: 381 testSubmatchIndices(test, 0, test.matches[0], result, t) 382 } 383 } 384 385 func TestFindSubmatchIndex(t *testing.T) { 386 for _, test := range findTests { 387 testFindSubmatchIndex(&test, MustCompile(test.pat).FindSubmatchIndex([]byte(test.text)), t) 388 } 389 } 390 391 func TestFindStringSubmatchIndex(t *testing.T) { 392 for _, test := range findTests { 393 testFindSubmatchIndex(&test, MustCompile(test.pat).FindStringSubmatchIndex(test.text), t) 394 } 395 } 396 397 func TestFindReaderSubmatchIndex(t *testing.T) { 398 for _, test := range findTests { 399 testFindSubmatchIndex(&test, MustCompile(test.pat).FindReaderSubmatchIndex(strings.NewReader(test.text)), t) 400 } 401 } 402 403 // Now come the monster AllSubmatch cases. 404 405 func TestFindAllSubmatch(t *testing.T) { 406 for _, test := range findTests { 407 result := MustCompile(test.pat).FindAllSubmatch([]byte(test.text), -1) 408 switch { 409 case test.matches == nil && result == nil: 410 // ok 411 case test.matches == nil && result != nil: 412 t.Errorf("expected no match; got one: %s", test) 413 case test.matches != nil && result == nil: 414 t.Errorf("expected match; got none: %s", test) 415 case len(test.matches) != len(result): 416 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 417 case test.matches != nil && result != nil: 418 for k, match := range test.matches { 419 testSubmatchBytes(&test, k, match, result[k], t) 420 } 421 } 422 } 423 } 424 425 func TestFindAllStringSubmatch(t *testing.T) { 426 for _, test := range findTests { 427 result := MustCompile(test.pat).FindAllStringSubmatch(test.text, -1) 428 switch { 429 case test.matches == nil && result == nil: 430 // ok 431 case test.matches == nil && result != nil: 432 t.Errorf("expected no match; got one: %s", test) 433 case test.matches != nil && result == nil: 434 t.Errorf("expected match; got none: %s", test) 435 case len(test.matches) != len(result): 436 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 437 case test.matches != nil && result != nil: 438 for k, match := range test.matches { 439 testSubmatchString(&test, k, match, result[k], t) 440 } 441 } 442 } 443 } 444 445 func testFindAllSubmatchIndex(test *FindTest, result [][]int, t *testing.T) { 446 switch { 447 case test.matches == nil && result == nil: 448 // ok 449 case test.matches == nil && result != nil: 450 t.Errorf("expected no match; got one: %s", test) 451 case test.matches != nil && result == nil: 452 t.Errorf("expected match; got none: %s", test) 453 case len(test.matches) != len(result): 454 t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) 455 case test.matches != nil && result != nil: 456 for k, match := range test.matches { 457 testSubmatchIndices(test, k, match, result[k], t) 458 } 459 } 460 } 461 462 func TestFindAllSubmatchIndex(t *testing.T) { 463 for _, test := range findTests { 464 testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllSubmatchIndex([]byte(test.text), -1), t) 465 } 466 } 467 468 func TestFindAllStringSubmatchIndex(t *testing.T) { 469 for _, test := range findTests { 470 testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllStringSubmatchIndex(test.text, -1), t) 471 } 472 }