Removed the separate ModuleConstantRef since you can tell by the variable property of VariableReference. We'll also add local variables there later on.
104 lines
2.6 KiB
Python
104 lines
2.6 KiB
Python
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
|