use Test::More tests => 66; use FLAT; # use Data::Dumper; my $reg; sub regex { FLAT::Regex->new(@_) } is( ref regex("a"), "FLAT::Regex", "blessed reference" ); is( regex( "(((a)bc)def)ghi" )->as_string, "abcdefghi", "Collapse parens for concatenation" ); is( regex( "(((a)+b+c)+d+e+f)+g+h+i" )->as_string, "a+b+c+d+e+f+g+h+i", "Collapse parens for alternation" ); is( regex( "((a+(b+(cd)))*)+e" )->as_string, "(a+b+cd)*+e", "Parens kept for precedence" ); is( regex("#")->as_string, "#", "Null regex" ); is( regex("[]")->as_string, "[]", "epsilon" ); is( regex("[#][ ][foo][*][a][1][23]")->as_string, "[#][ ][foo][*]a1[23]", "special [] characters as string" ); is( regex(" a\tb\nc \n\t d")->as_string, "abcd", "whitespace ignored" ); for ( ")ab", "a(bc(d)", "ab)cd(ef", "a+b+", "a++b", "+a", "h**", "a+*", "" ) { eval { regex($_) }; ok( $@, "Parse error caught: $_" ); } $reg = regex( "abc+def+ghi*+(a+b)*" ); is( $reg->as_string, $reg->reverse->reverse->as_string, "Reversal operation idempotent" ); ##### ok( regex("#")->is_empty, "is_empty (atomic)" ); ok( ! regex("[#]")->is_empty, "is_empty (atomic)" ); ok( ! regex("[foo]")->is_empty, "is_empty (atomic)" ); ok( ! regex("[]")->is_empty, "is_empty (atomic)" ); ok( ! regex("[ ]")->is_empty, "is_empty (atomic)" ); ok( regex("a#a")->is_empty, "is_empty (concatenation)" ); ok( ! regex("aa")->is_empty, "is_empty (concatenation)" ); ok( ! regex("#*")->is_empty, "is_empty (star)" ); ok( ! regex("[#]*")->is_empty, "is_empty (star)" ); ok( ! regex("#+b")->is_empty, "is_empty (alternation)" ); ok( regex("#+#")->is_empty, "is_empty (alternation)" ); ok( regex("a")->is_finite, "is_finite (atomic)" ); ok( regex("#")->is_finite, "is_finite (atomic)" ); ok( regex("#*")->is_finite, "is_finite (star)" ); ok( ! regex("[#]*")->is_finite, "is_finite (star)" ); ok( regex("[]*")->is_finite, "is_finite (star)" ); ok( regex("([]+ [][])*")->is_finite, "is_finite (star)" ); ok( ! regex("a*")->is_finite, "is_finite (star)" ); ok( regex("a+b")->is_finite, "is_finite (alternation)" ); ok( ! regex("a+a*")->is_finite, "is_finite (alternation)" ); ok( regex("aa")->is_finite, "is_finite (concatenation)" ); ok( ! regex("a*a")->is_finite, "is_finite (concatenation)" ); #### $reg = regex("ab(c|de|f*)(g|[])"); my $p = $reg->as_perl_regex(anchored => 1); for (qw[ abcg abc abdeg abde ab abg abfffg abff ]) { ok( /$p/, "as_perl_regex (positives)" ); ok( $reg->contains($_), "contains (positives)" ); } for (qw[ aabcg ac abcdeg abdef abffgg ]) { ok( ! /$p/, "as_perl_regex (negatives)" ); ok( ! $reg->contains($_), "contains (negatives)" ); }