Re-implementing some things that were broken. Also, if a typing error is found, and we detect an infinite loop, we return the errors instead, as that's probably what causing the loop anyhow.
104 lines
2.2 KiB
Python
104 lines
2.2 KiB
Python
import pytest
|
|
|
|
from phasm.exceptions import StaticError
|
|
from phasm.type3.entry import Type3Exception
|
|
|
|
from phasm.parser import phasm_parse
|
|
|
|
from ..constants import (
|
|
ALL_INT_TYPES
|
|
)
|
|
from ..helpers import Suite
|
|
|
|
@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
|
|
@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()
|