Exemplo n.º 1
0
def test_or():
    exp = Group(Literal('+'),
                Literal('-'),
                OR=True,
                repetition=Quantification(min=0, max=1))
    assert format(exp) == r'(\+|\-)?'
    exp |= Decimal() | Group(Decimal(), Literal('.'), Decimal())
    assert format(exp) == r'((\+|\-)?|(\d|(\d\.\d)))'
    assert str(
        exp
    ) == "((+<OR>-)<0,1GREATEST><OR>(<D><OR>(<D>.<D>)<1,1GREATEST>)<1,1GREATEST>)<1,1GREATEST>"
Exemplo n.º 2
0
def test_and():
    exp = StringStart() & 'Title'
    assert format(exp) == r'\ATitle'
    exp &= Group(Whitespace(), repetition=Quantification(
        min=0, max=0)) & ':' & Word()
    assert format(exp) == r'(\ATitle(((\s)*:)\w))'
    exp &= '\n'
    assert format(exp) == '((\ATitle(((\s)*:)\w))\\\n)'
    exp &= Group(Whitespace(), repetition=Quantification(
        min=1, max=0)) & 'H' & 'e' & 'a' & 'd' & 'e' & 'r'
    assert format(
        exp) == '(((\ATitle(((\s)*:)\w))\\\n)(((((((\s)+H)e)a)d)e)r))'
    exp &= StringEnd()
    assert format(
        exp) == '((((\ATitle(((\s)*:)\w))\\\n)(((((((\s)+H)e)a)d)e)r))\Z)'
    assert str(
        exp
    ) == '((((<SOS>Title(((<SPACE>)<0,GREATEST>:)<1,1GREATEST><WORD>)<1,1GREATEST>)<1,1GREATEST>\n)<1,1GREATEST>(((((((<SPACE>)<1,GREATEST>H)<1,1GREATEST>e)<1,1GREATEST>a)<1,1GREATEST>d)<1,1GREATEST>e)<1,1GREATEST>r)<1,1GREATEST>)<1,1GREATEST><EOS>)<1,1GREATEST>'
Exemplo n.º 3
0
def test_building():
    colors = Group(Sequence('blue'), Sequence('green'), Sequence('orange'),
                   Sequence('red'), Sequence('violet'), Sequence('yellow'),
                   OR=True, repetition=Quantification(min=0, max=1))
    assert str(colors) == '(blue<OR>green<OR>orange<OR>red<OR>violet<OR>yellow)<0,1GREATEST>'

    sizes = Group(Sequence('huge'), Sequence('large'), Sequence('medium'),
                  Sequence('small'), Sequence('tiny'), OR=True,
                  repetition=Quantification(min=0, max=1))
    assert str(sizes) == '(huge<OR>large<OR>medium<OR>small<OR>tiny)<0,1GREATEST>'

    positions = Group(Sequence('first'), Sequence('last'), Sequence('second'), Sequence('third'), OR=True)
    assert str(positions) == '(first<OR>last<OR>second<OR>third)<1,1GREATEST>'

    noun = Group(UpperAscii(), Group(LowerAscii(), repetition=Quantification(min=0, max=0)))
    assert str(noun) == r'({A,Z}({a,z})<0,GREATEST>)<1,1GREATEST>'

    spacing = Group(Whitespace(), repetition=Quantification(min=1, max=0))
    assert str(spacing) == r'(<SPACE>)<1,GREATEST>'

    entry = Group(positions, spacing, sizes, spacing, colors, spacing, noun)

    listing = Group(Group(entry, LineEnd(), repetition=Quantification(min=3)), entry)
