|
101 | 101 | reveal_type, |
102 | 102 | runtime, |
103 | 103 | runtime_checkable, |
| 104 | + type_repr, |
104 | 105 | ) |
105 | 106 |
|
106 | 107 | NoneType = type(None) |
@@ -1207,13 +1208,15 @@ class My(enum.Enum): |
1207 | 1208 |
|
1208 | 1209 | self.assertEqual(Literal[My.A].__args__, (My.A,)) |
1209 | 1210 |
|
1210 | | - def test_illegal_parameters_do_not_raise_runtime_errors(self): |
| 1211 | + def test_strange_parameters_are_allowed(self): |
| 1212 | + # These are explicitly allowed by the typing spec |
| 1213 | + Literal[Literal[1, 2], Literal[4, 5]] |
| 1214 | + Literal[b"foo", "bar"] |
| 1215 | + |
1211 | 1216 | # Type checkers should reject these types, but we do not |
1212 | 1217 | # raise errors at runtime to maintain maximum flexibility |
1213 | 1218 | Literal[int] |
1214 | | - Literal[Literal[1, 2], Literal[4, 5]] |
1215 | 1219 | Literal[3j + 2, ..., ()] |
1216 | | - Literal[b"foo", "bar"] |
1217 | 1220 | Literal[{"foo": 3, "bar": 4}] |
1218 | 1221 | Literal[T] |
1219 | 1222 |
|
@@ -8366,6 +8369,44 @@ def test_capsule_type(self): |
8366 | 8369 | self.assertIsInstance(_datetime.datetime_CAPI, typing_extensions.CapsuleType) |
8367 | 8370 |
|
8368 | 8371 |
|
| 8372 | +class MyClass: |
| 8373 | + def __repr__(self): |
| 8374 | + return "my repr" |
| 8375 | + |
| 8376 | + |
| 8377 | +class TestTypeRepr(BaseTestCase): |
| 8378 | + def test_custom_types(self): |
| 8379 | + |
| 8380 | + class Nested: |
| 8381 | + pass |
| 8382 | + |
| 8383 | + def nested(): |
| 8384 | + pass |
| 8385 | + |
| 8386 | + self.assertEqual(type_repr(MyClass), f"{__name__}.MyClass") |
| 8387 | + self.assertEqual( |
| 8388 | + type_repr(Nested), |
| 8389 | + f"{__name__}.TestTypeRepr.test_custom_types.<locals>.Nested", |
| 8390 | + ) |
| 8391 | + self.assertEqual( |
| 8392 | + type_repr(nested), |
| 8393 | + f"{__name__}.TestTypeRepr.test_custom_types.<locals>.nested", |
| 8394 | + ) |
| 8395 | + self.assertEqual(type_repr(times_three), f"{__name__}.times_three") |
| 8396 | + self.assertEqual(type_repr(Format.VALUE), repr(Format.VALUE)) |
| 8397 | + self.assertEqual(type_repr(MyClass()), "my repr") |
| 8398 | + |
| 8399 | + def test_builtin_types(self): |
| 8400 | + self.assertEqual(type_repr(int), "int") |
| 8401 | + self.assertEqual(type_repr(object), "object") |
| 8402 | + self.assertEqual(type_repr(None), "None") |
| 8403 | + self.assertEqual(type_repr(len), "len") |
| 8404 | + self.assertEqual(type_repr(1), "1") |
| 8405 | + self.assertEqual(type_repr("1"), "'1'") |
| 8406 | + self.assertEqual(type_repr(''), "''") |
| 8407 | + self.assertEqual(type_repr(...), "...") |
| 8408 | + |
| 8409 | + |
8369 | 8410 | def times_three(fn): |
8370 | 8411 | @functools.wraps(fn) |
8371 | 8412 | def wrapper(a, b): |
|
0 commit comments