Doesn't give right answer yet and out of bound check fails. No constructor yet for static arrays, but module constants work. Which don't work yet for tuples and structs. Also, u32 for indexing please. Also, more module constant types.
110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
import pytest
|
|
|
|
from phasm.parser import phasm_parse
|
|
from phasm.exceptions import StaticError
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.parametrize('type_', ['i32', 'i64', 'f32', 'f64'])
|
|
def test_type_mismatch_function_argument(type_):
|
|
code_py = f"""
|
|
def helper(a: {type_}) -> (i32, i32, ):
|
|
return a
|
|
"""
|
|
|
|
with pytest.raises(StaticError, match=f'Static error on line 3: Expected \\(i32, i32, \\), a is actually {type_}'):
|
|
phasm_parse(code_py)
|
|
|
|
@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(StaticError, match=f'Static error on line 6: Expected \\(i32, i32, \\), arg.param is actually {type_}'):
|
|
phasm_parse(code_py)
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.parametrize('type_', ['i32', 'i64', 'f32', 'f64'])
|
|
def test_type_mismatch_tuple_member(type_):
|
|
code_py = f"""
|
|
def testEntry(arg: ({type_}, )) -> (i32, i32, ):
|
|
return arg[0]
|
|
"""
|
|
|
|
with pytest.raises(StaticError, match=f'Static error on line 3: Expected \\(i32, i32, \\), arg\\[0\\] is actually {type_}'):
|
|
phasm_parse(code_py)
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.parametrize('type_', ['i32', 'i64', 'f32', 'f64'])
|
|
def test_type_mismatch_function_result(type_):
|
|
code_py = f"""
|
|
def helper() -> {type_}:
|
|
return 1
|
|
|
|
@exported
|
|
def testEntry() -> (i32, i32, ):
|
|
return helper()
|
|
"""
|
|
|
|
with pytest.raises(StaticError, match=f'Static error on line 7: Expected \\(i32, i32, \\), helper actually returns {type_}'):
|
|
phasm_parse(code_py)
|
|
|
|
@pytest.mark.integration_test
|
|
def test_tuple_constant_too_few_values():
|
|
code_py = """
|
|
CONSTANT: (u32, u8, u8, ) = (24, 57, )
|
|
"""
|
|
|
|
with pytest.raises(StaticError, match='Static error on line 2: Invalid number of tuple values'):
|
|
phasm_parse(code_py)
|
|
|
|
@pytest.mark.integration_test
|
|
def test_tuple_constant_too_many_values():
|
|
code_py = """
|
|
CONSTANT: (u32, u8, u8, ) = (24, 57, 1, 1, )
|
|
"""
|
|
|
|
with pytest.raises(StaticError, match='Static error on line 2: Invalid number of tuple values'):
|
|
phasm_parse(code_py)
|
|
|
|
@pytest.mark.integration_test
|
|
def test_tuple_constant_type_mismatch():
|
|
code_py = """
|
|
CONSTANT: (u32, u8, u8, ) = (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_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)
|