Exemplo n.º 4
0
def test_range_or():
    forward = Range('A') | 'B'
    backward = 'A' | Range('B')
    assert forward == backward
    assert forward == Range('A', 'B')

    forward = Range('A') | 'BC'
    backward = 'A' | Range('B', 'C')
    assert forward != backward
    assert forward == Group(Range('A'), Sequence('BC'), OR=True)
    assert backward == Range('A', 'B', 'C')

    forward = Range('A', 'B') | 'C'
    backward = 'AB' | Range('C')
    assert forward != backward
    assert forward == Range('A', 'B', 'C')
    assert backward == Group(Sequence('AB'), Range('C'), OR=True)

    forward = Range('A', 'B') | 'CD'
    backward = 'AB' | Range('C', 'D')
    assert forward != backward
    assert forward == Group(Range('A', 'B'), Sequence('CD'), OR=True)
    assert backward == Group(Sequence('AB'), Range('C', 'D'), OR=True)

    forward = Range('A') | 'BCDE'
    backward = 'A' | Range(('B', 'E'))
    assert forward != backward
    assert forward == Group(Range('A'), Sequence('BCDE'), OR=True)
    assert backward == Range('A', ('B', 'E'))

    forward = Range(('A', 'D')) | 'E'
    backward = 'ABCD' | Range('E')
    assert forward != backward
    assert forward == Range(('A', 'E'))
    assert backward == Group(Sequence('ABCD'), Range('E'), OR=True)

    forward = Range(('A', 'C')) | 'DE'
    backward = 'AB' | Range(('C', 'E'))
    assert forward != backward
    assert forward != backward
    assert forward == Group(Range(('A', 'C')), Sequence('DE'), OR=True)
    assert backward == Group(Sequence('AB'), Range(('C', 'E')), OR=True)
Exemplo n.º 5
0
    def __init__(self):
        self.metachar = '\\p'
        self.short_desc = 'TEST'

@pytest.mark.parametrize("illegal", [
    Literal('A'),
    DummyPosition(),
])
def test_format_abstract_runtime_error(illegal):
    with pytest.raises(RuntimeError):
        _format_abstract(illegal)

@pytest.mark.parametrize("illegal", [
    Quantification(),
    Range(('A', 'z')),
    Group(Literal('0'), Literal('1')),
])
def test_format_abstract_type_error(illegal):
    with pytest.raises(TypeError):
        _format_abstract(illegal)

