import pytest from phasm.exceptions import StaticError from ..constants import COMPLETE_PRIMITIVE_TYPES, TYPE_MAP from ..helpers import Suite @pytest.mark.integration_test @pytest.mark.parametrize('type_', COMPLETE_PRIMITIVE_TYPES) def test_module_constant(type_): code_py = f""" CONSTANT: {type_}[3] = (24, 57, 80, ) @exported def testEntry() -> {type_}: return CONSTANT[0] """ 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_', COMPLETE_PRIMITIVE_TYPES) def test_static_array_indexed(type_): code_py = f""" CONSTANT: {type_}[3] = (24, 57, 80, ) @exported def testEntry() -> {type_}: return helper(CONSTANT, 0, 1, 2) def helper(array: {type_}[3], i0: u32, i1: u32, i2: u32) -> {type_}: return array[i0] + array[i1] + array[i2] """ result = Suite(code_py).run_code() assert 161 == result.returned_value assert TYPE_MAP[type_] == type(result.returned_value) @pytest.mark.integration_test @pytest.mark.parametrize('type_', COMPLETE_PRIMITIVE_TYPES) def test_function_call(type_): code_py = f""" CONSTANT: {type_}[3] = (24, 57, 80, ) @exported def testEntry() -> {type_}: return helper(CONSTANT) def helper(array: {type_}[3]) -> {type_}: return array[0] + array[1] + array[2] """ result = Suite(code_py).run_code() assert 161 == result.returned_value assert TYPE_MAP[type_] == type(result.returned_value) @pytest.mark.integration_test def test_static_array_constant_too_few_values(): code_py = """ CONSTANT: u8[3] = (24, 57, ) """ with pytest.raises(StaticError, match='Static error on line 2: Invalid number of static array values'): phasm_parse(code_py) @pytest.mark.integration_test def test_static_array_constant_too_many_values(): code_py = """ CONSTANT: u8[3] = (24, 57, 1, 1, ) """ with pytest.raises(StaticError, match='Static error on line 2: Invalid number of static array values'): phasm_parse(code_py) @pytest.mark.integration_test def test_static_array_constant_type_mismatch(): code_py = """ CONSTANT: u8[3] = (24, 4000, 1, ) """ with pytest.raises(StaticError, match='Static error on line 2: Integer value out of range; expected 0..255, actual 4000'): phasm_parse(code_py) @pytest.mark.integration_test def test_static_array_index_out_of_bounds(): code_py = """ CONSTANT0: u32[3] = (24, 57, 80, ) CONSTANT1: u32[16] = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ) @exported def testEntry() -> u32: return CONSTANT0[16] """ result = Suite(code_py).run_code() assert 0 == result.returned_value