|  | // 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) | 
|  | } | 
|  | } |