@pytest.mark.parametrize("range,expected", [
    (Range('A', invert=False), '[A]'),
    (Range('A', 'B', 'z', invert=False), '[ABz]'),
    (Range('A', '%', '-', invert=False), r'[%\-A]'),
    (Range('z', 'z', '%', '^', invert=False), r'[%\^z]'),
    (Range('A', '\u03A9', 'z', '\u03B0', invert=False), '[Az\u03A9\u03B0]'),
    (Range('A', invert=True), '[^A]'),
    (Range('A', 'B', 'z', invert=True), '[^ABz]'),
    (Range('A', '%', '-', invert=True), r'[^%\-A]'),
    (Range('z', 'z', '%', '^', invert=True), r'[^%\^z]'),
Exemplo n.º 6
0
def test_literal_and():
    forward = Literal('R') & 'E'
    backward = 'R' & Literal('E')
    assert forward == backward
    assert forward == Sequence('R', 'E')

    forward = Literal('R') & 'ED'
    backward = 'RE' & Literal('D')
    assert forward == backward
    assert forward == Sequence('R', 'E', 'D')

    forward = Literal('R') & Literal('E')
    assert forward == Sequence('R', 'E')

    forward = Literal('R') & Sequence('E')
    backward = Sequence('R') & Literal('E')
    assert forward == backward
    assert forward == Sequence('R', 'E')

    forward = Literal('R') & Sequence('E', 'D')
    backward = Sequence('R', 'E') & Literal('D')
    assert forward == backward
    assert forward == Sequence('R', 'E', 'D')

    forward = Literal('R') & Range('E')
    backward = Range('R') & Literal('E')
    assert forward != backward
    assert forward == Group(Literal('R'), Range('E'))
    assert backward == Group(Range('R'), Literal('E'))

    forward = Literal('R') & Range(('E', 'D'))
    backward = Range(('R', 'E')) & Literal('D')
    assert forward != backward
    assert forward == Group(Literal('R'), Range(('E', 'D')))
    assert backward == Group(Range(('R', 'E')), Literal('D'))

    forward = Literal('R') & Group(*(Literal('E'), ))
    backward = Group(*(Literal('R'), )) & Literal('E')
    assert forward != backward
    assert forward == Group(Literal('R'), Group(*(Literal('E'), )))
    assert backward == Group(Group(*(Literal('R'), )), Literal('E'))

    forward = Literal('R') & Group(*(Literal('E'), Literal('D')))
    backward = Group(*(Literal('R'), Literal('E'))) & Literal('D')
    assert forward != backward
    assert forward == Group(Literal('R'), Group(*(Literal('E'), Literal('D'))))
    assert backward == Group(Group(*(Literal('R'), Literal('E'))),
                             Literal('D'))
Exemplo n.º 7
0
def test_range_and():
    forward = Range('A') & 'B'
    backward = 'A' & Range('B')
    assert forward != backward
    assert forward == Group(Range('A'), Literal('B'))
    assert backward == Group(Literal('A'), Range('B'))

    forward = Range('A') & 'BC'
    backward = 'A' & Range('B', 'C')
    assert forward != backward
    assert forward == Group(Range('A'), Sequence('BC'))
    assert backward == Group(Literal('A'), Range('B', 'C'))

    forward = Range('A', 'B') & 'C'
    backward = 'AB' & Range('C')
    assert forward != backward
    assert forward == Group(Range('A', 'B'), Literal('C'))
    assert backward == Group(Sequence('AB'), Range('C'))

    forward = Range('A', 'B') & 'CD'
    backward = 'AB' & Range('C', 'D')
    assert forward != backward
    assert forward == Group(Range('A', 'B'), Sequence('CD'))
    assert backward == Group(Sequence('AB'), Range('C', 'D'))

    forward = Range('A') & 'BCDE'
    backward = 'A' & Range(('B', 'E'))
    assert forward != backward
    assert forward == Group(Range('A'), Sequence('BCDE'))
    assert backward == Group(Literal('A'), Range(('B', 'E')))

    forward = Range(('A', 'D')) & 'E'
    backward = 'ABCD' & Range('E')
    assert forward != backward
    assert forward == Group(Range(('A', 'D')), Literal('E'))
    assert backward == Group(Sequence('ABCD'), Range('E'))

    forward = Range(('A', 'C')) & 'DE'
    backward = 'AB' & Range(('C', 'E'))
    assert forward != backward
    assert forward == Group(Range(('A', 'C')), Sequence('DE'))
    assert backward == Group(Sequence('AB'), Range(('C', 'E')))
Exemplo n.º 8
0
def test_sequence_or():
    forward = Sequence('A') | 'B'
    backward = 'A' | Sequence('B')
    assert forward != backward
    assert forward == Group(Sequence('A'), Literal('B'), OR=True)
    assert backward == Group(Literal('A'), Sequence('B'), OR=True)

    forward = Sequence('A') | 'BC'
    backward = 'A' | Sequence('BC')
    assert forward != backward
    assert forward == Group(Sequence('A'), Sequence('BC'), OR=True)
    assert backward == Group(Literal('A'), Sequence('BC'), OR=True)

    forward = Sequence('AB') | 'C'
    backward = 'AB' | Sequence('C')
    assert forward != backward
    assert forward == Group(Sequence('AB'), Literal('C'), OR=True)
    assert backward == Group(Sequence('AB'), Sequence('C'), OR=True)

    forward = Sequence('AB') | 'CD'
    backward = 'AB' | Sequence('CD')
    assert forward == backward
    assert forward == Group(Sequence('A', 'B'), Sequence('C', 'D'), OR=True)

    forward = Sequence('A') | Sequence('B')
    assert forward == Group(Sequence('A'), Sequence('B'), OR=True)

    forward = Sequence('AB') | Sequence('CD')
    assert forward == Group(Sequence('AB'), Sequence('CD'), OR=True)

    forward = Sequence('A') | Sequence('BC')
    backward = Sequence('AB') | Sequence('C')
    assert forward != backward
    assert forward == Group(Sequence('A'), Sequence('BC'), OR=True)
    assert backward == Group(Sequence('AB'), Sequence('C'), OR=True)

    forward = Sequence('A', 'B', 'C') | Sequence('D', 'E')
    backward = Sequence('A', 'B') | Sequence('C', 'D', 'E')
    assert forward != backward
    assert forward == Group(Sequence('ABC'), Sequence('DE'), OR=True)
    assert backward == Group(Sequence('AB'), Sequence('CDE'), OR=True)

    forward = Sequence('A') | Range('B')
    backward = Range('A') | Sequence('B')
    assert forward != backward
    assert forward == Group(Sequence('A'), Range('B'), OR=True)
    assert backward == Group(Range('A'), Sequence('B'), OR=True)

    forward = Sequence('A') | Range('B', 'C', 'D')
    backward = Range('A') | Sequence('B', 'C', 'D')
    assert forward != backward
    assert forward == Group(Sequence('A'), Range('B', 'C', 'D'), OR=True)
    assert backward == Group(Range('A'), Sequence('B', 'C', 'D'), OR=True)

    forward = Sequence('A', 'B', 'C') | Range('D')
    backward = Range('A', 'B', 'C') | Sequence('D')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'), Range('D'), OR=True)
    assert backward == Group(Range('A', 'B', 'C'), Sequence('D'), OR=True)

    forward = Sequence('A', 'B', 'C') | Range('D', 'E', 'F')
    backward = Range('A', 'B', 'C') | Sequence('D', 'E', 'F')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'),
                            Range('D', 'E', 'F'),
                            OR=True)
    assert backward == Group(Range('A', 'B', 'C'),
                             Sequence('D', 'E', 'F'),
                             OR=True)

    forward = Sequence('A') | Group(Literal('B'))
    backward = Group(Literal('A')) | Sequence('B')
    assert forward != backward
    assert forward == Group(Sequence('A'), Group(Literal('B')), OR=True)
    assert backward == Group(Group(Literal('A')), Sequence('B'), OR=True)

    forward = Sequence('A') | Group(Sequence('B', 'C', 'D'))
    backward = Group(Literal('A')) | Sequence('B', 'C', 'D')
    assert forward != backward
    assert forward == Group(Sequence('A'),
                            Group(Sequence('B', 'C', 'D')),
                            OR=True)
    assert backward == Group(Group(Literal('A')),
                             Sequence('B', 'C', 'D'),
                             OR=True)

    forward = Sequence('A', 'B', 'C') | Group(Literal('D'))
    backward = Group(Sequence('A', 'B', 'C')) | Sequence('D')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'),
                            Group(Literal('D')),
                            OR=True)
    assert backward == Group(Group(Sequence('A', 'B', 'C')),
                             Sequence('D'),
                             OR=True)

    forward = Sequence('A', 'B', 'C') | Group(Sequence('D', 'E', 'F'))
    backward = Group(Sequence('A', 'B', 'C')) | Sequence('D', 'E', 'F')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'),
                            Group(Sequence('D', 'E', 'F')),
                            OR=True)
    assert backward == Group(Group(Sequence('A', 'B', 'C')),
                             Sequence('D', 'E', 'F'),
                             OR=True)
