import pytest from phasm.type5.solver import Type5SolverException from ..helpers import Suite @pytest.mark.integration_test @pytest.mark.parametrize('inp', [9, 10, 11, 12]) def test_if_simple(inp): code_py = """ @exported def testEntry(a: i32) -> i32: if a > 10: return 15 return 3 """ exp_result = 15 if inp > 10 else 3 suite = Suite(code_py) result = suite.run_code(inp) assert exp_result == result.returned_value @pytest.mark.integration_test @pytest.mark.skip('Such a return is not how things should be') def test_if_complex(): code_py = """ @exported def testEntry(a: i32) -> i32: if a > 10: return 10 elif a > 0: return a else: return 0 return -1 # Required due to function type """ suite = Suite(code_py) assert 10 == suite.run_code(20).returned_value assert 10 == suite.run_code(10).returned_value assert 8 == suite.run_code(8).returned_value assert 0 == suite.run_code(0).returned_value assert 0 == suite.run_code(-1).returned_value @pytest.mark.integration_test def test_if_nested(): code_py = """ @exported def testEntry(a: i32, b: i32) -> i32: if a > 11: if b > 11: return 3 return 2 if b > 11: return 1 return 0 """ suite = Suite(code_py) assert 3 == suite.run_code(20, 20).returned_value assert 2 == suite.run_code(20, 10).returned_value assert 1 == suite.run_code(10, 20).returned_value assert 0 == suite.run_code(10, 10).returned_value @pytest.mark.integration_test def test_if_type_invalid(): code_py = """ @exported def testEntry(a: i32) -> i32: if a: return 1 return 0 """ with pytest.raises(Type5SolverException, match='i32 ~ bool'): Suite(code_py).run_code(1) @pytest.mark.integration_test def test_if_type_ok(): code_py = """ @exported def testEntry(a: bool) -> i32: if a: return 1 return 0 """ assert 1 == Suite(code_py).run_code(1).returned_value