Skip to content

Commit 01a8b30

Browse files
committed
Add new tests
1 parent 6a434b4 commit 01a8b30

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
[case testValueTypeBasic]
2+
from typing import final, Final
3+
from mypy_extensions import mypyc_attr, i32
4+
5+
@final
6+
@mypyc_attr(value_type=True)
7+
class Vector2I:
8+
def __init__(self, x: i32) -> None:
9+
self.x: Final = x
10+
11+
@final
12+
class Vector2Ir:
13+
def __init__(self, x: i32) -> None:
14+
self.x: Final = x
15+
16+
def test_rt() -> None:
17+
l1 = [Vector2I(1), Vector2I(1)] # require boxing
18+
l2 = [Vector2Ir(1), Vector2Ir(1)] # do NOT require boxing
19+
20+
[out]
21+
def Vector2I.__init__(self, x):
22+
self :: __main__.Vector2I
23+
x :: i32
24+
L0:
25+
self.x = x
26+
return 1
27+
def Vector2Ir.__init__(self, x):
28+
self :: __main__.Vector2Ir
29+
x :: i32
30+
L0:
31+
self.x = x
32+
return 1
33+
def test_rt():
34+
r0, r1 :: __main__.Vector2I
35+
r2 :: list
36+
r3, r4 :: object
37+
r5 :: ptr
38+
l1 :: list
39+
r6, r7 :: __main__.Vector2Ir
40+
r8 :: list
41+
r9 :: ptr
42+
l2 :: list
43+
L0:
44+
r0 = Vector2I(1)
45+
r1 = Vector2I(1)
46+
r2 = PyList_New(2)
47+
r3 = box(__main__.Vector2I, r0)
48+
r4 = box(__main__.Vector2I, r1)
49+
r5 = list_items r2
50+
buf_init_item r5, 0, r3
51+
buf_init_item r5, 1, r4
52+
keep_alive r2
53+
l1 = r2
54+
r6 = Vector2Ir(1)
55+
r7 = Vector2Ir(1)
56+
r8 = PyList_New(2)
57+
r9 = list_items r8
58+
buf_init_item r9, 0, r6
59+
buf_init_item r9, 1, r7
60+
keep_alive r8
61+
l2 = r8
62+
return 1
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
[case testValueTypeNotFinal]
2+
from mypy_extensions import mypyc_attr
3+
4+
@mypyc_attr(value_type=True)
5+
class A:
6+
pass
7+
8+
[out]
9+
main:4: error: Value types must be immutable and final
10+
11+
[case testValueTypeHasNotParent]
12+
from mypy_extensions import mypyc_attr
13+
from typing import final
14+
15+
class A: pass
16+
17+
@final
18+
@mypyc_attr(value_type=True)
19+
class B(A): pass
20+
21+
[out]
22+
main:8: error: Value types must not inherit from other types
23+
24+
[case testValueTypeForbiddenMethods]
25+
from typing import final
26+
from mypy_extensions import mypyc_attr
27+
28+
@final
29+
@mypyc_attr(value_type=True)
30+
class A:
31+
def __iter__(self) -> None:
32+
pass
33+
34+
[out]
35+
main:7: error: Value types must not define method '__iter__'

mypyc/test/test_irbuild.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"irbuild-i32.test",
4545
"irbuild-i16.test",
4646
"irbuild-u8.test",
47+
"irbuild-valuetype.test",
4748
"irbuild-vectorcall.test",
4849
"irbuild-unreachable.test",
4950
"irbuild-isinstance.test",
@@ -69,6 +70,7 @@ def run_case(self, testcase: DataDrivenTestCase) -> None:
6970
if options is None:
7071
# Skipped test case
7172
return
73+
assert options.experimental_value_types
7274
with use_custom_builtins(os.path.join(self.data_prefix, ICODE_GEN_BUILTINS), testcase):
7375
expected_output = remove_comment_lines(testcase.output)
7476
expected_output = replace_word_size(expected_output)

mypyc/test/test_valuetype.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""Test runner for value type test cases."""
2+
3+
from __future__ import annotations
4+
5+
from mypy.errors import CompileError
6+
from mypy.test.config import test_temp_dir
7+
from mypy.test.data import DataDrivenTestCase
8+
from mypyc.test.testutil import (
9+
MypycDataSuite,
10+
build_ir_for_single_file,
11+
infer_ir_build_options_from_test_name,
12+
)
13+
14+
files = ["valuetype-errors.test"]
15+
16+
17+
class TestValueTypeCompileErrors(MypycDataSuite):
18+
"""Negative cases which emit error on compile."""
19+
20+
files = files
21+
base_path = test_temp_dir
22+
23+
def run_case(self, testcase: DataDrivenTestCase) -> None:
24+
"""Perform a runtime checking transformation test case."""
25+
options = infer_ir_build_options_from_test_name(testcase.name)
26+
if options is None:
27+
# Skipped test case
28+
return
29+
30+
assert options.experimental_value_types
31+
try:
32+
build_ir_for_single_file(testcase.input, options)
33+
except CompileError as e:
34+
actual = "\n".join(e.messages).strip()
35+
expected = "\n".join(testcase.output).strip()
36+
assert actual == expected
37+
else:
38+
assert False, "Expected CompileError"

0 commit comments

Comments
 (0)