def test_consume_multiple_options(): """ A test to take the element of the top of a stack """ class Sequence(Composite): def __init__(self, parent=None, next_from_parent=None): super(Sequence, self).__init__(parent, next_from_parent) self.add_option([ABC, DEF]) self.add_option([DEF]) class ABC(Composite): def __init__(self, parent=None, next_from_parent=None, prior=None): super(ABC, self).__init__(parent, next_from_parent, prior) self.add_option([A,B,C]) self.add_option([B,C]) self.add_option([A]) class DEF(Composite): def __init__(self, parent=None, next_from_parent=None, prior=None): super(DEF, self).__init__(parent, next_from_parent, prior) self.add_option([D,E,F]) self.add_option([A]) self.add_option([B, C, D]) class A(Primitive): pass class B(Primitive): pass class C(Primitive): pass class D(Primitive): pass class E(Primitive): pass class F(Primitive): pass stack = Stack(Sequence) input_string = [A, B, C, D, E, F] accept_stack = stack.consume(input_string) print(accept_stack) assert len(accept_stack) >0 assert all([len(row) == len(input_string) + 2 for row in accept_stack])