def test_conc_str(): assert str(conc( mult(charclass("a"), one), mult(charclass("b"), one), mult(charclass("c"), one), mult(charclass("d"), one), mult(charclass("e"), one), mult(~charclass("fg"), star), mult(charclass("h"), multiplier(bound(5), bound(5))), mult(charclass("abcdefghijklmnopqrstuvwxyz"), plus), )) == "abcde[^fg]*h{5}[a-z]+"
def test_conc_parsing(): assert conc.parse("abcde[^fg]*h{5}[a-z]+") == conc( mult(charclass("a"), one), mult(charclass("b"), one), mult(charclass("c"), one), mult(charclass("d"), one), mult(charclass("e"), one), mult(~charclass("fg"), star), mult(charclass("h"), multiplier(bound(5), bound(5))), mult(charclass("abcdefghijklmnopqrstuvwxyz"), plus), ) assert conc.parse("[bc]*[ab]*") == conc( mult(charclass("bc"), star), mult(charclass("ab"), star), ) assert conc.parse("abc...") == conc( mult(charclass("a"), one), mult(charclass("b"), one), mult(charclass("c"), one), mult(dot, one), mult(dot, one), mult(dot, one), ) assert conc.parse("\\d{4}-\\d{2}-\\d{2}") == conc( mult(charclass("0123456789"), multiplier(bound(4), bound(4))), mult(charclass("-"), one), mult(charclass("0123456789"), multiplier(bound(2), bound(2))), mult(charclass("-"), one), mult(charclass("0123456789"), multiplier(bound(2), bound(2))), )
def test_mult_reduction_easy(): # mult -> mult # mult -> charclass assert mult(charclass("a"), one).reduce() == charclass("a") assert mult(charclass("a"), qm).reduce() == mult(charclass("a"), qm) assert mult(charclass("a"), zero).reduce() == emptystring assert mult(nothing, one).reduce() == nothing assert mult(nothing, qm).reduce() == emptystring assert mult(nothing, zero).reduce() == emptystring assert mult(nothing, multiplier(bound(0), bound(5))).reduce() == emptystring assert mult(pattern(), one).reduce() == nothing assert mult(pattern(), qm).reduce() == emptystring assert mult(pattern(), zero).reduce() == emptystring assert mult(pattern(), multiplier(bound(0), bound(5))).reduce() == emptystring
def test_mult_parsing(): assert mult.parse("[a-g]+") == mult(charclass("abcdefg"), plus) assert mult.parse("[a-g0-8$%]+") == mult(charclass("abcdefg012345678$%"), plus) assert mult.parse("[a-g0-8$%\\^]+") == mult(charclass("abcdefg012345678$%^"), plus) assert mult.match("abcde[^fg]*", 5) == ( mult(~charclass("fg"), star), 11 ) assert mult.match("abcde[^fg]*h{5}[a-z]+", 11) == ( mult(charclass("h"), multiplier(bound(5), bound(5))), 15 ) assert mult.match("abcde[^fg]*h{5}[a-z]+T{1,}", 15) == ( mult(charclass("abcdefghijklmnopqrstuvwxyz"), plus), 21 ) assert mult.match("abcde[^fg]*h{5}[a-z]+T{2,}", 21) == ( mult(charclass("T"), multiplier(bound(2), inf)), 26 )
def test_multiplier_union(): assert zero | zero == zero assert zero | qm == qm assert zero | one == qm assert zero | star == star assert zero | plus == star assert qm | zero == qm assert qm | qm == qm assert qm | one == qm assert qm | star == star assert qm | plus == star assert one | zero == qm assert one | qm == qm assert one | one == one assert one | star == star assert one | plus == plus assert star | zero == star assert star | qm == star assert star | one == star assert star | star == star assert star | plus == star assert plus | zero == star assert plus | qm == star assert plus | one == plus assert plus | star == star assert plus | plus == plus assert not zero.canunion(multiplier(bound(2), inf)) assert not one.canunion(multiplier(bound(3), bound(4))) assert not multiplier(bound(8), inf).canunion(multiplier(bound(3), bound(4))) try: zero | multiplier(bound(7), bound(8)) assert False except AssertionError: assert False except Exception: pass
def test_bound(): assert min(bound(0), inf) == bound(0) assert min(bound(1), inf) == bound(1) assert qm.mandatory == bound(0) assert qm.optional == bound(1)
def test_conc_equality(): assert conc(mult(charclass("a"), one)) == conc(mult(charclass("a"), one)) assert conc(mult(charclass("a"), one)) != conc(mult(charclass("b"), one)) assert conc(mult(charclass("a"), one)) != conc(mult(charclass("a"), qm)) assert conc(mult(charclass("a"), one)) != conc(mult(charclass("a"), multiplier(bound(1), bound(2)))) assert conc(mult(charclass("a"), one)) != emptystring
def test_mult_equality(): assert mult(charclass("a"), one) == mult(charclass("a"), one) assert mult(charclass("a"), one) != mult(charclass("b"), one) assert mult(charclass("a"), one) != mult(charclass("a"), qm) assert mult(charclass("a"), one) != mult(charclass("a"), multiplier(bound(1), bound(2))) assert mult(charclass("a"), one) != charclass("a")
def test_mult_str(): assert str(bound(2)) == "2" assert str(inf) == "" assert str(multiplier(bound(2), inf)) == "{2,}" a = charclass("a") assert str(mult(a, one)) == "a" assert str(mult(a, multiplier(bound(2), bound(2)))) == "a{2}" assert str(mult(a, multiplier(bound(3), bound(3)))) == "a{3}" assert str(mult(a, multiplier(bound(4), bound(4)))) == "a{4}" assert str(mult(a, multiplier(bound(5), bound(5)))) == "a{5}" assert str(mult(a, qm)) == "a?" assert str(mult(a, star)) == "a*" assert str(mult(a, plus)) == "a+" assert str(mult(a, multiplier(bound(2), bound(5)))) == "a{2,5}" assert str(mult(a, multiplier(bound(2), inf))) == "a{2,}" assert str(mult(d, one)) == "\\d" assert str(mult(d, multiplier(bound(2), bound(2)))) == "\\d{2}" assert str(mult(d, multiplier(bound(3), bound(3)))) == "\\d{3}"