def test_bounds_propagate_through_intersections(): x = rd.star(rd.char(b'\0\1')) y = rd.star(rd.char(b'\1\2')) assert isinstance( rd.bounded(rd.intersection(x, y), 3), rd.Intersection )
def test_merges_multiple_subtracts(): x = rd.star(rd.char(b'012')) y = rd.star(rd.char(b'0')) z = rd.star(rd.char(b'1')) t = rd.subtract(rd.subtract(x, y), z) assert t is rd.subtract(x, rd.union(y, z)) t = rd.subtract(x, rd.subtract(y, z)) assert t.nullable assert isinstance(t, rd.Union)
def test_bounds_propagate_through_subtraction(): x = rd.star(rd.char(b'\0\1')) y = rd.literal(b'\0\0\0\1') z = rd.subtract(x, y) b = rd.bounded(z, 10) assert isinstance(b, rd.Subtraction) assert isinstance(b.left, rd.Bounded)
def test_bounds_are_not_nested(): x = rd.bounded(rd.star(rd.char(0)), 7) y = rd.bounded(x, 5) assert x.bound == 7 assert y.bound == 5 assert isinstance(y.child, rd.Star)
def test_derivatives_of_intersection(): x = rd.star(rd.char(b'\0\1')) y = rd.star(rd.literal(b'\0\1')) z = rd.intersection(x, y) d1 = rd.derivative(z, 0) d2 = rd.derivative(d1, 1) assert d2 is z
def test_difference_of_same_is_none(): x = rd.char(0) assert rd.witness_difference(x, x) is None
def test_valid_starts_of_subtraction(): x = rd.star(rd.char(b'\0\1')) y = rd.char(b'\1') z = rd.subtract(x, y) assert rd.valid_starts(z) == pset([0, 1])
def test_removes_empty_from_unions(): c = rd.char(0) assert c is rd.union(rd.Empty, c)
def test_two_phase_dfa(): re = rd.concatenate(rd.star(rd.char(0)), rd.star(rd.char(1))) accepting, transitions = rd.build_dfa(re) assert accepting == [True, True] assert transitions == [{0: 0, 1: 1}, {1: 1}]
def test_complex_graphs_may_be_finite(): x = to_basic(rd.bounded( rd.union(rd.star(rd.char(0)), rd.star(rd.char(1))), 20)) assert not rd.is_infinite(x)
def test_can_walk_graph_for_infintiy(): assert rd.is_infinite(rd.intersection( rd.star(rd.char(b'01')), rd.star(rd.char(b'12')) ))
def test_basic_finite_are_not_infinite(): assert not rd.is_infinite(rd.Epsilon) assert not rd.is_infinite(rd.char(0))
def test_empty_subtraction_is_identity(): x = rd.char(0) assert rd.subtract(x, rd.Empty) is x
def test_self_subtraction_is_empty(): x = rd.char(0) assert rd.subtract(x, x) is rd.Empty
def test_rebalances_concatenation(): x = rd.char(0) y = rd.star(rd.char(1)) z = rd.char(2) assert rd.concatenate(x, rd.concatenate(y, z)) is \ rd.concatenate(rd.concatenate(x, y), z)
def test_single_concatenation_is_self(): assert rd.concatenate(rd.char(0)) is rd.char(0)
def test_valid_starts_of_nullable_cat(): x = rd.concatenate(rd.star(rd.char(0)), rd.char(1)) assert rd.valid_starts(x) == pset([0, 1])
def test_self_intersection_is_identity(): x = rd.char(0) assert rd.intersection(x, x, x) is x
def test_epsilon_prunes_down_intersections(): assert rd.intersection(rd.Epsilon, rd.star(rd.char(0))) is rd.Epsilon assert rd.intersection(rd.Epsilon, rd.char(0)) is rd.Empty
def test_difference_of_epsilon_and_non_nullable_is_epsilon(): assert rd.witness_difference(rd.char(0), rd.Epsilon) is b''
def test_lexmin_of_star_is_empty(): assert rd.lexmin(rd.star(rd.char(b'0'))) is b''
def test_subtraction_from_empty_is_empty(): x = rd.char(0) assert rd.subtract(rd.Empty, x) is rd.Empty
def test_union_of_infinite_and_finite_is_infinite(): assert rd.is_infinite(rd.union(rd.char(1), rd.star(rd.char(0))))
def test_subtraction_from_epsilon_checks_nullability(): assert rd.subtract(rd.Epsilon, rd.char(0)) is rd.Epsilon assert rd.subtract(rd.Epsilon, rd.star(rd.char(0))) is rd.Empty
def test_bounded_is_not_infinite(): assert not rd.is_infinite(rd.bounded(rd.star(rd.char(0)), 10 ** 6))
def test_flattens_unions(): x = rd.star(rd.char(0)) y = rd.star(rd.char(1)) z = rd.star(rd.char(2)) assert rd.union(x, rd.union(y, z)) is rd.union(rd.union(x, z), y)
def test_non_empty_star_dfa(): accepting, _ = rd.build_dfa(rd.nonempty(rd.star(rd.char(0)))) assert accepting == [False, True]
def test_derivatives_of_unions(): assert rd.derivative( rd.union(rd.star(rd.char(0)), rd.star(rd.char(1))), 0 ) is rd.star(rd.char(0))
def test_trival_dfa_from_intersection(): assert rd.build_dfa( rd.intersection(rd.char(b'\x00'), rd.char(b'\x00\x01'))) == ( [False, True], [{0: 1}, {}] )
def test_flattens_intersections(): x = rd.star(rd.char(b'01')) y = rd.star(rd.char(b'02')) z = rd.star(rd.char(b'03')) assert rd.intersection(x, rd.intersection(y, z)) is \ rd.intersection(rd.intersection(x, z), y)