Exemplo n.º 9
0
def test_sequence_and():
    forward = Sequence('A') & 'B'
    backward = 'A' & Sequence('B')
    assert forward == backward
    assert forward == Sequence('AB')

    forward = Sequence('A') & 'BC'
    backward = 'A' & Sequence('BC')
    assert forward == backward
    assert forward == Sequence('ABC')

    forward = Sequence('AB') & 'C'
    backward = 'AB' & Sequence('C')
    assert forward == backward
    assert forward == Sequence('ABC')

    forward = Sequence('AB') & 'CD'
    backward = 'AB' & Sequence('CD')
    assert forward == backward
    assert forward == Sequence('A', 'B', 'C', 'D')

    forward = Sequence('A') & Sequence('B')
    assert forward == Sequence('A', 'B')

    forward = Sequence('AB') & Sequence('CD')
    assert forward == Sequence('AB', 'CD')

    forward = Sequence('A') & Sequence('BC')
    backward = Sequence('AB') & Sequence('C')
    assert forward == backward
    assert forward == Sequence('ABC')

    forward = Sequence('A', 'B', 'C') & Sequence('D', 'E')
    backward = Sequence('A', 'B') & Sequence('C', 'D', 'E')
    assert forward == backward
    assert forward == Sequence('A', 'B', 'C', 'D', 'E')

    forward = Sequence('A') & Range('B')
    backward = Range('A') & Sequence('B')
    assert forward != backward
    assert forward == Group(Sequence('A'), Range('B'))
    assert backward == Group(Range('A'), Sequence('B'))

    forward = Sequence('A') & Range('B', 'C', 'D')
    backward = Range('A') & Sequence('B', 'C', 'D')
    assert forward != backward
    assert forward == Group(Sequence('A'), Range('B', 'C', 'D'))
    assert backward == Group(Range('A'), Sequence('B', 'C', 'D'))

    forward = Sequence('A', 'B', 'C') & Range('D')
    backward = Range('A', 'B', 'C') & Sequence('D')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'), Range('D'))
    assert backward == Group(Range('A', 'B', 'C'), Sequence('D'))

    forward = Sequence('A', 'B', 'C') & Range('D', 'E', 'F')
    backward = Range('A', 'B', 'C') & Sequence('D', 'E', 'F')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'), Range('D', 'E', 'F'))
    assert backward == Group(Range('A', 'B', 'C'), Sequence('D', 'E', 'F'))

    forward = Sequence('A') & Group(Literal('B'))
    backward = Group(Literal('A')) & Sequence('B')
    assert forward != backward
    assert forward == Group(Sequence('A'), Group(Literal('B')))
    assert backward == Group(Group(Literal('A')), Sequence('B'))

    forward = Sequence('A') & Group(Sequence('B', 'C', 'D'))
    backward = Group(Literal('A')) & Sequence('B', 'C', 'D')
    assert forward != backward
    assert forward == Group(Sequence('A'), Group(Sequence('B', 'C', 'D')))
    assert backward == Group(Group(Literal('A')), Sequence('B', 'C', 'D'))

    forward = Sequence('A', 'B', 'C') & Group(Literal('D'))
    backward = Group(Sequence('A', 'B', 'C')) & Sequence('D')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'), Group(Literal('D')))
    assert backward == Group(Group(Sequence('A', 'B', 'C')), Sequence('D'))

    forward = Sequence('A', 'B', 'C') & Group(Sequence('D', 'E', 'F'))
    backward = Group(Sequence('A', 'B', 'C')) & Sequence('D', 'E', 'F')
    assert forward != backward
    assert forward == Group(Sequence('A', 'B', 'C'),
                            Group(Sequence('D', 'E', 'F')))
    assert backward == Group(Group(Sequence('A', 'B', 'C')),
                             Sequence('D', 'E', 'F'))
