|
9 | 9 |
|
10 | 10 | from frozenlist import FrozenList, PyFrozenList |
11 | 11 |
|
| 12 | +try: |
| 13 | + from frozenlist import CFrozenList |
| 14 | + |
| 15 | + HAS_CFROZENLIST = True |
| 16 | +except ImportError: |
| 17 | + HAS_CFROZENLIST = False |
| 18 | + |
12 | 19 |
|
13 | 20 | class FrozenListMixin: |
14 | 21 | FrozenList = NotImplemented |
@@ -414,33 +421,46 @@ def test_picklability_forward_compatible(self, freeze: bool) -> None: |
414 | 421 |
|
415 | 422 | # If this test breaks, we've changed the frozenlist data structure in an incompatible way |
416 | 423 | # with previous pickled binaries. |
417 | | - if self.FrozenList is FrozenList: |
| 424 | + if self.FrozenList is PyFrozenList: |
418 | 425 | if freeze: |
419 | 426 | assert ( |
420 | 427 | pickled |
421 | | - == b"cfrozenlist._frozenlist\nFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI01\nsb." |
| 428 | + == b"cfrozenlist\nPyFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI01\nsb." |
422 | 429 | ) |
423 | 430 | else: |
424 | 431 | assert ( |
425 | 432 | pickled |
426 | | - == b"cfrozenlist._frozenlist\nFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI00\nsb." |
| 433 | + == b"cfrozenlist\nPyFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI00\nsb." |
427 | 434 | ) |
428 | | - elif self.FrozenList is PyFrozenList: |
| 435 | + elif self.FrozenList is FrozenList: |
429 | 436 | if freeze: |
430 | 437 | assert ( |
431 | 438 | pickled |
432 | | - == b"cfrozenlist\n_reconstruct_pyfrozenlist\np0\n((lp1\nI1\naI2\naI01\ntp2\nRp3\n." |
| 439 | + == b"cfrozenlist._frozenlist\nFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI01\nsb." |
433 | 440 | ) |
434 | 441 | else: |
435 | 442 | assert ( |
436 | 443 | pickled |
437 | | - == b"cfrozenlist\n_reconstruct_pyfrozenlist\np0\n((lp1\nI1\naI2\naI00\ntp2\nRp3\n." |
| 444 | + == b"cfrozenlist._frozenlist\nFrozenList\np0\n((lp1\nI1\naI2\natp2\nRp3\n(dp4\nV_frozen\np5\nI00\nsb." |
438 | 445 | ) |
| 446 | + else: |
| 447 | + pytest.fail("Unknown FrozenList implementation.") |
439 | 448 |
|
440 | 449 |
|
441 | | -class TestFrozenList(FrozenListMixin): |
442 | | - FrozenList = FrozenList # type: ignore[assignment] # FIXME |
| 450 | +if HAS_CFROZENLIST: |
| 451 | + # If we don't have CFrozenList, skip adding the test class specifically for it. |
| 452 | + class TestFrozenList(FrozenListMixin): |
| 453 | + FrozenList = CFrozenList # type: ignore[assignment] # FIXME |
443 | 454 |
|
444 | 455 |
|
445 | 456 | class TestFrozenListPy(FrozenListMixin): |
| 457 | + # All implementations will at least have the Python version. |
446 | 458 | FrozenList = PyFrozenList # type: ignore[assignment] # FIXME |
| 459 | + |
| 460 | + |
| 461 | +def test_frozenlist_aliasing() -> None: |
| 462 | + """Test that FrozenList name points to the C extension if available, else to PyFrozenList.""" |
| 463 | + if HAS_CFROZENLIST: |
| 464 | + assert FrozenList is CFrozenList |
| 465 | + else: |
| 466 | + assert FrozenList is PyFrozenList |
0 commit comments