test_frozenlist.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. # FIXME:
  2. # mypy: disable-error-code="misc"
  3. from collections.abc import MutableSequence
  4. import pytest
  5. from frozenlist import FrozenList, PyFrozenList
  6. class FrozenListMixin:
  7. FrozenList = NotImplemented
  8. SKIP_METHODS = {
  9. "__abstractmethods__",
  10. "__slots__",
  11. "__static_attributes__",
  12. "__firstlineno__",
  13. }
  14. def test___class_getitem__(self) -> None:
  15. assert self.FrozenList[str] is not None
  16. def test_subclass(self) -> None:
  17. assert issubclass(self.FrozenList, MutableSequence)
  18. def test_iface(self) -> None:
  19. for name in set(dir(MutableSequence)) - self.SKIP_METHODS:
  20. if name.startswith("_") and not name.endswith("_"):
  21. continue
  22. assert hasattr(self.FrozenList, name)
  23. def test_ctor_default(self) -> None:
  24. _list = self.FrozenList([])
  25. assert not _list.frozen
  26. def test_ctor(self) -> None:
  27. _list = self.FrozenList([1])
  28. assert not _list.frozen
  29. def test_ctor_copy_list(self) -> None:
  30. orig = [1]
  31. _list = self.FrozenList(orig)
  32. del _list[0]
  33. assert _list != orig
  34. def test_freeze(self) -> None:
  35. _list = self.FrozenList()
  36. _list.freeze()
  37. assert _list.frozen
  38. def test_repr(self) -> None:
  39. _list = self.FrozenList([1])
  40. assert repr(_list) == "<FrozenList(frozen=False, [1])>"
  41. _list.freeze()
  42. assert repr(_list) == "<FrozenList(frozen=True, [1])>"
  43. def test_getitem(self) -> None:
  44. _list = self.FrozenList([1, 2])
  45. assert _list[1] == 2
  46. def test_setitem(self) -> None:
  47. _list = self.FrozenList([1, 2])
  48. _list[1] = 3
  49. assert _list[1] == 3
  50. def test_delitem(self) -> None:
  51. _list = self.FrozenList([1, 2])
  52. del _list[0]
  53. assert len(_list) == 1
  54. assert _list[0] == 2
  55. def test_len(self) -> None:
  56. _list = self.FrozenList([1])
  57. assert len(_list) == 1
  58. def test_iter(self) -> None:
  59. _list = self.FrozenList([1, 2])
  60. assert list(iter(_list)) == [1, 2]
  61. def test_reversed(self) -> None:
  62. _list = self.FrozenList([1, 2])
  63. assert list(reversed(_list)) == [2, 1]
  64. def test_eq(self) -> None:
  65. _list = self.FrozenList([1])
  66. assert _list == [1]
  67. def test_ne(self) -> None:
  68. _list = self.FrozenList([1])
  69. assert _list != [2]
  70. def test_le(self) -> None:
  71. _list = self.FrozenList([1])
  72. assert _list <= [1]
  73. def test_lt(self) -> None:
  74. _list = self.FrozenList([1])
  75. assert _list < [3]
  76. def test_ge(self) -> None:
  77. _list = self.FrozenList([1])
  78. assert _list >= [1]
  79. def test_gt(self) -> None:
  80. _list = self.FrozenList([2])
  81. assert _list > [1]
  82. def test_insert(self) -> None:
  83. _list = self.FrozenList([2])
  84. _list.insert(0, 1)
  85. assert _list == [1, 2]
  86. def test_frozen_setitem(self) -> None:
  87. _list = self.FrozenList([1])
  88. _list.freeze()
  89. with pytest.raises(RuntimeError):
  90. _list[0] = 2
  91. def test_frozen_delitem(self) -> None:
  92. _list = self.FrozenList([1])
  93. _list.freeze()
  94. with pytest.raises(RuntimeError):
  95. del _list[0]
  96. def test_frozen_insert(self) -> None:
  97. _list = self.FrozenList([1])
  98. _list.freeze()
  99. with pytest.raises(RuntimeError):
  100. _list.insert(0, 2)
  101. def test_contains(self) -> None:
  102. _list = self.FrozenList([2])
  103. assert 2 in _list
  104. def test_iadd(self) -> None:
  105. _list = self.FrozenList([1])
  106. _list += [2]
  107. assert _list == [1, 2]
  108. def test_iadd_frozen(self) -> None:
  109. _list = self.FrozenList([1])
  110. _list.freeze()
  111. with pytest.raises(RuntimeError):
  112. _list += [2]
  113. assert _list == [1]
  114. def test_index(self) -> None:
  115. _list = self.FrozenList([1])
  116. assert _list.index(1) == 0
  117. def test_remove(self) -> None:
  118. _list = self.FrozenList([1])
  119. _list.remove(1)
  120. assert len(_list) == 0
  121. def test_remove_frozen(self) -> None:
  122. _list = self.FrozenList([1])
  123. _list.freeze()
  124. with pytest.raises(RuntimeError):
  125. _list.remove(1)
  126. assert _list == [1]
  127. def test_clear(self) -> None:
  128. _list = self.FrozenList([1])
  129. _list.clear()
  130. assert len(_list) == 0
  131. def test_clear_frozen(self) -> None:
  132. _list = self.FrozenList([1])
  133. _list.freeze()
  134. with pytest.raises(RuntimeError):
  135. _list.clear()
  136. assert _list == [1]
  137. def test_extend(self) -> None:
  138. _list = self.FrozenList([1])
  139. _list.extend([2])
  140. assert _list == [1, 2]
  141. def test_extend_frozen(self) -> None:
  142. _list = self.FrozenList([1])
  143. _list.freeze()
  144. with pytest.raises(RuntimeError):
  145. _list.extend([2])
  146. assert _list == [1]
  147. def test_reverse(self) -> None:
  148. _list = self.FrozenList([1, 2])
  149. _list.reverse()
  150. assert _list == [2, 1]
  151. def test_reverse_frozen(self) -> None:
  152. _list = self.FrozenList([1, 2])
  153. _list.freeze()
  154. with pytest.raises(RuntimeError):
  155. _list.reverse()
  156. assert _list == [1, 2]
  157. def test_pop(self) -> None:
  158. _list = self.FrozenList([1, 2])
  159. assert _list.pop(0) == 1
  160. assert _list == [2]
  161. def test_pop_default(self) -> None:
  162. _list = self.FrozenList([1, 2])
  163. assert _list.pop() == 2
  164. assert _list == [1]
  165. def test_pop_frozen(self) -> None:
  166. _list = self.FrozenList([1, 2])
  167. _list.freeze()
  168. with pytest.raises(RuntimeError):
  169. _list.pop()
  170. assert _list == [1, 2]
  171. def test_append(self) -> None:
  172. _list = self.FrozenList([1, 2])
  173. _list.append(3)
  174. assert _list == [1, 2, 3]
  175. def test_append_frozen(self) -> None:
  176. _list = self.FrozenList([1, 2])
  177. _list.freeze()
  178. with pytest.raises(RuntimeError):
  179. _list.append(3)
  180. assert _list == [1, 2]
  181. def test_hash(self) -> None:
  182. _list = self.FrozenList([1, 2])
  183. with pytest.raises(RuntimeError):
  184. hash(_list)
  185. def test_hash_frozen(self) -> None:
  186. _list = self.FrozenList([1, 2])
  187. _list.freeze()
  188. h = hash(_list)
  189. assert h == hash((1, 2))
  190. def test_dict_key(self) -> None:
  191. _list = self.FrozenList([1, 2])
  192. with pytest.raises(RuntimeError):
  193. {_list: "hello"}
  194. _list.freeze()
  195. {_list: "hello"}
  196. def test_count(self) -> None:
  197. _list = self.FrozenList([1, 2])
  198. assert _list.count(1) == 1
  199. class TestFrozenList(FrozenListMixin):
  200. FrozenList = FrozenList # type: ignore[assignment] # FIXME
  201. class TestFrozenListPy(FrozenListMixin):
  202. FrozenList = PyFrozenList # type: ignore[assignment] # FIXME