Exemplo n.º 10
0
def test_abstract_or():
    forward = DummyPosition() | 'E'
    backward = 'E' | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Literal('E'), OR=True)
    assert backward == Group(Literal('E'), DummyPosition(), OR=True)

    forward = DummyPosition() | 'ED'
    backward = 'ED' | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Sequence('E', 'D'), OR=True)
    assert backward == Group(Sequence('E', 'D'), DummyPosition(), OR=True)

    forward = DummyPosition() | DummyPosition()
    assert forward == Group(DummyPosition(), DummyPosition(), OR=True)

    forward = DummyPosition() | Literal('E')
    backward = Literal('E') | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Literal('E'), OR=True)
    assert backward == Group(Literal('E'), DummyPosition(), OR=True)

    forward = DummyPosition() | Sequence('E')
    backward = Sequence('E') | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Sequence('E'), OR=True)
    assert backward == Group(Sequence('E'), DummyPosition(), OR=True)

    forward = DummyPosition() | Sequence('E', 'D')
    backward = Sequence('E', 'D') | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Sequence('E', 'D'), OR=True)
    assert backward == Group(Sequence('E', 'D'), DummyPosition(), OR=True)

    forward = DummyPosition() | Range('E')
    backward = Range('E') | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Range('E'), OR=True)
    assert backward == Group(Range('E'), DummyPosition(), OR=True)

    forward = DummyPosition() | Range('E', 'D')
    backward = Range('E', 'D') | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Range('E', 'D'), OR=True)
    assert backward == Group(Range('E', 'D'), DummyPosition(), OR=True)

    forward = DummyPosition() | Group(*(DummyPosition(), ))
    backward = Group(*(DummyPosition(), )) | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(),
                            Group(*(DummyPosition(), )),
                            OR=True)
    assert backward == Group(Group(*(DummyPosition(), )),
                             DummyPosition(),
                             OR=True)

    forward = DummyPosition() | Group(*(DummyPosition(), DummyPosition()))
    backward = Group(*(DummyPosition(), DummyPosition())) | DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(),
                            Group(*(DummyPosition(), DummyPosition())),
                            OR=True)
    assert backward == Group(Group(*(DummyPosition(), DummyPosition())),
                             DummyPosition(),
                             OR=True)
