@ -13,10 +13,15 @@ func Test_SimplifiedRegex(t *testing.T) {
"foo, 世界" , allunicode ( ) , "fooÏbar" ,
}
for _ , test := range [ ] struct {
re string
re string
// Simplified is true when the regex is converted to non-regex filters
// or when the regex is rewritten to be non-greedy
simplified bool
expected Filterer
match bool
// Expected != nil when the regex is converted to non-regex filters
expected Filterer
match bool
} {
// regex we intend to support.
{ "foo" , true , newContainsFilter ( [ ] byte ( "foo" ) , false ) , true } ,
@ -63,25 +68,26 @@ func Test_SimplifiedRegex(t *testing.T) {
{ "(?i).*foo.*" , true , newContainsFilter ( [ ] byte ( "FOO" ) , true ) , true } ,
{ ".+" , true , ExistsFilter , true } ,
// regex we are not supporting.
{ "[a-z]+foo" , true , nil , false } ,
{ ".+foo" , true , nil , false } ,
{ ".*fo.*o" , true , nil , false } ,
{ ` \d ` , true , nil , false } ,
{ ` \sfoo ` , true , nil , false } ,
{ ` foo? ` , false , nil , false } ,
{ ` foo { 1,2}bar { 2,3} ` , true , nil , false } ,
{ ` foo|\d*bar ` , true , nil , false } ,
{ ` foo|fo { 1,2} ` , true , nil , false } ,
{ ` foo|fo\d* ` , true , nil , false } ,
{ ` foo|fo\d+ ` , true , nil , false } ,
{ ` (\w\d+) ` , true , nil , false } ,
{ ` .*f.*oo|fo { 1,2} ` , true , nil , false } ,
{ "f|f(?i)oo" , true , nil , false } ,
{ ".foo+" , true , nil , false } ,
// These regexes are rewritten to be non-greedy but no new
// filter is generated.
{ "[a-z]+foo" , true , nil , true } ,
{ ".+foo" , true , nil , true } ,
{ ".*fo.*o" , true , nil , true } ,
{ ` \d ` , true , nil , true } ,
{ ` \sfoo ` , true , nil , true } ,
{ ` foo? ` , false , nil , true } ,
{ ` foo { 1,2}bar { 2,3} ` , true , nil , true } ,
{ ` foo|\d*bar ` , true , nil , true } ,
{ ` foo|fo { 1,2} ` , true , nil , true } ,
{ ` foo|fo\d* ` , true , nil , true } ,
{ ` foo|fo\d+ ` , true , nil , true } ,
{ ` (\w\d+) ` , true , nil , true } ,
{ ` .*f.*oo|fo { 1,2} ` , true , nil , true } ,
{ "f|f(?i)oo" , true , nil , true } ,
{ ".foo+" , true , nil , true } ,
} {
t . Run ( test . re , func ( t * testing . T ) {
d , err := newRegexpFilter ( test . re , test . match )
d , err := newRegexpFilter ( test . re , test . re , test . match )
require . NoError ( t , err , "invalid regex" )
f , err := parseRegexpFilter ( test . re , test . match , false )
@ -92,11 +98,17 @@ func Test_SimplifiedRegex(t *testing.T) {
require . Equal ( t , d , f )
return
}
// otherwise ensure we have different filter
require . NotEqual ( t , f , d )
if test . expected != nil {
require . Equal ( t , test . expected , f )
} else {
reFilter , ok := f . ( regexpFilter )
require . True ( t , ok )
require . Equal ( t , test . re , reFilter . String ( ) )
}
// tests all lines with both filter, they should have the same result.
for _ , line := range fixtures {
l := [ ] byte ( line )
@ -182,7 +194,7 @@ var res bool
func benchmarkRegex ( b * testing . B , re , line string , match bool ) {
var m bool
l := [ ] byte ( line )
d , err := newRegexpFilter ( re , match )
d , err := newRegexpFilter ( re , re , match )
if err != nil {
b . Fatal ( err )
}