blob: 5603aea22898f657231ef484240c51869b7b1271 [file] [log] [blame]
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package syntax
import "testing"
var compileTests = []struct {
Regexp string
Prog string
}{
{"a", ` 0 fail
1* rune1 "a" -> 2
2 match
`},
{"[A-M][n-z]", ` 0 fail
1* rune "AM" -> 2
2 rune "nz" -> 3
3 match
`},
{"", ` 0 fail
1* nop -> 2
2 match
`},
{"a?", ` 0 fail
1 rune1 "a" -> 3
2* alt -> 1, 3
3 match
`},
{"a??", ` 0 fail
1 rune1 "a" -> 3
2* alt -> 3, 1
3 match
`},
{"a+", ` 0 fail
1* rune1 "a" -> 2
2 alt -> 1, 3
3 match
`},
{"a+?", ` 0 fail
1* rune1 "a" -> 2
2 alt -> 3, 1
3 match
`},
{"a*", ` 0 fail
1 rune1 "a" -> 2
2* alt -> 1, 3
3 match
`},
{"a*?", ` 0 fail
1 rune1 "a" -> 2
2* alt -> 3, 1
3 match
`},
{"a+b+", ` 0 fail
1* rune1 "a" -> 2
2 alt -> 1, 3
3 rune1 "b" -> 4
4 alt -> 3, 5
5 match
`},
{"(a+)(b+)", ` 0 fail
1* cap 2 -> 2
2 rune1 "a" -> 3
3 alt -> 2, 4
4 cap 3 -> 5
5 cap 4 -> 6
6 rune1 "b" -> 7
7 alt -> 6, 8
8 cap 5 -> 9
9 match
`},
{"a+|b+", ` 0 fail
1 rune1 "a" -> 2
2 alt -> 1, 6
3 rune1 "b" -> 4
4 alt -> 3, 6
5* alt -> 1, 3
6 match
`},
{"A[Aa]", ` 0 fail
1* rune1 "A" -> 2
2 rune "A"/i -> 3
3 match
`},
{"(?:(?:^).)", ` 0 fail
1* empty 4 -> 2
2 anynotnl -> 3
3 match
`},
{"(?:|a)+", ` 0 fail
1 nop -> 4
2 rune1 "a" -> 4
3* alt -> 1, 2
4 alt -> 3, 5
5 match
`},
{"(?:|a)*", ` 0 fail
1 nop -> 4
2 rune1 "a" -> 4
3 alt -> 1, 2
4 alt -> 3, 6
5* alt -> 3, 6
6 match
`},
}
func TestCompile(t *testing.T) {
for _, tt := range compileTests {
re, _ := Parse(tt.Regexp, Perl)
p, _ := Compile(re)
s := p.String()
if s != tt.Prog {
t.Errorf("compiled %#q:\n--- have\n%s---\n--- want\n%s---", tt.Regexp, s, tt.Prog)
}
}
}
func BenchmarkEmptyOpContext(b *testing.B) {
for i := 0; i < b.N; i++ {
var r1 rune = -1
for _, r2 := range "foo, bar, baz\nsome input text.\n" {
EmptyOpContext(r1, r2)
r1 = r2
}
EmptyOpContext(r1, -1)
}
}