Skip to content

Commit 043e01d

Browse files
authored
Add conformance tests to disallow ClassVar/Final in NamedTuple and TypedDict (#2335)
add tests for ClassVar/Final in NamedTuple and TypedDict
1 parent fa0a78a commit 043e01d

15 files changed

Lines changed: 256 additions & 191 deletions

conformance/results/mypy/classes_classvar.toml

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,34 @@ Rejects `ClassVar` nested in `Annotated`.
66
Does not reject use of `ClassVar` in `TypeAlias` definition.
77
"""
88
output = """
9-
classes_classvar.py:38: error: ClassVar[...] must have at most one type argument [valid-type]
10-
classes_classvar.py:39: error: Invalid type: try using Literal[3] instead? [valid-type]
11-
classes_classvar.py:40: error: Name "var" is not defined; did you mean "var1" or "vars"? [name-defined]
12-
classes_classvar.py:52: error: Incompatible types in assignment (expression has type "dict[Never, Never]", variable has type "list[str]") [assignment]
13-
classes_classvar.py:54: error: Variable should not be annotated with both ClassVar and Final [misc]
14-
classes_classvar.py:55: error: Invalid type: ClassVar nested inside other type [valid-type]
15-
classes_classvar.py:67: error: Invalid type: ClassVar nested inside other type [valid-type]
16-
classes_classvar.py:69: error: ClassVar can only be used for assignments in class body [misc]
17-
classes_classvar.py:70: error: ClassVar can only be used for assignments in class body [misc]
9+
classes_classvar.py:40: error: ClassVar[...] must have at most one type argument [valid-type]
10+
classes_classvar.py:41: error: Invalid type: try using Literal[3] instead? [valid-type]
11+
classes_classvar.py:42: error: Name "var" is not defined; did you mean "var1" or "vars"? [name-defined]
12+
classes_classvar.py:54: error: Incompatible types in assignment (expression has type "dict[Never, Never]", variable has type "list[str]") [assignment]
13+
classes_classvar.py:56: error: Variable should not be annotated with both ClassVar and Final [misc]
14+
classes_classvar.py:57: error: Invalid type: ClassVar nested inside other type [valid-type]
15+
classes_classvar.py:69: error: Invalid type: ClassVar nested inside other type [valid-type]
1816
classes_classvar.py:71: error: ClassVar can only be used for assignments in class body [misc]
17+
classes_classvar.py:72: error: ClassVar can only be used for assignments in class body [misc]
1918
classes_classvar.py:73: error: ClassVar can only be used for assignments in class body [misc]
20-
classes_classvar.py:77: error: ClassVar can only be used for assignments in class body [misc]
21-
classes_classvar.py:78: error: ClassVar[...] can't be used inside a type alias [valid-type]
22-
classes_classvar.py:111: error: Cannot assign to class variable "stats" via instance [misc]
23-
classes_classvar.py:130: error: All protocol members must have explicitly declared types [misc]
24-
classes_classvar.py:140: error: Incompatible types in assignment (expression has type "ProtoAImpl", variable has type "ProtoA") [assignment]
25-
classes_classvar.py:140: note: "ProtoAImpl" is missing following "ProtoA" protocol member:
26-
classes_classvar.py:140: note: z
27-
classes_classvar.py:140: note: Protocol member ProtoA.x expected class variable, got instance variable
28-
classes_classvar.py:140: note: Protocol member ProtoA.y expected class variable, got instance variable
19+
classes_classvar.py:75: error: ClassVar can only be used for assignments in class body [misc]
20+
classes_classvar.py:79: error: ClassVar can only be used for assignments in class body [misc]
21+
classes_classvar.py:80: error: ClassVar[...] can't be used inside a type alias [valid-type]
22+
classes_classvar.py:89: error: ClassVar[...] can't be used inside a TypedDict [valid-type]
23+
classes_classvar.py:94: error: ClassVar[...] can't be used inside a NamedTuple [valid-type]
24+
classes_classvar.py:127: error: Cannot assign to class variable "stats" via instance [misc]
25+
classes_classvar.py:146: error: All protocol members must have explicitly declared types [misc]
26+
classes_classvar.py:156: error: Incompatible types in assignment (expression has type "ProtoAImpl", variable has type "ProtoA") [assignment]
27+
classes_classvar.py:156: note: "ProtoAImpl" is missing following "ProtoA" protocol member:
28+
classes_classvar.py:156: note: z
29+
classes_classvar.py:156: note: Protocol member ProtoA.x expected class variable, got instance variable
30+
classes_classvar.py:156: note: Protocol member ProtoA.y expected class variable, got instance variable
2931
"""
3032
conformance_automated = "Fail"
3133
errors_diff = """
32-
Line 45: Expected 1 errors
33-
Line 46: Expected 1 errors
3434
Line 47: Expected 1 errors
35-
Line 67: Unexpected errors ['classes_classvar.py:67: error: Invalid type: ClassVar nested inside other type [valid-type]']
36-
Line 130: Unexpected errors ['classes_classvar.py:130: error: All protocol members must have explicitly declared types [misc]']
35+
Line 48: Expected 1 errors
36+
Line 49: Expected 1 errors
37+
Line 69: Unexpected errors ['classes_classvar.py:69: error: Invalid type: ClassVar nested inside other type [valid-type]']
38+
Line 146: Unexpected errors ['classes_classvar.py:146: error: All protocol members must have explicitly declared types [misc]']
3739
"""

conformance/results/mypy/qualifiers_final_annotation.toml

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,27 @@ qualifiers_final_annotation.py:107: error: Final can be only used as an outermos
2424
qualifiers_final_annotation.py:108: error: Variable should not be annotated with both ClassVar and Final [misc]
2525
qualifiers_final_annotation.py:118: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
2626
qualifiers_final_annotation.py:121: error: Final can be only used as an outermost qualifier in a variable annotation [valid-type]
27-
qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc]
28-
qualifiers_final_annotation.py:133: error: Unexpected keyword argument "x" for "N" [call-arg]
29-
qualifiers_final_annotation.py:133: error: Unexpected keyword argument "y" for "N" [call-arg]
30-
qualifiers_final_annotation.py:134: error: Unexpected keyword argument "a" for "N" [call-arg]
31-
qualifiers_final_annotation.py:135: error: Unexpected keyword argument "x" for "N" [call-arg]
32-
qualifiers_final_annotation.py:135: error: Unexpected keyword argument "y" for "N" [call-arg]
33-
qualifiers_final_annotation.py:141: error: Cannot assign to final name "ID1" [misc]
34-
qualifiers_final_annotation.py:145: error: Cannot assign to final name "x" [misc]
35-
qualifiers_final_annotation.py:147: error: Cannot assign to final name "x" [misc]
36-
qualifiers_final_annotation.py:152: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
37-
qualifiers_final_annotation.py:155: error: Cannot assign to final name "x" [misc]
38-
qualifiers_final_annotation.py:166: error: Cannot assign to final name "TEN" [misc]
39-
qualifiers_final_annotation.py:170: error: Cannot assign to final name "PI" [misc]
27+
qualifiers_final_annotation.py:131: error: Final[...] can't be used inside a TypedDict [valid-type]
28+
qualifiers_final_annotation.py:136: error: Final[...] can't be used inside a NamedTuple [valid-type]
29+
qualifiers_final_annotation.py:145: error: Invalid "NamedTuple()" field name [misc]
30+
qualifiers_final_annotation.py:147: error: Unexpected keyword argument "x" for "N" [call-arg]
31+
qualifiers_final_annotation.py:147: error: Unexpected keyword argument "y" for "N" [call-arg]
32+
qualifiers_final_annotation.py:148: error: Unexpected keyword argument "a" for "N" [call-arg]
33+
qualifiers_final_annotation.py:149: error: Unexpected keyword argument "x" for "N" [call-arg]
34+
qualifiers_final_annotation.py:149: error: Unexpected keyword argument "y" for "N" [call-arg]
35+
qualifiers_final_annotation.py:155: error: Cannot assign to final name "ID1" [misc]
36+
qualifiers_final_annotation.py:159: error: Cannot assign to final name "x" [misc]
37+
qualifiers_final_annotation.py:161: error: Cannot assign to final name "x" [misc]
38+
qualifiers_final_annotation.py:166: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "int") [assignment]
39+
qualifiers_final_annotation.py:169: error: Cannot assign to final name "x" [misc]
40+
qualifiers_final_annotation.py:180: error: Cannot assign to final name "TEN" [misc]
41+
qualifiers_final_annotation.py:184: error: Cannot assign to final name "PI" [misc]
4042
"""
4143
conformance_automated = "Fail"
4244
errors_diff = """
43-
Line 149: Expected 1 errors
45+
Line 163: Expected 1 errors
4446
Line 59: Unexpected errors ['qualifiers_final_annotation.py:59: error: Cannot assign to final attribute "ID6" [misc]']
4547
Line 96: Unexpected errors ['qualifiers_final_annotation.py:96: error: Cannot assign to final name "__private" [misc]']
46-
Line 131: Unexpected errors ['qualifiers_final_annotation.py:131: error: Invalid "NamedTuple()" field name [misc]']
47-
Line 133: Unexpected errors ['qualifiers_final_annotation.py:133: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:133: error: Unexpected keyword argument "y" for "N" [call-arg]']
48+
Line 145: Unexpected errors ['qualifiers_final_annotation.py:145: error: Invalid "NamedTuple()" field name [misc]']
49+
Line 147: Unexpected errors ['qualifiers_final_annotation.py:147: error: Unexpected keyword argument "x" for "N" [call-arg]', 'qualifiers_final_annotation.py:147: error: Unexpected keyword argument "y" for "N" [call-arg]']
4850
"""
Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1-
conformance_automated = "Pass"
1+
conformant = "Partial"
2+
notes = """
3+
Does not reject use of `ClassVar` as a qualifier for a NamedTuple field.
4+
"""
5+
conformance_automated = "Fail"
26
errors_diff = """
7+
Line 94: Expected 1 errors
38
"""
49
output = """
5-
./classes_classvar.py:38:10: Invalid type annotation (<class 'int'>, <class 'str'>) [invalid_annotation]
6-
./classes_classvar.py:39:10: Invalid type annotation 3 [invalid_annotation]
7-
./classes_classvar.py:40:13: Undefined name: var [undefined_name]
8-
./classes_classvar.py:45:10: ClassVar type cannot include type parameters [classvar_type_parameters]
9-
./classes_classvar.py:46:10: ClassVar type cannot include type parameters [classvar_type_parameters]
10+
./classes_classvar.py:40:10: Invalid type annotation (<class 'int'>, <class 'str'>) [invalid_annotation]
11+
./classes_classvar.py:41:10: Invalid type annotation 3 [invalid_annotation]
12+
./classes_classvar.py:42:13: Undefined name: var [undefined_name]
1013
./classes_classvar.py:47:10: ClassVar type cannot include type parameters [classvar_type_parameters]
11-
./classes_classvar.py:52:4: Incompatible assignment: expected list[str], got Literal[{}] [incompatible_assignment]
12-
./classes_classvar.py:54:10: Final cannot be combined with ClassVar [invalid_qualifier]
13-
./classes_classvar.py:55:11: Unrecognized annotation typing.ClassVar[<class 'int'>] [invalid_annotation]
14-
./classes_classvar.py:69:25: Unexpected ClassVar annotation [invalid_qualifier]
15-
./classes_classvar.py:70:11: ClassVar can only be used for assignments in class body [invalid_qualifier]
16-
./classes_classvar.py:71:17: ClassVar can only be used for assignments in class body [invalid_qualifier]
17-
./classes_classvar.py:73:25: Unexpected ClassVar annotation [invalid_qualifier]
18-
./classes_classvar.py:77:7: ClassVar can only be used for assignments in class body [invalid_qualifier]
19-
./classes_classvar.py:78:19: ClassVar cannot be used in type aliases [invalid_qualifier]
20-
./classes_classvar.py:111:0: Cannot assign to class variable 'stats' via instance [incompatible_assignment]
21-
./classes_classvar.py:140:0: Incompatible assignment: expected ./classes_classvar.py.ProtoA, got ./classes_classvar.py.ProtoAImpl [incompatible_assignment]
14+
./classes_classvar.py:48:10: ClassVar type cannot include type parameters [classvar_type_parameters]
15+
./classes_classvar.py:49:10: ClassVar type cannot include type parameters [classvar_type_parameters]
16+
./classes_classvar.py:54:4: Incompatible assignment: expected list[str], got Literal[{}] [incompatible_assignment]
17+
./classes_classvar.py:56:10: Final cannot be combined with ClassVar [invalid_qualifier]
18+
./classes_classvar.py:57:11: Unrecognized annotation typing.ClassVar[<class 'int'>] [invalid_annotation]
19+
./classes_classvar.py:71:25: Unexpected ClassVar annotation [invalid_qualifier]
20+
./classes_classvar.py:72:11: ClassVar can only be used for assignments in class body [invalid_qualifier]
21+
./classes_classvar.py:73:17: ClassVar can only be used for assignments in class body [invalid_qualifier]
22+
./classes_classvar.py:75:25: Unexpected ClassVar annotation [invalid_qualifier]
23+
./classes_classvar.py:79:7: ClassVar can only be used for assignments in class body [invalid_qualifier]
24+
./classes_classvar.py:80:19: ClassVar cannot be used in type aliases [invalid_qualifier]
25+
./classes_classvar.py:89:7: Unexpected ClassVar annotation [invalid_qualifier]
26+
./classes_classvar.py:127:0: Cannot assign to class variable 'stats' via instance [incompatible_assignment]
27+
./classes_classvar.py:156:0: Incompatible assignment: expected ./classes_classvar.py.ProtoA, got ./classes_classvar.py.ProtoAImpl [incompatible_assignment]
2228
"""

conformance/results/pycroscope/qualifiers_final_annotation.toml

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ output = """
1919
./qualifiers_final_annotation.py:108:12: Final cannot be combined with ClassVar [invalid_qualifier]
2020
./qualifiers_final_annotation.py:118:3: Unrecognized annotation typing.Final[<class 'int'>] [invalid_annotation]
2121
./qualifiers_final_annotation.py:121:13: Unexpected Final annotation [invalid_qualifier]
22-
./qualifiers_final_annotation.py:134:0: In call to pycroscope.signature.N: Missing required argument 'x' [incompatible_call]
23-
./qualifiers_final_annotation.py:135:4: Incompatible argument type for x: expected int but got Literal[''] [incompatible_argument]
24-
./qualifiers_final_annotation.py:135:10: Incompatible argument type for y: expected int but got Literal[''] [incompatible_argument]
25-
./qualifiers_final_annotation.py:141:4: Cannot assign to final name ID1 [incompatible_assignment]
26-
./qualifiers_final_annotation.py:145:4: Cannot assign to final name x [incompatible_assignment]
27-
./qualifiers_final_annotation.py:147:9: Cannot assign to final name x [incompatible_assignment]
28-
./qualifiers_final_annotation.py:149:8: Cannot assign to final name x [incompatible_assignment]
29-
./qualifiers_final_annotation.py:152:29: Cannot assign to final name x [incompatible_assignment]
30-
./qualifiers_final_annotation.py:155:8: Cannot assign to final name x [incompatible_assignment]
31-
./qualifiers_final_annotation.py:166:0: Cannot assign to final name TEN [incompatible_assignment]
32-
./qualifiers_final_annotation.py:170:0: Cannot assign to final name PI [incompatible_assignment]
22+
./qualifiers_final_annotation.py:131:7: Unexpected Final annotation [invalid_qualifier]
23+
./qualifiers_final_annotation.py:136:4: Final class attributes without initializers must be assigned in __init__ [invalid_qualifier]
24+
./qualifiers_final_annotation.py:148:0: In call to pycroscope.signature.N: Missing required argument 'x' [incompatible_call]
25+
./qualifiers_final_annotation.py:149:4: Incompatible argument type for x: expected int but got Literal[''] [incompatible_argument]
26+
./qualifiers_final_annotation.py:149:10: Incompatible argument type for y: expected int but got Literal[''] [incompatible_argument]
27+
./qualifiers_final_annotation.py:155:4: Cannot assign to final name ID1 [incompatible_assignment]
28+
./qualifiers_final_annotation.py:159:4: Cannot assign to final name x [incompatible_assignment]
29+
./qualifiers_final_annotation.py:161:9: Cannot assign to final name x [incompatible_assignment]
30+
./qualifiers_final_annotation.py:163:8: Cannot assign to final name x [incompatible_assignment]
31+
./qualifiers_final_annotation.py:166:29: Cannot assign to final name x [incompatible_assignment]
32+
./qualifiers_final_annotation.py:169:8: Cannot assign to final name x [incompatible_assignment]
33+
./qualifiers_final_annotation.py:180:0: Cannot assign to final name TEN [incompatible_assignment]
34+
./qualifiers_final_annotation.py:184:0: Cannot assign to final name PI [incompatible_assignment]
3335
"""

conformance/results/pyrefly/classes_classvar.toml

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,27 @@ conformance_automated = "Pass"
33
errors_diff = """
44
"""
55
output = """
6-
ERROR classes_classvar.py:38:11-29: Expected 1 type argument for `ClassVar`, got 2 [invalid-annotation]
7-
ERROR classes_classvar.py:39:14-15: Number literal cannot be used in annotations [invalid-annotation]
8-
ERROR classes_classvar.py:40:14-17: Could not find name `var` [unknown-name]
9-
ERROR classes_classvar.py:45:20-21: `ClassVar` arguments may not contain any type variables [invalid-annotation]
10-
ERROR classes_classvar.py:46:20-27: `ClassVar` arguments may not contain any type variables [invalid-annotation]
11-
ERROR classes_classvar.py:47:20-36: `ClassVar` arguments may not contain any type variables [invalid-annotation]
12-
ERROR classes_classvar.py:52:33-35: `dict[@_, @_]` is not assignable to `list[str]` [bad-assignment]
13-
ERROR classes_classvar.py:54:17-30: `ClassVar` may not be nested inside `Final` [invalid-annotation]
14-
ERROR classes_classvar.py:55:17-30: `ClassVar` is not allowed in this context [invalid-annotation]
15-
ERROR classes_classvar.py:69:26-34: `ClassVar` is only allowed inside a class body [invalid-annotation]
16-
ERROR classes_classvar.py:69:26-39: `ClassVar` is not allowed in this context [invalid-annotation]
17-
ERROR classes_classvar.py:70:12-20: `ClassVar` is only allowed inside a class body [invalid-annotation]
18-
ERROR classes_classvar.py:70:12-25: `ClassVar` is not allowed in this context [invalid-annotation]
19-
ERROR classes_classvar.py:71:9-16: Cannot set field `xx` [read-only]
20-
ERROR classes_classvar.py:73:26-34: `ClassVar` is only allowed inside a class body [invalid-annotation]
21-
ERROR classes_classvar.py:73:26-39: `ClassVar` is not allowed in this context [invalid-annotation]
22-
ERROR classes_classvar.py:77:8-16: `ClassVar` is only allowed inside a class body [invalid-annotation]
23-
ERROR classes_classvar.py:77:8-21: `ClassVar` is not allowed in this context [invalid-annotation]
24-
ERROR classes_classvar.py:78:20-33: `ClassVar` is not allowed in this context [invalid-annotation]
25-
ERROR classes_classvar.py:111:1-19: Cannot set field `stats` [read-only]
26-
ERROR classes_classvar.py:140:13-25: `ProtoAImpl` is not assignable to `ProtoA` [bad-assignment]
6+
ERROR classes_classvar.py:40:11-29: Expected 1 type argument for `ClassVar`, got 2 [invalid-annotation]
7+
ERROR classes_classvar.py:41:14-15: Number literal cannot be used in annotations [invalid-annotation]
8+
ERROR classes_classvar.py:42:14-17: Could not find name `var` [unknown-name]
9+
ERROR classes_classvar.py:47:20-21: `ClassVar` arguments may not contain any type variables [invalid-annotation]
10+
ERROR classes_classvar.py:48:20-27: `ClassVar` arguments may not contain any type variables [invalid-annotation]
11+
ERROR classes_classvar.py:49:20-36: `ClassVar` arguments may not contain any type variables [invalid-annotation]
12+
ERROR classes_classvar.py:54:33-35: `dict[@_, @_]` is not assignable to `list[str]` [bad-assignment]
13+
ERROR classes_classvar.py:56:17-30: `ClassVar` may not be nested inside `Final` [invalid-annotation]
14+
ERROR classes_classvar.py:57:17-30: `ClassVar` is not allowed in this context [invalid-annotation]
15+
ERROR classes_classvar.py:71:26-34: `ClassVar` is only allowed inside a class body [invalid-annotation]
16+
ERROR classes_classvar.py:71:26-39: `ClassVar` is not allowed in this context [invalid-annotation]
17+
ERROR classes_classvar.py:72:12-20: `ClassVar` is only allowed inside a class body [invalid-annotation]
18+
ERROR classes_classvar.py:72:12-25: `ClassVar` is not allowed in this context [invalid-annotation]
19+
ERROR classes_classvar.py:73:9-16: Cannot set field `xx` [read-only]
20+
ERROR classes_classvar.py:75:26-34: `ClassVar` is only allowed inside a class body [invalid-annotation]
21+
ERROR classes_classvar.py:75:26-39: `ClassVar` is not allowed in this context [invalid-annotation]
22+
ERROR classes_classvar.py:79:8-16: `ClassVar` is only allowed inside a class body [invalid-annotation]
23+
ERROR classes_classvar.py:79:8-21: `ClassVar` is not allowed in this context [invalid-annotation]
24+
ERROR classes_classvar.py:80:20-33: `ClassVar` is not allowed in this context [invalid-annotation]
25+
ERROR classes_classvar.py:89:5-6: `ClassVar` may not be used for TypedDict members [invalid-annotation]
26+
ERROR classes_classvar.py:94:5-6: `ClassVar` may not be used for NamedTuple members [invalid-annotation]
27+
ERROR classes_classvar.py:127:1-19: Cannot set field `stats` [read-only]
28+
ERROR classes_classvar.py:156:13-25: `ProtoAImpl` is not assignable to `ProtoA` [bad-assignment]
2729
"""

0 commit comments

Comments
 (0)