155 lines
3.1 KiB
Python
155 lines
3.1 KiB
Python
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()
|