Foldable take a TypeConstructor. The first argument must be a NatNum. The FunctionSignatureRouter wasn't completely on point, instead this commit adds an TypeClassArgsRouter lookup router. This makes sense since the only available arguments we have to find a router is the list of type class arguments.
72 lines
1.7 KiB
Python
72 lines
1.7 KiB
Python
import pytest
|
|
|
|
from phasm.type3.entry import Type3Exception
|
|
|
|
from ..helpers import Suite
|
|
from .test_natnum import FLOAT_TYPES, INT_TYPES
|
|
|
|
|
|
@pytest.mark.integration_test
|
|
@pytest.mark.parametrize('length', [1, 5, 13])
|
|
@pytest.mark.parametrize('a_type', INT_TYPES + FLOAT_TYPES)
|
|
def test_foldable_sum(length, a_type):
|
|
code_py = f"""
|
|
@exported
|
|
def testEntry(x: {a_type}[{length}]) -> {a_type}:
|
|
return sum(x)
|
|
"""
|
|
|
|
in_put = tuple(range(length))
|
|
|
|
result = Suite(code_py).run_code(in_put)
|
|
|
|
assert sum(in_put) == result.returned_value
|
|
|
|
@pytest.mark.integration_test
|
|
def test_foldable_sum_not_natnum():
|
|
code_py = """
|
|
class Foo:
|
|
bar: i32
|
|
|
|
@exported
|
|
def testEntry(x: Foo[4]) -> Foo:
|
|
return sum(x)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match='Missing type class instantation: NatNum Foo'):
|
|
Suite(code_py).run_code()
|
|
|
|
|
|
@pytest.mark.integration_test
|
|
def test_foldable_invalid_return_type():
|
|
code_py = """
|
|
@exported
|
|
def testEntry(x: i32[5]) -> f64:
|
|
return sum(x)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match='i32 must be f64 instead'):
|
|
Suite(code_py).run_code((4, 5, 6, 7, 8, ))
|
|
|
|
@pytest.mark.integration_test
|
|
def test_foldable_not_constructed():
|
|
code_py = """
|
|
@exported
|
|
def testEntry(x: i32) -> i32:
|
|
return sum(x)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match='Missing type class instantation: Foldable i32.*i32 must be a constructed type instead'):
|
|
Suite(code_py).run_code()
|
|
|
|
@pytest.mark.integration_test
|
|
def test_foldable_not_foldable():
|
|
code_py = """
|
|
@exported
|
|
def testEntry(x: (i32, u32, )) -> i32:
|
|
return sum(x)
|
|
"""
|
|
|
|
with pytest.raises(Type3Exception, match='Missing type class instantation: Foldable tuple'):
|
|
Suite(code_py).run_code()
|