Exemplo n.º 11
0
def test_abstract_and():
    forward = DummyPosition() & 'E'
    backward = 'E' & DummyPosition()
    assert forward != backward
    assert forward == Sequence(DummyPosition(), 'E')
    assert backward == Sequence('E', DummyPosition())

    forward = DummyPosition() & 'ED'
    backward = 'ED' & DummyPosition()
    assert forward != backward
    assert forward == Sequence(DummyPosition(), 'E', 'D')
    assert backward == Sequence('E', 'D', DummyPosition())

    forward = DummyPosition() & DummyPosition()
    assert forward == Sequence(DummyPosition(), DummyPosition())

    forward = DummyPosition() & Literal('E')
    backward = Literal('E') & DummyPosition()
    assert forward != backward
    assert forward == Sequence(DummyPosition(), Literal('E'))
    assert backward == Sequence(Literal('E'), DummyPosition())

    forward = DummyPosition() & Sequence('E')
    backward = Sequence('E') & DummyPosition()
    assert forward != backward
    assert forward == Sequence(DummyPosition(), 'E')
    assert backward == Sequence('E', DummyPosition())

    forward = DummyPosition() & Sequence('E', 'D')
    backward = Sequence('E', 'D') & DummyPosition()
    assert forward != backward
    assert forward == Sequence(DummyPosition(), 'E', 'D')
    assert backward == Sequence('E', 'D', DummyPosition())

    forward = DummyPosition() & Range('E')
    backward = Range('E') & DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Range('E'))
    assert backward == Group(Range('E'), DummyPosition())

    forward = DummyPosition() & Range(('E', 'D'))
    backward = Range(('E', 'D')) & DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Range(('E', 'D')))
    assert backward == Group(Range(('E', 'D')), DummyPosition())

    forward = DummyPosition() & Group(*(DummyPosition(), ))
    backward = Group(*(DummyPosition(), )) & DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(), Group(*(DummyPosition(), )))
    assert backward == Group(Group(*(DummyPosition(), )), DummyPosition())

    forward = DummyPosition() & Group(*(DummyPosition(), DummyPosition()))
    backward = Group(*(DummyPosition(), DummyPosition())) & DummyPosition()
    assert forward != backward
    assert forward == Group(DummyPosition(),
                            Group(*(DummyPosition(), DummyPosition())))
    assert backward == Group(Group(*(DummyPosition(), DummyPosition())),
                             DummyPosition())
Exemplo n.º 12
0
def test_literal_or():
    forward = Literal('R') | 'E'
    backward = 'R' | Literal('E')
    assert forward == backward
    assert forward == Range('R', 'E')

    forward = Literal('R') | 'ED'
    backward = 'RE' | Literal('D')
    assert forward != backward
    assert forward == Group(Literal('R'), Sequence('E', 'D'), OR=True)
    assert backward == Group(Sequence('R', 'E'), Literal('D'), OR=True)

    forward = Literal('R') | Literal('E')
    assert forward == Range('R', 'E')

    forward = Literal('R') | Sequence('E')
    backward = Sequence('R') | Literal('E')
    assert forward != backward
    assert forward == Group(Literal('R'), Sequence('E'), OR=True)
    assert backward == Group(Sequence('R'), Literal('E'), OR=True)

    forward = Literal('R') | Sequence('E', 'D')
    backward = Sequence('R', 'E') | Literal('D')
    assert forward != backward
    assert forward == Group(Literal('R'), Sequence('E', 'D'), OR=True)
    assert backward == Group(Sequence('R', 'E'), Literal('D'), OR=True)

    forward = Literal('R') | Range('E')
    backward = Range('R') | Literal('E')
    assert forward == backward
    assert forward == Range('R', 'E')
    assert backward == Range('R', 'E')

    forward = Literal('R') | Range('E', 'D')
    backward = Range('R', 'E') | Literal('D')
    assert forward == backward
    assert forward == Range('R', 'E', 'D')
    assert backward == Range('R', 'E', 'D')

    forward = Literal('R') | Group(*(Literal('E'), ))
    backward = Group(*(Literal('R'), )) | Literal('E')
    assert forward != backward
    assert forward == Group(Literal('R'), Group(*(Literal('E'), )), OR=True)
    assert backward == Group(Group(*(Literal('R'), )), Literal('E'), OR=True)

    forward = Literal('R') | Group(*(Literal('E'), Literal('D')))
    backward = Group(*(Literal('R'), Literal('E'))) | Literal('D')
    assert forward != backward
    assert forward == Group(Literal('R'),
                            Group(*(Literal('E'), Literal('D'))),
                            OR=True)

    assert backward == Group(Group(*(Literal('R'), Literal('E'))),
                             Literal('D'),
                             OR=True)