def test_invalid_argument_types(self): with pytest.raises(FunctionArgumentsError): stack = Stack() stack.add_variable("var", Set(Real)) stack.add_variable("func", Function((([Integer, List(Integer)]), Integer))) tree = tr("func_call", "func", tr("int_literal", "1"), tr("variable", "var")) parser.handle(tree, stack)
def test_invalid_arguments_count_many(self): with pytest.raises(FunctionArgumentsError): stack = Stack() stack.add_variable("func", Function(([Integer, Integer], Integer))) tree = tr("func_call", "func", tr("int_literal", "1"), tr("int_literal", "1"), tr("int_literal", "1")) parser.handle(tree, stack)
def test_variable_exist(): tree = tr("variable", "a") stack = Stack() stack.add_variable("a", Integer) expression: Expression = parser.handle(tree, stack) assert expression.type == Integer assert expression.expression == ["var_0"]
def test_for_loop_wrong_iterator_type(): with pytest.raises(ValueTypeError): stack = Stack() stack.add_variable("var", Bool) stack.add_variable("range", List(Integer)) tree = tr("for_expression", "var", tr("variable", "range"), tr("int_literal", "1")) parser.handle(tree, stack)
def test_globals(): stack = Stack() stack.add_global("a", List(Integer)) stack.add_variable("b", Real) g = stack.get_variable("a") assert g.type == List(Integer) assert g.number == -1 stack.add_variable("a", Bool) g = stack.get_variable("a") assert g.type == Bool assert g.number == 1
def test_for_loop_existing_var(): stack = Stack() stack.add_variable("var", Real) stack.add_variable("range", List(Integer)) tree = tr("for_expression", "var", tr("variable", "range"), tr("int_literal", "1")) expression = parser.handle(tree, stack) assert isinstance(expression, ForLoopExpression) assert expression.iterator == "var_0" assert expression.range.expression == ["var_1"] assert expression.actions[0].expression == ["1"]
def test_frames(): stack = Stack() assert stack.add_variable("a", Integer) == 0 assert stack.add_variable("b", Real) == 1 stack.add_frame() assert stack.add_variable("b", List(Integer)) == 2 assert stack.add_variable("c", Bool) == 3 assert stack.get_variable("b").type == List(Integer) stack.pop_frame() assert stack.get_variable("b").type == Real assert stack.get_variable("c") is None assert stack.add_variable("c", List(Integer)) == 2
def test_function_call(self, is_global): stack = Stack() stack.add_variable("array", List(Integer)) func = Function(([Integer, Real, List(Integer)], Void)) if is_global: stack.add_global("func", func) else: stack.add_variable("func", func) tree = tr("func_call", "func", tr("int_literal", "1"), tr("int_literal", "2"), tr("variable", "array")) expression = parser.handle(tree, stack) assert expression.type == Void func_name = "func" if is_global else "var_1" assert expression.expression == [func_name, "(", "1", ", ", "2", ", ", "var_0", ")"]
def test_var_assignment(self): stack = Stack() stack.add_variable("var", Real) tree = tr("var_assignment", "var", tr("int_literal", "42")) expression = parser.handle(tree, stack) assert expression.expression == ["var_0", " = ", "42"]