Skip to content

conformance: aliases_typealiastype: quote recursive aliases, and add … #1998

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions conformance/results/mypy/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ Incorrectly rejects some recursive type aliases using TypeAliasType.
Incorrectly rejects the use of a class-scoped TypeVar in a TypeAliasType definition.
"""
output = """
aliases_typealiastype.py:19: error: Cannot resolve name "GoodAlias4" (possible cyclic definition) [misc]
aliases_typealiastype.py:20: error: Cannot resolve name "GoodAlias5" (possible cyclic definition) [misc]
aliases_typealiastype.py:22: error: Cannot resolve name "GoodAlias5" (possible cyclic definition) [misc]
aliases_typealiastype.py:27: error: Type variable "T" is not included in type_params [valid-type]
Expand All @@ -17,7 +16,6 @@ aliases_typealiastype.py:46: error: Cannot resolve name "BadAlias4" (possible cy
aliases_typealiastype.py:47: error: Invalid recursive alias: a union item of itself [misc]
aliases_typealiastype.py:48: error: Cannot resolve name "BadAlias6" (possible cyclic definition) [misc]
aliases_typealiastype.py:48: error: Cannot resolve name "BadAlias7" (possible cyclic definition) [misc]
aliases_typealiastype.py:48: error: Name "BadAlias7" is used before definition [used-before-def]
aliases_typealiastype.py:49: error: Cannot resolve name "BadAlias7" (possible cyclic definition) [misc]
aliases_typealiastype.py:52: error: Invalid type alias: expression is not a valid type [valid-type]
aliases_typealiastype.py:53: error: Bracketed expression "[...]" is not valid as a type [valid-type]
Expand All @@ -35,10 +33,10 @@ aliases_typealiastype.py:62: error: Invalid type: try using Literal[1] instead?
aliases_typealiastype.py:63: error: Invalid type alias: expression is not a valid type [valid-type]
aliases_typealiastype.py:63: error: Function "list" could always be true in boolean context [truthy-function]
aliases_typealiastype.py:64: error: Invalid type alias: expression is not a valid type [valid-type]
aliases_typealiastype.py:66: error: Cannot resolve name "BadAlias21" (possible cyclic definition) [misc]
"""
conformance_automated = "Fail"
errors_diff = """
Line 19: Unexpected errors ['aliases_typealiastype.py:19: error: Cannot resolve name "GoodAlias4" (possible cyclic definition) [misc]']
Line 20: Unexpected errors ['aliases_typealiastype.py:20: error: Cannot resolve name "GoodAlias5" (possible cyclic definition) [misc]']
Line 22: Unexpected errors ['aliases_typealiastype.py:22: error: Cannot resolve name "GoodAlias5" (possible cyclic definition) [misc]']
Line 27: Unexpected errors ['aliases_typealiastype.py:27: error: Type variable "T" is not included in type_params [valid-type]']
Expand Down
5 changes: 3 additions & 2 deletions conformance/results/pyre/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Support for TypeAliasType is not implemented.
output = """
aliases_typealiastype.py:17:41 Undefined attribute [16]: `list` has no attribute `__getitem__`.
aliases_typealiastype.py:22:13 Incompatible parameter type [6]: In call `typing.GenericMeta.__getitem__`, for 1st positional argument, expected `Tuple[typing.Any, Type[Variable[$synthetic_attribute_resolution_variable]]]` but got `Tuple[ParamSpec, TypeVar]`.
aliases_typealiastype.py:22:65 Undefined attribute [16]: `tuple` has no attribute `__getitem__`.
aliases_typealiastype.py:22:67 Undefined attribute [16]: `tuple` has no attribute `__getitem__`.
aliases_typealiastype.py:32:6 Undefined attribute [16]: `TypeAliasType` has no attribute `other_attrib`.
aliases_typealiastype.py:35:4 Undefined or invalid type [11]: Annotation `GoodAlias4` is not defined as a type.
aliases_typealiastype.py:37:4 Undefined or invalid type [11]: Annotation `GoodAlias5` is not defined as a type.
Expand All @@ -32,8 +32,9 @@ Line 61: Expected 1 errors
Line 62: Expected 1 errors
Line 63: Expected 1 errors
Line 64: Expected 1 errors
Line 66: Expected 1 errors
Line 17: Unexpected errors ['aliases_typealiastype.py:17:41 Undefined attribute [16]: `list` has no attribute `__getitem__`.']
Line 22: Unexpected errors ['aliases_typealiastype.py:22:13 Incompatible parameter type [6]: In call `typing.GenericMeta.__getitem__`, for 1st positional argument, expected `Tuple[typing.Any, Type[Variable[$synthetic_attribute_resolution_variable]]]` but got `Tuple[ParamSpec, TypeVar]`.', 'aliases_typealiastype.py:22:65 Undefined attribute [16]: `tuple` has no attribute `__getitem__`.']
Line 22: Unexpected errors ['aliases_typealiastype.py:22:13 Incompatible parameter type [6]: In call `typing.GenericMeta.__getitem__`, for 1st positional argument, expected `Tuple[typing.Any, Type[Variable[$synthetic_attribute_resolution_variable]]]` but got `Tuple[ParamSpec, TypeVar]`.', 'aliases_typealiastype.py:22:67 Undefined attribute [16]: `tuple` has no attribute `__getitem__`.']
Line 35: Unexpected errors ['aliases_typealiastype.py:35:4 Undefined or invalid type [11]: Annotation `GoodAlias4` is not defined as a type.']
Line 37: Unexpected errors ['aliases_typealiastype.py:37:4 Undefined or invalid type [11]: Annotation `GoodAlias5` is not defined as a type.']
"""
6 changes: 0 additions & 6 deletions conformance/results/pyre/overloads_definitions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@ Does not allow an overload with no implementation in a Protocol or an abstract b
Expects @final/@override on all overloads and implementation, instead of implementation only.
"""
errors_diff = """
Lines 71, 73, 78, 81: Expected exactly one error (tag 'func5')
Lines 135, 136, 137, 141, 142: Expected error (tag 'invalid_final_2')
Lines 220, 221, 222, 225, 226: Expected error (tag 'override_impl')
Line 40: Unexpected errors ['overloads_definitions.py:40:4 Missing overload implementation [42]: Overloaded function `MyProto.func3` must have an implementation.']
Line 49: Unexpected errors ['overloads_definitions.py:49:4 Missing overload implementation [42]: Overloaded function `MyAbstractBase.func4` must have an implementation.']
Line 73: Unexpected errors ['overloads_definitions.py:73:4 Incompatible overload [43]: The implementation of `C.func5` does not accept all possible arguments of overload defined on line `73`.']
Line 78: Unexpected errors ['overloads_definitions.py:78:4 Incompatible overload [43]: The implementation of `C.func5` does not accept all possible arguments of overload defined on line `78`.']
Line 81: Unexpected errors ['overloads_definitions.py:81:4 Incompatible overload [43]: This definition does not have the same decorators as the preceding overload(s).']
Line 117: Unexpected errors ['overloads_definitions.py:117:4 Incompatible overload [43]: This definition does not have the same decorators as the preceding overload(s).']
Line 215: Unexpected errors ['overloads_definitions.py:215:4 Incompatible overload [43]: This definition does not have the same decorators as the preceding overload(s).']
"""
Expand All @@ -22,8 +18,6 @@ overloads_definitions.py:28:0 Missing overload implementation [42]: Overloaded f
overloads_definitions.py:40:4 Missing overload implementation [42]: Overloaded function `MyProto.func3` must have an implementation.
overloads_definitions.py:49:4 Missing overload implementation [42]: Overloaded function `MyAbstractBase.func4` must have an implementation.
overloads_definitions.py:59:4 Missing overload implementation [42]: Overloaded function `MyAbstractBase.not_abstract` must have an implementation.
overloads_definitions.py:73:4 Incompatible overload [43]: The implementation of `C.func5` does not accept all possible arguments of overload defined on line `73`.
overloads_definitions.py:78:4 Incompatible overload [43]: The implementation of `C.func5` does not accept all possible arguments of overload defined on line `78`.
overloads_definitions.py:81:4 Incompatible overload [43]: This definition does not have the same decorators as the preceding overload(s).
overloads_definitions.py:90:4 Incompatible overload [43]: The implementation of `C.func6` does not accept all possible arguments of overload defined on line `90`.
overloads_definitions.py:90:4 Incompatible overload [43]: This definition does not have the same decorators as the preceding overload(s).
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/pyre/version.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version = "pyre 0.9.23"
test_duration = 9.0
test_duration = 9.8
8 changes: 6 additions & 2 deletions conformance/results/pyright/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
conformant = "Pass"
conformant = "Partial"
notes = """
Incorrectly allows undefined self reference.
"""
output = """
aliases_typealiastype.py:32:18 - error: Cannot access attribute "other_attrib" for class "TypeAliasType"
  Attribute "other_attrib" is unknown (reportAttributeAccessIssue)
Expand Down Expand Up @@ -29,6 +32,7 @@ aliases_typealiastype.py:62:42 - error: Expected class but received "Literal[1]"
aliases_typealiastype.py:63:42 - error: Binary operator not allowed in type expression (reportInvalidTypeForm)
aliases_typealiastype.py:64:42 - error: Type expressions cannot use format string literals (f-strings) (reportGeneralTypeIssues)
"""
conformance_automated = "Pass"
conformance_automated = "Fail"
errors_diff = """
Line 66: Expected 1 errors
"""
9 changes: 6 additions & 3 deletions conformance/results/pyright/generics_type_erasure.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
conformant = "Pass"
conformant = "Partial"
notes = """
Missing error regarding `type(instance).generic_attribute`.
"""
output = """
generics_type_erasure.py:38:16 - error: Argument of type "Literal['']" cannot be assigned to parameter "label" of type "int | None" in function "__init__"
  Type "Literal['']" is not assignable to type "int | None"
Expand All @@ -12,8 +15,8 @@ generics_type_erasure.py:42:11 - error: Access to generic instance variable thro
generics_type_erasure.py:43:11 - error: Access to generic instance variable through class is ambiguous (reportGeneralTypeIssues)
generics_type_erasure.py:44:6 - error: Access to generic instance variable through class is ambiguous (reportGeneralTypeIssues)
generics_type_erasure.py:45:6 - error: Access to generic instance variable through class is ambiguous (reportGeneralTypeIssues)
generics_type_erasure.py:46:10 - error: Access to generic instance variable through class is ambiguous (reportGeneralTypeIssues)
"""
conformance_automated = "Pass"
conformance_automated = "Fail"
errors_diff = """
Line 46: Expected 1 errors
"""
2 changes: 1 addition & 1 deletion conformance/results/pyright/version.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version = "pyright 1.1.399"
version = "pyright 1.1.400"
test_duration = 1.1
41 changes: 19 additions & 22 deletions conformance/results/pytype/aliases_typealiastype.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,40 +18,35 @@ aliases_typealiastype.py:16:14: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in
GoodAlias1 = TypeAliasType("GoodAlias1", int)
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:19:51: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'GoodAlias4' is not defined [name-error]
aliases_typealiastype.py:19:42: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: unsupported operand type(s) for |: 'T: TypeVar' and ''list[GoodAlias4[T]]': str' [unsupported-operands]

GoodAlias4 = TypeAliasType("GoodAlias4", T | list[GoodAlias4[T]], type_params=(T,))
\u001b[1m\u001b[31m~~~~~~~~~~\u001b[39m\u001b[0m
GoodAlias4 = TypeAliasType("GoodAlias4", T | "list[GoodAlias4[T]]", type_params=(T,))
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:22:40: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'GoodAlias5' is not defined [name-error]
aliases_typealiastype.py:22:68: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Invalid type annotation '<instance of tuple[nothing, ...]>' [invalid-annotation]

Callable[P, TStr] | list[S] | list[GoodAlias5[S, TStr, P]] | tuple[*Ts],
\u001b[1m\u001b[31m~~~~~~~~~~\u001b[39m\u001b[0m
Callable[P, TStr] | list[S] | list["GoodAlias5[S, TStr, P]"] | tuple[*Ts],
\u001b[1m\u001b[31m~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:22:66: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Invalid type annotation '<instance of tuple[nothing, ...]>' [invalid-annotation]
aliases_typealiastype.py:22:35: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Invalid type annotation '<instance of TypeAliasType>' [invalid-annotation]

Callable[P, TStr] | list[S] | list[GoodAlias5[S, TStr, P]] | tuple[*Ts],
\u001b[1m\u001b[31m~~~~~~~~~~\u001b[39m\u001b[0m
Callable[P, TStr] | list[S] | list["GoodAlias5[S, TStr, P]"] | tuple[*Ts],
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:32:7: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: No attribute 'other_attrib' on TypeAliasType [attribute-error]

print(GoodAlias1.other_attrib) # E: unknown attribute
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:46:40: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'BadAlias4' is not defined [name-error]
aliases_typealiastype.py:47:40: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: unsupported operand type(s) for |: 'T: TypeVar' and ''BadAlias5[str]': str' [unsupported-operands]

BadAlias4 = TypeAliasType("BadAlias4", BadAlias4) # E: circular dependency
\u001b[1m\u001b[31m~~~~~~~~~\u001b[39m\u001b[0m
BadAlias5 = TypeAliasType("BadAlias5", T | "BadAlias5[str]", type_params=(T,)) # E: circular dependency
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:47:44: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'BadAlias5' is not defined [name-error]
aliases_typealiastype.py:66:47: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'BadAlias21' is not defined [name-error]

BadAlias5 = TypeAliasType("BadAlias5", T | BadAlias5[str], type_params=(T,)) # E: circular dependency
\u001b[1m\u001b[31m~~~~~~~~~\u001b[39m\u001b[0m

aliases_typealiastype.py:48:40: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <module>: Name 'BadAlias7' is not defined [name-error]

BadAlias6 = TypeAliasType("BadAlias6", BadAlias7) # E: circular dependency
\u001b[1m\u001b[31m~~~~~~~~~\u001b[39m\u001b[0m
BadAlias21 = TypeAliasType("BadAlias21", list[BadAlias21]) # E
\u001b[1m\u001b[31m~~~~~~~~~~\u001b[39m\u001b[0m

"""
conformance_automated = "Fail"
Expand All @@ -60,6 +55,8 @@ Line 40: Expected 1 errors
Line 43: Expected 1 errors
Line 44: Expected 1 errors
Line 45: Expected 1 errors
Line 46: Expected 1 errors
Line 48: Expected 1 errors
Line 52: Expected 1 errors
Line 53: Expected 1 errors
Line 54: Expected 1 errors
Expand All @@ -76,6 +73,6 @@ Line 64: Expected 1 errors
Line 5: Unexpected errors ['aliases_typealiastype.py:5:1: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: typing.TypeVarTuple not supported yet [not-supported-yet]']
Line 11: Unexpected errors ['aliases_typealiastype.py:11:6: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Function TypeVarTuple.__init__ expects 1 arg(s), got 2 [wrong-arg-count]']
Line 16: Unexpected errors ["aliases_typealiastype.py:16:14: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Invalid type annotation '<instance of Callable>' [invalid-annotation]"]
Line 19: Unexpected errors ["aliases_typealiastype.py:19:51: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Name 'GoodAlias4' is not defined [name-error]"]
Line 22: Unexpected errors ["aliases_typealiastype.py:22:40: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Name 'GoodAlias5' is not defined [name-error]", "aliases_typealiastype.py:22:66: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Invalid type annotation '<instance of tuple[nothing, ...]>' [invalid-annotation]"]
Line 19: Unexpected errors ["aliases_typealiastype.py:19:42: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: unsupported operand type(s) for |: 'T: TypeVar' and ''list[GoodAlias4[T]]': str' [unsupported-operands]"]
Line 22: Unexpected errors ["aliases_typealiastype.py:22:68: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Invalid type annotation '<instance of tuple[nothing, ...]>' [invalid-annotation]", "aliases_typealiastype.py:22:35: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: Invalid type annotation '<instance of TypeAliasType>' [invalid-annotation]"]
"""
4 changes: 2 additions & 2 deletions conformance/results/pytype/overloads_definitions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,8 @@ class Child(Base): # E[override-final]
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

\u001b[1m\u001b[31m\u001b[39m\u001b[0m
@override
\u001b[1m\u001b[31m~~~~~~~~~~~~~\u001b[39m\u001b[0m
@override # E[bad_override]
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m
def bad_override(self, x: int | str) -> int | str: # E[bad_override]
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m
...
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/pytype/overloads_definitions_stub.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Lines 39, 41, 44: Expected error (tag 'func6')
Lines 67, 69, 71, 73: Expected error (tag 'invalid_final')
Lines 80, 82, 84, 86: Expected error (tag 'invalid_final_2')
Lines 102, 107, 108, 111, 113: Expected error (tag 'override-final')
Lines 120, 122: Expected error (tag 'bad_override')
Lines 120, 121, 122: Expected error (tag 'bad_override')
Lines 143, 147, 149: Expected error (tag 'override_impl')
"""
output = """
Expand Down
7 changes: 4 additions & 3 deletions conformance/results/pytype/specialtypes_never.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ specialtypes_never.py:11:8: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in <mod
T_co = TypeVar("T_co", covariant=True)
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[39m\u001b[0m

specialtypes_never.py:21:5: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in func1: bad return type [bad-return-type]
specialtypes_never.py:21:8: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in func1: bad return type [bad-return-type]

sys.exit(1) \u001b[1m\u001b[31m~~~~~~~~~~~\u001b[39m\u001b[0m
sys.exit(1)
\u001b[1m\u001b[31m~~~~~~~~~~~~~~~\u001b[39m\u001b[0m
\u001b[1m\u001b[31m~~~~~~~~~~~~~\u001b[39m\u001b[0m

specialtypes_never.py:68:5: \u001b[1m\u001b[31merror\u001b[39m\u001b[0m: in func6: Type annotation for v1 does not match type of assignment [annotation-type-mismatch]

Expand Down Expand Up @@ -39,7 +40,7 @@ errors_diff = """
Line 19: Expected 1 errors
Line 105: Expected 1 errors
Line 11: Unexpected errors ['specialtypes_never.py:11:8: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in <module>: argument "covariant" to TypeVar not supported yet [not-supported-yet]']
Line 21: Unexpected errors ['specialtypes_never.py:21:5: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in func1: bad return type [bad-return-type]']
Line 21: Unexpected errors ['specialtypes_never.py:21:8: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in func1: bad return type [bad-return-type]']
Line 68: Unexpected errors ['specialtypes_never.py:68:5: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in func6: Type annotation for v1 does not match type of assignment [annotation-type-mismatch]']
Line 69: Unexpected errors ['specialtypes_never.py:69:5: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in func6: Type annotation for v2 does not match type of assignment [annotation-type-mismatch]']
Line 70: Unexpected errors ['specialtypes_never.py:70:5: \\x1b[1m\\x1b[31merror\\x1b[39m\\x1b[0m: in func6: Type annotation for v3 does not match type of assignment [annotation-type-mismatch]']
Expand Down
2 changes: 1 addition & 1 deletion conformance/results/pytype/version.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version = "pytype 2024.10.11"
test_duration = 31.3
test_duration = 33.6
Loading