183 lines
4.3 KiB
Python
183 lines
4.3 KiB
Python
import pytest
|
|
|
|
from phasm.type3.entry import Type3Exception
|
|
|
|
from ..helpers import Suite
|
|
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_in_code_0_arg():
|
|
code_py = """
|
|
def thirteen() -> i32:
|
|
return 13
|
|
|
|
def action(applicable: Callable[i32]) -> i32:
|
|
return applicable()
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(thirteen)
|
|
"""
|
|
|
|
result = Suite(code_py).run_code()
|
|
|
|
assert 13 == result.returned_value
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_in_code_1_arg():
|
|
code_py = """
|
|
def double(left: i32) -> i32:
|
|
return left * 2
|
|
|
|
def action(applicable: Callable[i32, i32], left: i32) -> i32:
|
|
return applicable(left)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(double, 13)
|
|
"""
|
|
|
|
result = Suite(code_py).run_code()
|
|
|
|
assert 26 == result.returned_value
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_in_code_2_arg():
|
|
code_py = """
|
|
def add(left: i32, right: i32) -> i32:
|
|
return left + right
|
|
|
|
def action(applicable: Callable[i32, i32, i32], left: i32, right: i32) -> i32:
|
|
return applicable(left, right)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(add, 13, 14)
|
|
"""
|
|
|
|
result = Suite(code_py).run_code()
|
|
|
|
assert 27 == result.returned_value
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_in_code_3_arg():
|
|
code_py = """
|
|
def add(left: i32, mid: i32, right: i32) -> i32:
|
|
return left + mid + right
|
|
|
|
def action(applicable: Callable[i32, i32, i32, i32], left: i32, mid: i32, right: i32) -> i32:
|
|
return applicable(left, mid, right)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(add, 13, 14, 15)
|
|
"""
|
|
|
|
result = Suite(code_py).run_code()
|
|
|
|
assert 42 == result.returned_value
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_wrong_argument_type():
|
|
code_py = """
|
|
def double(left: f32) -> f32:
|
|
return left * 2
|
|
|
|
def action(applicable: Callable[i32, i32], left: i32) -> i32:
|
|
return applicable(left)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(double, 13)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'Callable\[f32, f32\] must be Callable\[i32, i32\] instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_wrong_return():
|
|
code_py = """
|
|
def double(left: i32) -> i32:
|
|
return left * 2
|
|
|
|
def action(applicable: Callable[i32, i32], left: i32) -> f32:
|
|
return applicable(left)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(double, 13)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'f32 must be i32 instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.skip('FIXME: Probably have the remainder be the a function type')
|
|
def test_sof_wrong_not_enough_args_call():
|
|
code_py = """
|
|
def add(left: i32, right: i32) -> i32:
|
|
return left + right
|
|
|
|
def action(applicable: Callable[i32, i32, i32], left: i32) -> i32:
|
|
return applicable(left)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(add, 13)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'f32 must be i32 instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_wrong_not_enough_args_refere():
|
|
code_py = """
|
|
def double(left: i32) -> i32:
|
|
return left * 2
|
|
|
|
def action(applicable: Callable[i32, i32, i32], left: i32, right: i32) -> i32:
|
|
return applicable(left, right)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(double, 13, 14)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'Callable\[i32, i32\] must be Callable\[i32, i32, i32\] instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.skip('FIXME: Probably have the remainder be the a function type')
|
|
def test_sof_wrong_too_many_args_call():
|
|
code_py = """
|
|
def thirteen() -> i32:
|
|
return 13
|
|
|
|
def action(applicable: Callable[i32], left: i32) -> i32:
|
|
return applicable(left)
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(thirteen, 13)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'f32 must be i32 instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
def test_sof_wrong_too_many_args_refere():
|
|
code_py = """
|
|
def double(left: i32) -> i32:
|
|
return left * 2
|
|
|
|
def action(applicable: Callable[i32]) -> i32:
|
|
return applicable()
|
|
|
|
@exported
|
|
def testEntry() -> i32:
|
|
return action(double)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match=r'Callable\[i32, i32\] must be Callable\[i32\] instead'):
|
|
Suite(code_py).run_code()
|