import pytest from phasm.type3.entry import Type3Exception from ..constants import ( ALL_INT_TYPES, TYPE_MAP ) from ..helpers import Suite @pytest.mark.integration_test def test_module_constant_def(): code_py = """ class SomeStruct: value0: u8 value1: u32 value2: u64 CONSTANT: SomeStruct = SomeStruct(250, 250000, 250000000) @exported def testEntry() -> i32: return 0 """ result = Suite(code_py).run_code() assert 0 == result.returned_value @pytest.mark.integration_test @pytest.mark.parametrize('type_', ALL_INT_TYPES) def test_module_constant(type_): code_py = f""" class CheckedValue: value: {type_} CONSTANT: CheckedValue = CheckedValue(24) @exported def testEntry() -> {type_}: return CONSTANT.value """ result = Suite(code_py).run_code() assert 24 == result.returned_value assert TYPE_MAP[type_] == type(result.returned_value) @pytest.mark.integration_test @pytest.mark.parametrize('type_', ALL_INT_TYPES) def test_struct_0(type_): code_py = f""" class CheckedValue: value: {type_} @exported def testEntry() -> {type_}: return helper(CheckedValue(23)) def helper(cv: CheckedValue) -> {type_}: return cv.value """ result = Suite(code_py).run_code() assert 23 == result.returned_value @pytest.mark.integration_test def test_struct_1(): code_py = """ class Rectangle: height: i32 width: i32 border: i32 @exported def testEntry() -> i32: return helper(Rectangle(100, 150, 2)) def helper(shape: Rectangle) -> i32: return shape.height + shape.width + shape.border """ result = Suite(code_py).run_code() assert 252 == result.returned_value @pytest.mark.integration_test def test_struct_2(): code_py = """ class Rectangle: height: i32 width: i32 border: i32 @exported def testEntry() -> i32: return helper(Rectangle(100, 150, 2), Rectangle(200, 90, 3)) def helper(shape1: Rectangle, shape2: Rectangle) -> i32: return shape1.height + shape1.width + shape1.border + shape2.height + shape2.width + shape2.border """ result = Suite(code_py).run_code() assert 545 == result.returned_value @pytest.mark.integration_test def test_returned_struct(): code_py = """ class CheckedValue: value: u8 CONSTANT: CheckedValue = CheckedValue(199) def helper() -> CheckedValue: return CONSTANT def helper2(x: CheckedValue) -> u8: return x.value @exported def testEntry() -> u8: return helper2(helper()) """ result = Suite(code_py).run_code() assert 199 == result.returned_value @pytest.mark.integration_test def test_type_mismatch_arg_module_constant(): code_py = """ class Struct: param: f32 STRUCT: Struct = Struct(1) """ with pytest.raises(Type3Exception, match='Must be real'): Suite(code_py).run_code() @pytest.mark.integration_test @pytest.mark.parametrize('type_', ['i32', 'i64', 'f32', 'f64']) def test_type_mismatch_struct_member(type_): code_py = f""" class Struct: param: {type_} def testEntry(arg: Struct) -> (i32, i32, ): return arg.param """ with pytest.raises(Type3Exception, match=type_ + r' must be tuple \(i32\) \(i32\) instead'): Suite(code_py).run_code()