datahold 4.0.0.dev42__tar.gz → 4.0.0.dev43__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/PKG-INFO +1 -1
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/pyproject.toml +1 -1
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold.egg-info/PKG-INFO +1 -1
- datahold-4.0.0.dev43/tests/test_MutableListSlot.py +628 -0
- datahold-4.0.0.dev42/tests/test_MutableListSlot.py +0 -658
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/README.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/run_tests.py +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/setup.cfg +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold/__init__.py +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold.egg-info/SOURCES.txt +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold.egg-info/requires.txt +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/src/datahold.egg-info/top_level.txt +0 -0
- {datahold-4.0.0.dev42 → datahold-4.0.0.dev43}/tests/testdata.toml +0 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
from typing import Any, Self
|
|
3
|
+
|
|
4
|
+
from datahold import MutableListSlot
|
|
5
|
+
|
|
6
|
+
__all__: list[str] = []
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def init() -> None:
|
|
10
|
+
update: dict[str, type[unittest.TestCase]]
|
|
11
|
+
update = dict()
|
|
12
|
+
for x, y in make_test_cases(list).items():
|
|
13
|
+
y.__qualname__ = y.__name__ = x + "List"
|
|
14
|
+
update[y.__name__] = y
|
|
15
|
+
for x, y in make_test_cases(MutableListSlot).items():
|
|
16
|
+
y.__qualname__ = y.__name__ = x + "MutableListSlot"
|
|
17
|
+
update[y.__name__] = y
|
|
18
|
+
update = dict(sorted(update.items()))
|
|
19
|
+
globals().update(update)
|
|
20
|
+
__all__.extend(update)
|
|
21
|
+
__all__.sort()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def make_test_cases(TYPE: type[Any]) -> dict[str, type[unittest.TestCase]]:
|
|
25
|
+
|
|
26
|
+
class TestMethodAppend(unittest.TestCase):
|
|
27
|
+
def test_append_to_empty(self: Self, /) -> None:
|
|
28
|
+
value = TYPE()
|
|
29
|
+
value.append(1)
|
|
30
|
+
self.assertEqual(tuple(value), (1,))
|
|
31
|
+
|
|
32
|
+
def test_append_to_nonempty(self: Self, /) -> None:
|
|
33
|
+
value = TYPE([1, 2])
|
|
34
|
+
value.append(3)
|
|
35
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
36
|
+
|
|
37
|
+
def test_append_object(self: Self, /) -> None:
|
|
38
|
+
obj = {"a": 1}
|
|
39
|
+
value = TYPE()
|
|
40
|
+
value.append(obj)
|
|
41
|
+
self.assertIs(value[0], obj)
|
|
42
|
+
|
|
43
|
+
def test_append_returns_none(self: Self, /) -> None:
|
|
44
|
+
value = TYPE()
|
|
45
|
+
self.assertIsNone(value.append(1))
|
|
46
|
+
|
|
47
|
+
class TestMethodClear(unittest.TestCase):
|
|
48
|
+
def test_clear_nonempty(self: Self, /) -> None:
|
|
49
|
+
value = TYPE([1, 2, 3])
|
|
50
|
+
value.clear()
|
|
51
|
+
self.assertEqual(tuple(value), ())
|
|
52
|
+
|
|
53
|
+
def test_clear_empty(self: Self, /) -> None:
|
|
54
|
+
value = TYPE()
|
|
55
|
+
value.clear()
|
|
56
|
+
self.assertEqual(tuple(value), ())
|
|
57
|
+
|
|
58
|
+
def test_clear_mixed_values(self: Self, /) -> None:
|
|
59
|
+
value = TYPE([1, "a", None, []])
|
|
60
|
+
value.clear()
|
|
61
|
+
self.assertEqual(tuple(value), ())
|
|
62
|
+
|
|
63
|
+
def test_clear_returns_none(self: Self, /) -> None:
|
|
64
|
+
value = TYPE([1])
|
|
65
|
+
self.assertIsNone(value.clear())
|
|
66
|
+
|
|
67
|
+
class TestMethodCopy(unittest.TestCase):
|
|
68
|
+
def test_copy_has_same_contents(self: Self, /) -> None:
|
|
69
|
+
value = TYPE([1, 2, 3])
|
|
70
|
+
copied = value.copy()
|
|
71
|
+
self.assertEqual(copied, value)
|
|
72
|
+
|
|
73
|
+
def test_copy_is_distinct_object(self: Self, /) -> None:
|
|
74
|
+
value = TYPE([1, 2, 3])
|
|
75
|
+
copied = value.copy()
|
|
76
|
+
self.assertIsNot(copied, value)
|
|
77
|
+
|
|
78
|
+
def test_copy_is_shallow(self: Self, /) -> None:
|
|
79
|
+
nested: list[object]
|
|
80
|
+
nested = []
|
|
81
|
+
value = TYPE([nested])
|
|
82
|
+
copied = value.copy()
|
|
83
|
+
self.assertIs(copied[0], nested)
|
|
84
|
+
|
|
85
|
+
def test_copy_empty(self: Self, /) -> None:
|
|
86
|
+
value = TYPE()
|
|
87
|
+
copied = value.copy()
|
|
88
|
+
self.assertEqual(tuple(copied), ())
|
|
89
|
+
|
|
90
|
+
class TestMethodCount(unittest.TestCase):
|
|
91
|
+
def test_count_existing_once(self: Self, /) -> None:
|
|
92
|
+
value = TYPE([1, 2, 3])
|
|
93
|
+
self.assertEqual(value.count(2), 1)
|
|
94
|
+
|
|
95
|
+
def test_count_existing_multiple_times(self: Self, /) -> None:
|
|
96
|
+
value = TYPE([1, 2, 1, 1])
|
|
97
|
+
self.assertEqual(value.count(1), 3)
|
|
98
|
+
|
|
99
|
+
def test_count_missing(self: Self, /) -> None:
|
|
100
|
+
value = TYPE([1, 2, 3])
|
|
101
|
+
self.assertEqual(value.count(4), 0)
|
|
102
|
+
|
|
103
|
+
def test_count_empty(self: Self, /) -> None:
|
|
104
|
+
value = TYPE()
|
|
105
|
+
self.assertEqual(value.count(1), 0)
|
|
106
|
+
|
|
107
|
+
class TestMethodExtend(unittest.TestCase):
|
|
108
|
+
def test_extend_with_list(self: Self, /) -> None:
|
|
109
|
+
value = TYPE([1])
|
|
110
|
+
value.extend([2, 3])
|
|
111
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
112
|
+
|
|
113
|
+
def test_extend_empty(self: Self, /) -> None:
|
|
114
|
+
value = TYPE([1])
|
|
115
|
+
value.extend([])
|
|
116
|
+
self.assertEqual(tuple(value), (1,))
|
|
117
|
+
|
|
118
|
+
def test_extend_with_tuple(self: Self, /) -> None:
|
|
119
|
+
value = TYPE([1])
|
|
120
|
+
value.extend((2, 3))
|
|
121
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
122
|
+
|
|
123
|
+
def test_extend_returns_none(self: Self, /) -> None:
|
|
124
|
+
value = TYPE()
|
|
125
|
+
self.assertIsNone(value.extend([1, 2]))
|
|
126
|
+
|
|
127
|
+
class TestMethodIndex(unittest.TestCase):
|
|
128
|
+
def test_index_existing(self: Self, /) -> None:
|
|
129
|
+
value = TYPE(["a", "b", "c"])
|
|
130
|
+
self.assertEqual(value.index("b"), 1)
|
|
131
|
+
|
|
132
|
+
def test_index_returns_first_match(self: Self, /) -> None:
|
|
133
|
+
value = TYPE([1, 2, 1])
|
|
134
|
+
self.assertEqual(value.index(1), 0)
|
|
135
|
+
|
|
136
|
+
def test_index_with_start(self: Self, /) -> None:
|
|
137
|
+
value = TYPE([1, 2, 1])
|
|
138
|
+
self.assertEqual(value.index(1, 1), 2)
|
|
139
|
+
|
|
140
|
+
def test_index_missing_raises_value_error(self: Self, /) -> None:
|
|
141
|
+
value = TYPE([1, 2, 3])
|
|
142
|
+
with self.assertRaises(ValueError):
|
|
143
|
+
value.index(4)
|
|
144
|
+
|
|
145
|
+
class TestMethodInsert(unittest.TestCase):
|
|
146
|
+
def test_insert_at_start(self: Self, /) -> None:
|
|
147
|
+
value = TYPE([2, 3])
|
|
148
|
+
value.insert(0, 1)
|
|
149
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
150
|
+
|
|
151
|
+
def test_insert_in_middle(self: Self, /) -> None:
|
|
152
|
+
value = TYPE([1, 3])
|
|
153
|
+
value.insert(1, 2)
|
|
154
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
155
|
+
|
|
156
|
+
def test_insert_past_end(self: Self, /) -> None:
|
|
157
|
+
value = TYPE([1, 2])
|
|
158
|
+
value.insert(100, 3)
|
|
159
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
160
|
+
|
|
161
|
+
def test_insert_returns_none(self: Self, /) -> None:
|
|
162
|
+
value = TYPE()
|
|
163
|
+
self.assertIsNone(value.insert(0, 1))
|
|
164
|
+
|
|
165
|
+
class TestMethodPop(unittest.TestCase):
|
|
166
|
+
def test_pop_last(self: Self, /) -> None:
|
|
167
|
+
value = TYPE([1, 2, 3])
|
|
168
|
+
result = value.pop()
|
|
169
|
+
self.assertEqual(result, 3)
|
|
170
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
171
|
+
|
|
172
|
+
def test_pop_first(self: Self, /) -> None:
|
|
173
|
+
value = TYPE([1, 2, 3])
|
|
174
|
+
result = value.pop(0)
|
|
175
|
+
self.assertEqual(result, 1)
|
|
176
|
+
self.assertEqual(tuple(value), (2, 3))
|
|
177
|
+
|
|
178
|
+
def test_pop_negative_index(self: Self, /) -> None:
|
|
179
|
+
value = TYPE([1, 2, 3])
|
|
180
|
+
result = value.pop(-2)
|
|
181
|
+
self.assertEqual(result, 2)
|
|
182
|
+
self.assertEqual(tuple(value), (1, 3))
|
|
183
|
+
|
|
184
|
+
def test_pop_empty_raises_index_error(self: Self, /) -> None:
|
|
185
|
+
value = TYPE()
|
|
186
|
+
with self.assertRaises(IndexError):
|
|
187
|
+
value.pop()
|
|
188
|
+
|
|
189
|
+
class TestMethodRemove(unittest.TestCase):
|
|
190
|
+
def test_remove_existing(self: Self, /) -> None:
|
|
191
|
+
value = TYPE([1, 2, 3])
|
|
192
|
+
value.remove(2)
|
|
193
|
+
self.assertEqual(tuple(value), (1, 3))
|
|
194
|
+
|
|
195
|
+
def test_remove_only_first_match(self: Self, /) -> None:
|
|
196
|
+
value = TYPE([1, 2, 1])
|
|
197
|
+
value.remove(1)
|
|
198
|
+
self.assertEqual(tuple(value), (2, 1))
|
|
199
|
+
|
|
200
|
+
def test_remove_missing_raises_value_error(self: Self, /) -> None:
|
|
201
|
+
value = TYPE([1, 2, 3])
|
|
202
|
+
with self.assertRaises(ValueError):
|
|
203
|
+
value.remove(4)
|
|
204
|
+
|
|
205
|
+
def test_remove_returns_none(self: Self, /) -> None:
|
|
206
|
+
value = TYPE([1])
|
|
207
|
+
self.assertIsNone(value.remove(1))
|
|
208
|
+
|
|
209
|
+
class TestMethodReverse(unittest.TestCase):
|
|
210
|
+
def test_reverse_multiple_items(self: Self, /) -> None:
|
|
211
|
+
value = TYPE([1, 2, 3])
|
|
212
|
+
value.reverse()
|
|
213
|
+
self.assertEqual(tuple(value), (3, 2, 1))
|
|
214
|
+
|
|
215
|
+
def test_reverse_single_item(self: Self, /) -> None:
|
|
216
|
+
value = TYPE([1])
|
|
217
|
+
value.reverse()
|
|
218
|
+
self.assertEqual(tuple(value), (1,))
|
|
219
|
+
|
|
220
|
+
def test_reverse_empty(self: Self, /) -> None:
|
|
221
|
+
value = TYPE()
|
|
222
|
+
value.reverse()
|
|
223
|
+
self.assertEqual(tuple(value), ())
|
|
224
|
+
|
|
225
|
+
def test_reverse_returns_none(self: Self, /) -> None:
|
|
226
|
+
value = TYPE([1, 2])
|
|
227
|
+
self.assertIsNone(value.reverse())
|
|
228
|
+
|
|
229
|
+
class TestMethodSort(unittest.TestCase):
|
|
230
|
+
def test_sort_ascending(self: Self, /) -> None:
|
|
231
|
+
value = TYPE([3, 1, 2])
|
|
232
|
+
value.sort()
|
|
233
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
234
|
+
|
|
235
|
+
def test_sort_reverse(self: Self, /) -> None:
|
|
236
|
+
value = TYPE([1, 3, 2])
|
|
237
|
+
value.sort(reverse=True)
|
|
238
|
+
self.assertEqual(tuple(value), (3, 2, 1))
|
|
239
|
+
|
|
240
|
+
def test_sort_with_key(self: Self, /) -> None:
|
|
241
|
+
value = TYPE(["bbb", "a", "cc"])
|
|
242
|
+
value.sort(key=len)
|
|
243
|
+
self.assertEqual(tuple(value), ("a", "cc", "bbb"))
|
|
244
|
+
|
|
245
|
+
def test_sort_returns_none(self: Self, /) -> None:
|
|
246
|
+
value = TYPE([2, 1])
|
|
247
|
+
self.assertIsNone(value.sort())
|
|
248
|
+
|
|
249
|
+
class TestOperatorAdd(unittest.TestCase):
|
|
250
|
+
def test_add_two_nonempty_lists(self: Self, /) -> None:
|
|
251
|
+
result = TYPE([1, 2]) + TYPE([3, 4])
|
|
252
|
+
self.assertEqual(tuple(result), (1, 2, 3, 4))
|
|
253
|
+
|
|
254
|
+
def test_add_empty_list(self: Self, /) -> None:
|
|
255
|
+
result = TYPE([1, 2]) + TYPE([])
|
|
256
|
+
self.assertEqual(tuple(result), (1, 2))
|
|
257
|
+
|
|
258
|
+
def test_add_to_empty_slot(self: Self, /) -> None:
|
|
259
|
+
result = TYPE([]) + TYPE([1, 2])
|
|
260
|
+
self.assertEqual(tuple(result), (1, 2))
|
|
261
|
+
|
|
262
|
+
def test_add_does_not_modify_original(self: Self, /) -> None:
|
|
263
|
+
value = TYPE([1, 2])
|
|
264
|
+
value + TYPE([3])
|
|
265
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
266
|
+
|
|
267
|
+
class TestOperatorContains(unittest.TestCase):
|
|
268
|
+
def test_contains_first_element(self: Self, /) -> None:
|
|
269
|
+
self.assertTrue(1 in TYPE([1, 2, 3]))
|
|
270
|
+
|
|
271
|
+
def test_contains_last_element(self: Self, /) -> None:
|
|
272
|
+
self.assertTrue(3 in TYPE([1, 2, 3]))
|
|
273
|
+
|
|
274
|
+
def test_does_not_contain_missing_element(self: Self, /) -> None:
|
|
275
|
+
self.assertFalse(4 in TYPE([1, 2, 3]))
|
|
276
|
+
|
|
277
|
+
def test_empty_slot_contains_nothing(self: Self, /) -> None:
|
|
278
|
+
self.assertFalse(1 in TYPE([]))
|
|
279
|
+
|
|
280
|
+
class TestOperatorDelItem(unittest.TestCase):
|
|
281
|
+
def test_delete_first_item(self: Self, /) -> None:
|
|
282
|
+
value = TYPE([1, 2, 3])
|
|
283
|
+
del value[0]
|
|
284
|
+
self.assertEqual(tuple(value), (2, 3))
|
|
285
|
+
|
|
286
|
+
def test_delete_last_item(self: Self, /) -> None:
|
|
287
|
+
value = TYPE([1, 2, 3])
|
|
288
|
+
del value[-1]
|
|
289
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
290
|
+
|
|
291
|
+
def test_delete_slice(self: Self, /) -> None:
|
|
292
|
+
value = TYPE([1, 2, 3, 4])
|
|
293
|
+
del value[1:3]
|
|
294
|
+
self.assertEqual(tuple(value), (1, 4))
|
|
295
|
+
|
|
296
|
+
def test_delete_out_of_range_raises(self: Self, /) -> None:
|
|
297
|
+
value = TYPE([1, 2])
|
|
298
|
+
with self.assertRaises(IndexError):
|
|
299
|
+
del value[5]
|
|
300
|
+
|
|
301
|
+
class TestOperatorEqual(unittest.TestCase):
|
|
302
|
+
def test_equal_same_contents(self: Self, /) -> None:
|
|
303
|
+
self.assertTrue(TYPE([1, 2]) == TYPE([1, 2]))
|
|
304
|
+
|
|
305
|
+
def test_equal_empty_lists(self: Self, /) -> None:
|
|
306
|
+
self.assertTrue(TYPE([]) == TYPE([]))
|
|
307
|
+
|
|
308
|
+
def test_not_equal_different_values(self: Self, /) -> None:
|
|
309
|
+
self.assertFalse(TYPE([1, 2]) == TYPE([1, 3]))
|
|
310
|
+
|
|
311
|
+
def test_not_equal_different_lengths(self: Self, /) -> None:
|
|
312
|
+
self.assertFalse(TYPE([1, 2]) == TYPE([1, 2, 3]))
|
|
313
|
+
|
|
314
|
+
class TestOperatorGetItem(unittest.TestCase):
|
|
315
|
+
def test_get_first_item(self: Self, /) -> None:
|
|
316
|
+
value = TYPE([10, 20, 30])
|
|
317
|
+
self.assertEqual(value[0], 10)
|
|
318
|
+
|
|
319
|
+
def test_get_last_item_with_negative_index(self: Self, /) -> None:
|
|
320
|
+
value = TYPE([10, 20, 30])
|
|
321
|
+
self.assertEqual(value[-1], 30)
|
|
322
|
+
|
|
323
|
+
def test_get_slice(self: Self, /) -> None:
|
|
324
|
+
value = TYPE([1, 2, 3, 4])
|
|
325
|
+
self.assertEqual(value[1:3], TYPE([2, 3]))
|
|
326
|
+
|
|
327
|
+
def test_out_of_range_index_raises(self: Self, /) -> None:
|
|
328
|
+
value = TYPE([1, 2])
|
|
329
|
+
with self.assertRaises(IndexError):
|
|
330
|
+
value[5]
|
|
331
|
+
|
|
332
|
+
class TestOperatorGreaterThan(unittest.TestCase):
|
|
333
|
+
def test_greater_than_by_first_element(self: Self, /) -> None:
|
|
334
|
+
self.assertTrue(TYPE([2, 0]) > TYPE([1, 9]))
|
|
335
|
+
|
|
336
|
+
def test_greater_than_by_later_element(self: Self, /) -> None:
|
|
337
|
+
self.assertTrue(TYPE([1, 3]) > TYPE([1, 2]))
|
|
338
|
+
|
|
339
|
+
def test_longer_list_is_greater_than_prefix(self: Self, /) -> None:
|
|
340
|
+
self.assertTrue(TYPE([1, 2, 3]) > TYPE([1, 2]))
|
|
341
|
+
|
|
342
|
+
def test_equal_list_is_not_greater_than(self: Self, /) -> None:
|
|
343
|
+
self.assertFalse(TYPE([1, 2]) > TYPE([1, 2]))
|
|
344
|
+
|
|
345
|
+
class TestOperatorGreaterThanOrEqual(unittest.TestCase):
|
|
346
|
+
def test_greater_value_is_greater_or_equal(self: Self, /) -> None:
|
|
347
|
+
self.assertTrue(TYPE([2]) >= TYPE([1]))
|
|
348
|
+
|
|
349
|
+
def test_equal_value_is_greater_or_equal(self: Self, /) -> None:
|
|
350
|
+
self.assertTrue(TYPE([1, 2]) >= TYPE([1, 2]))
|
|
351
|
+
|
|
352
|
+
def test_longer_list_is_greater_or_equal_to_prefix(
|
|
353
|
+
self: Self, /
|
|
354
|
+
) -> None:
|
|
355
|
+
self.assertTrue(TYPE([1, 2]) >= TYPE([1]))
|
|
356
|
+
|
|
357
|
+
def test_smaller_value_is_not_greater_or_equal(self: Self, /) -> None:
|
|
358
|
+
self.assertFalse(TYPE([1]) >= TYPE([2]))
|
|
359
|
+
|
|
360
|
+
class TestOperatorIAdd(unittest.TestCase):
|
|
361
|
+
def test_iadd_nonempty_list(self: Self, /) -> None:
|
|
362
|
+
value = TYPE([1, 2])
|
|
363
|
+
value += [3, 4]
|
|
364
|
+
self.assertEqual(tuple(value), (1, 2, 3, 4))
|
|
365
|
+
|
|
366
|
+
def test_iadd_empty_list(self: Self, /) -> None:
|
|
367
|
+
value = TYPE([1, 2])
|
|
368
|
+
value += ""
|
|
369
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
370
|
+
|
|
371
|
+
def test_iadd_to_empty_slot(self: Self, /) -> None:
|
|
372
|
+
value = TYPE([])
|
|
373
|
+
value += (1, 2)
|
|
374
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
375
|
+
|
|
376
|
+
def test_iadd_multiple_times(self: Self, /) -> None:
|
|
377
|
+
value = TYPE([1])
|
|
378
|
+
value += [2]
|
|
379
|
+
value += [3]
|
|
380
|
+
self.assertEqual(tuple(value), (1, 2, 3))
|
|
381
|
+
|
|
382
|
+
class TestOperatorLessThan(unittest.TestCase):
|
|
383
|
+
def test_less_than_by_first_element(self: Self, /) -> None:
|
|
384
|
+
self.assertTrue(TYPE([1, 9]) < TYPE([2, 0]))
|
|
385
|
+
|
|
386
|
+
def test_less_than_by_later_element(self: Self, /) -> None:
|
|
387
|
+
self.assertTrue(TYPE([1, 2]) < TYPE([1, 3]))
|
|
388
|
+
|
|
389
|
+
def test_prefix_is_less_than_longer_list(self: Self, /) -> None:
|
|
390
|
+
self.assertTrue(TYPE([1, 2]) < TYPE([1, 2, 3]))
|
|
391
|
+
|
|
392
|
+
def test_equal_list_is_not_less_than(self: Self, /) -> None:
|
|
393
|
+
self.assertFalse(TYPE([1, 2]) < TYPE([1, 2]))
|
|
394
|
+
|
|
395
|
+
class TestOperatorLessThanOrEqual(unittest.TestCase):
|
|
396
|
+
def test_less_value_is_less_or_equal(self: Self, /) -> None:
|
|
397
|
+
self.assertTrue(TYPE([1]) <= TYPE([2]))
|
|
398
|
+
|
|
399
|
+
def test_equal_value_is_less_or_equal(self: Self, /) -> None:
|
|
400
|
+
self.assertTrue(TYPE([1, 2]) <= TYPE([1, 2]))
|
|
401
|
+
|
|
402
|
+
def test_prefix_is_less_or_equal(self: Self, /) -> None:
|
|
403
|
+
self.assertTrue(TYPE([1]) <= TYPE([1, 2]))
|
|
404
|
+
|
|
405
|
+
def test_greater_value_is_not_less_or_equal(self: Self, /) -> None:
|
|
406
|
+
self.assertFalse(TYPE([2]) <= TYPE([1]))
|
|
407
|
+
|
|
408
|
+
class TestOperatorMul(unittest.TestCase):
|
|
409
|
+
def test_multiply_by_positive_integer(self: Self, /) -> None:
|
|
410
|
+
result = TYPE([1, 2]) * 3
|
|
411
|
+
self.assertEqual(tuple(result), (1, 2, 1, 2, 1, 2))
|
|
412
|
+
|
|
413
|
+
def test_multiply_by_one(self: Self, /) -> None:
|
|
414
|
+
result = TYPE([1, 2]) * 1
|
|
415
|
+
self.assertEqual(tuple(result), (1, 2))
|
|
416
|
+
|
|
417
|
+
def test_multiply_by_zero(self: Self, /) -> None:
|
|
418
|
+
result = TYPE([1, 2]) * 0
|
|
419
|
+
self.assertEqual(tuple(result), ())
|
|
420
|
+
|
|
421
|
+
def test_multiply_by_negative_integer(self: Self, /) -> None:
|
|
422
|
+
result = TYPE([1, 2]) * -2
|
|
423
|
+
self.assertEqual(tuple(result), ())
|
|
424
|
+
|
|
425
|
+
class TestOperatorIMul(unittest.TestCase):
|
|
426
|
+
def test_imul_by_positive_integer(self: Self, /) -> None:
|
|
427
|
+
value = TYPE([1, 2])
|
|
428
|
+
value *= 2
|
|
429
|
+
self.assertEqual(tuple(value), (1, 2, 1, 2))
|
|
430
|
+
|
|
431
|
+
def test_imul_by_one(self: Self, /) -> None:
|
|
432
|
+
value = TYPE([1, 2])
|
|
433
|
+
value *= 1
|
|
434
|
+
self.assertEqual(tuple(value), (1, 2))
|
|
435
|
+
|
|
436
|
+
def test_imul_by_zero(self: Self, /) -> None:
|
|
437
|
+
value = TYPE([1, 2])
|
|
438
|
+
value *= 0
|
|
439
|
+
self.assertEqual(tuple(value), ())
|
|
440
|
+
|
|
441
|
+
def test_imul_by_negative_integer(self: Self, /) -> None:
|
|
442
|
+
value = TYPE([1, 2])
|
|
443
|
+
value *= -1
|
|
444
|
+
self.assertEqual(tuple(value), ())
|
|
445
|
+
|
|
446
|
+
class TestOperatorIterSequence(unittest.TestCase):
|
|
447
|
+
def test_shrinking_makes_next_index_out_of_range(
|
|
448
|
+
self: Self, /
|
|
449
|
+
) -> None:
|
|
450
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
451
|
+
iterator = iter(values)
|
|
452
|
+
|
|
453
|
+
self.assertEqual(next(iterator), 0)
|
|
454
|
+
del values[1:]
|
|
455
|
+
|
|
456
|
+
with self.assertRaises(StopIteration):
|
|
457
|
+
next(iterator)
|
|
458
|
+
|
|
459
|
+
def test_exhaustion_remains_after_regrowth(self: Self, /) -> None:
|
|
460
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
461
|
+
iterator = iter(values)
|
|
462
|
+
|
|
463
|
+
self.assertEqual(next(iterator), 0)
|
|
464
|
+
del values[1:]
|
|
465
|
+
|
|
466
|
+
with self.assertRaises(StopIteration):
|
|
467
|
+
next(iterator)
|
|
468
|
+
|
|
469
|
+
values.extend([10, 11, 12, 13])
|
|
470
|
+
|
|
471
|
+
with self.assertRaises(StopIteration):
|
|
472
|
+
next(iterator)
|
|
473
|
+
|
|
474
|
+
def test_regrowth_before_next_restores_valid_index(
|
|
475
|
+
self: Self, /
|
|
476
|
+
) -> None:
|
|
477
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
478
|
+
iterator = iter(values)
|
|
479
|
+
|
|
480
|
+
self.assertEqual(next(iterator), 0)
|
|
481
|
+
del values[1:]
|
|
482
|
+
values.extend([10, 11, 12])
|
|
483
|
+
|
|
484
|
+
self.assertEqual(next(iterator), 10)
|
|
485
|
+
|
|
486
|
+
def test_deletion_before_cursor_does_not_repair_index(
|
|
487
|
+
self: Self, /
|
|
488
|
+
) -> None:
|
|
489
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
490
|
+
iterator = iter(values)
|
|
491
|
+
|
|
492
|
+
self.assertEqual(next(iterator), 0)
|
|
493
|
+
del values[0]
|
|
494
|
+
|
|
495
|
+
self.assertEqual(next(iterator), 2)
|
|
496
|
+
|
|
497
|
+
def test_growth_before_exhaustion_is_seen(self: Self, /) -> None:
|
|
498
|
+
values = TYPE([0, 1])
|
|
499
|
+
iterator = iter(values)
|
|
500
|
+
|
|
501
|
+
self.assertEqual(next(iterator), 0)
|
|
502
|
+
self.assertEqual(next(iterator), 1)
|
|
503
|
+
|
|
504
|
+
values.append(2)
|
|
505
|
+
|
|
506
|
+
self.assertEqual(next(iterator), 2)
|
|
507
|
+
|
|
508
|
+
class TestOperatorNotEqual(unittest.TestCase):
|
|
509
|
+
def test_not_equal_different_contents(self: Self, /) -> None:
|
|
510
|
+
self.assertTrue(TYPE([1, 2]) != TYPE([1, 3]))
|
|
511
|
+
|
|
512
|
+
def test_not_equal_different_lengths(self: Self, /) -> None:
|
|
513
|
+
self.assertTrue(TYPE([1]) != TYPE([1, 2]))
|
|
514
|
+
|
|
515
|
+
def test_equal_values_are_not_unequal(self: Self, /) -> None:
|
|
516
|
+
self.assertFalse(TYPE([1, 2]) != TYPE([1, 2]))
|
|
517
|
+
|
|
518
|
+
def test_empty_values_are_not_unequal(self: Self, /) -> None:
|
|
519
|
+
self.assertFalse(TYPE([]) != TYPE([]))
|
|
520
|
+
|
|
521
|
+
class TestOperatorRMul(unittest.TestCase):
|
|
522
|
+
def test_rmul_by_positive_integer(self: Self, /) -> None:
|
|
523
|
+
result = 3 * TYPE([1, 2])
|
|
524
|
+
self.assertEqual(tuple(result), (1, 2, 1, 2, 1, 2))
|
|
525
|
+
|
|
526
|
+
def test_rmul_by_one(self: Self, /) -> None:
|
|
527
|
+
result = 1 * TYPE([1, 2])
|
|
528
|
+
self.assertEqual(tuple(result), (1, 2))
|
|
529
|
+
|
|
530
|
+
def test_rmul_by_zero(self: Self, /) -> None:
|
|
531
|
+
result = 0 * TYPE([1, 2])
|
|
532
|
+
self.assertEqual(tuple(result), ())
|
|
533
|
+
|
|
534
|
+
def test_rmul_by_negative_integer(self: Self, /) -> None:
|
|
535
|
+
result = -3 * TYPE([1, 2])
|
|
536
|
+
self.assertEqual(tuple(result), ())
|
|
537
|
+
|
|
538
|
+
class TestOperatorReversedSequence(unittest.TestCase):
|
|
539
|
+
def test_shrinking_makes_next_index_out_of_range(
|
|
540
|
+
self: Self, /
|
|
541
|
+
) -> None:
|
|
542
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
543
|
+
iterator = reversed(values)
|
|
544
|
+
|
|
545
|
+
self.assertEqual(next(iterator), 4)
|
|
546
|
+
del values[1:]
|
|
547
|
+
|
|
548
|
+
with self.assertRaises(StopIteration):
|
|
549
|
+
next(iterator)
|
|
550
|
+
|
|
551
|
+
def test_exhaustion_remains_after_regrowth(self: Self, /) -> None:
|
|
552
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
553
|
+
iterator = reversed(values)
|
|
554
|
+
|
|
555
|
+
self.assertEqual(next(iterator), 4)
|
|
556
|
+
del values[1:]
|
|
557
|
+
|
|
558
|
+
with self.assertRaises(StopIteration):
|
|
559
|
+
next(iterator)
|
|
560
|
+
|
|
561
|
+
values.extend([10, 11, 12, 13])
|
|
562
|
+
|
|
563
|
+
with self.assertRaises(StopIteration):
|
|
564
|
+
next(iterator)
|
|
565
|
+
|
|
566
|
+
def test_regrowth_before_next_restores_valid_index(
|
|
567
|
+
self: Self, /
|
|
568
|
+
) -> None:
|
|
569
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
570
|
+
iterator = reversed(values)
|
|
571
|
+
|
|
572
|
+
self.assertEqual(next(iterator), 4)
|
|
573
|
+
del values[1:]
|
|
574
|
+
values.extend([10, 11, 12, 13])
|
|
575
|
+
|
|
576
|
+
self.assertEqual(next(iterator), 12)
|
|
577
|
+
|
|
578
|
+
def test_deletion_before_cursor_does_not_repair_index(
|
|
579
|
+
self: Self, /
|
|
580
|
+
) -> None:
|
|
581
|
+
values = TYPE([0, 1, 2, 3, 4])
|
|
582
|
+
iterator = reversed(values)
|
|
583
|
+
|
|
584
|
+
self.assertEqual(next(iterator), 4)
|
|
585
|
+
del values[0]
|
|
586
|
+
|
|
587
|
+
self.assertEqual(next(iterator), 4)
|
|
588
|
+
|
|
589
|
+
def test_growth_beyond_initial_reverse_range_is_not_seen(
|
|
590
|
+
self: Self, /
|
|
591
|
+
) -> None:
|
|
592
|
+
values = TYPE([0, 1, 2])
|
|
593
|
+
iterator = reversed(values)
|
|
594
|
+
|
|
595
|
+
values.append(3)
|
|
596
|
+
|
|
597
|
+
self.assertEqual(tuple(iterator), (2, 1, 0))
|
|
598
|
+
|
|
599
|
+
class TestOperatorSetItem(unittest.TestCase):
|
|
600
|
+
def test_set_first_item(self: Self, /) -> None:
|
|
601
|
+
value = TYPE([1, 2, 3])
|
|
602
|
+
value[0] = 10
|
|
603
|
+
self.assertEqual(tuple(value), (10, 2, 3))
|
|
604
|
+
|
|
605
|
+
def test_set_last_item_with_negative_index(self: Self, /) -> None:
|
|
606
|
+
value = TYPE([1, 2, 3])
|
|
607
|
+
value[-1] = 10
|
|
608
|
+
self.assertEqual(tuple(value), (1, 2, 10))
|
|
609
|
+
|
|
610
|
+
def test_set_slice_same_length(self: Self, /) -> None:
|
|
611
|
+
value = TYPE([1, 2, 3, 4])
|
|
612
|
+
value[1:3] = [20, 30]
|
|
613
|
+
self.assertEqual(tuple(value), (1, 20, 30, 4))
|
|
614
|
+
|
|
615
|
+
def test_set_slice_different_length(self: Self, /) -> None:
|
|
616
|
+
value = TYPE([1, 2, 3])
|
|
617
|
+
value[1:2] = [10, 20, 30]
|
|
618
|
+
self.assertEqual(tuple(value), (1, 10, 20, 30, 3))
|
|
619
|
+
|
|
620
|
+
return {x: locals()[x] for x in set(locals()) - {"TYPE"}}
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
###
|
|
624
|
+
|
|
625
|
+
init()
|
|
626
|
+
|
|
627
|
+
if __name__ == "__main__":
|
|
628
|
+
unittest.main()
|
|
@@ -1,658 +0,0 @@
|
|
|
1
|
-
import unittest
|
|
2
|
-
from typing import Self
|
|
3
|
-
|
|
4
|
-
from datahold import MutableListSlot
|
|
5
|
-
|
|
6
|
-
__all__: list[str] = [
|
|
7
|
-
"TestMethodAppend",
|
|
8
|
-
"TestMethodClear",
|
|
9
|
-
"TestMethodCopy",
|
|
10
|
-
"TestMethodCount",
|
|
11
|
-
"TestMethodExtend",
|
|
12
|
-
"TestMethodIndex",
|
|
13
|
-
"TestMethodInsert",
|
|
14
|
-
"TestMethodPop",
|
|
15
|
-
"TestMethodRemove",
|
|
16
|
-
"TestMethodReverse",
|
|
17
|
-
"TestMethodSort",
|
|
18
|
-
"TestOperatorAdd",
|
|
19
|
-
"TestOperatorContains",
|
|
20
|
-
"TestOperatorDelItem",
|
|
21
|
-
"TestOperatorEqual",
|
|
22
|
-
"TestOperatorGetItem",
|
|
23
|
-
"TestOperatorGreaterThan",
|
|
24
|
-
"TestOperatorGreaterThanOrEqual",
|
|
25
|
-
"TestOperatorIAdd",
|
|
26
|
-
"TestOperatorIMul",
|
|
27
|
-
"TestOperatorIterSequence",
|
|
28
|
-
"TestOperatorLessThan",
|
|
29
|
-
"TestOperatorLessThanOrEqual",
|
|
30
|
-
"TestOperatorMul",
|
|
31
|
-
"TestOperatorNotEqual",
|
|
32
|
-
"TestOperatorRMul",
|
|
33
|
-
"TestOperatorReversedSequence",
|
|
34
|
-
"TestOperatorSetItem",
|
|
35
|
-
]
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class TestMethodAppend(unittest.TestCase):
|
|
39
|
-
def test_append_to_empty(self: Self, /) -> None:
|
|
40
|
-
value: MutableListSlot[int]
|
|
41
|
-
value = MutableListSlot()
|
|
42
|
-
value.append(1)
|
|
43
|
-
self.assertEqual(list(value), [1])
|
|
44
|
-
|
|
45
|
-
def test_append_to_nonempty(self: Self, /) -> None:
|
|
46
|
-
value = MutableListSlot([1, 2])
|
|
47
|
-
value.append(3)
|
|
48
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
49
|
-
|
|
50
|
-
def test_append_object(self: Self, /) -> None:
|
|
51
|
-
value: MutableListSlot[dict[str, int]]
|
|
52
|
-
obj = {"a": 1}
|
|
53
|
-
value = MutableListSlot()
|
|
54
|
-
value.append(obj)
|
|
55
|
-
self.assertIs(value[0], obj)
|
|
56
|
-
|
|
57
|
-
def test_append_returns_none(self: Self, /) -> None:
|
|
58
|
-
value: MutableListSlot[int]
|
|
59
|
-
value = MutableListSlot()
|
|
60
|
-
self.assertIsNone(value.append(1)) # type: ignore[func-returns-value]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class TestMethodClear(unittest.TestCase):
|
|
64
|
-
def test_clear_nonempty(self: Self, /) -> None:
|
|
65
|
-
value = MutableListSlot([1, 2, 3])
|
|
66
|
-
value.clear()
|
|
67
|
-
self.assertEqual(list(value), [])
|
|
68
|
-
|
|
69
|
-
def test_clear_empty(self: Self, /) -> None:
|
|
70
|
-
value: MutableListSlot[object]
|
|
71
|
-
value = MutableListSlot()
|
|
72
|
-
value.clear()
|
|
73
|
-
self.assertEqual(list(value), [])
|
|
74
|
-
|
|
75
|
-
def test_clear_mixed_values(self: Self, /) -> None:
|
|
76
|
-
value: MutableListSlot[object]
|
|
77
|
-
value = MutableListSlot([1, "a", None, []])
|
|
78
|
-
value.clear()
|
|
79
|
-
self.assertEqual(list(value), [])
|
|
80
|
-
|
|
81
|
-
def test_clear_returns_none(self: Self, /) -> None:
|
|
82
|
-
value = MutableListSlot([1])
|
|
83
|
-
self.assertIsNone(value.clear()) # type: ignore[func-returns-value]
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
class TestMethodCopy(unittest.TestCase):
|
|
87
|
-
def test_copy_has_same_contents(self: Self, /) -> None:
|
|
88
|
-
value = MutableListSlot([1, 2, 3])
|
|
89
|
-
copied = value.copy()
|
|
90
|
-
self.assertEqual(copied, value)
|
|
91
|
-
|
|
92
|
-
def test_copy_is_distinct_object(self: Self, /) -> None:
|
|
93
|
-
value = MutableListSlot([1, 2, 3])
|
|
94
|
-
copied = value.copy()
|
|
95
|
-
self.assertIsNot(copied, value)
|
|
96
|
-
|
|
97
|
-
def test_copy_is_shallow(self: Self, /) -> None:
|
|
98
|
-
nested: list[object]
|
|
99
|
-
nested = []
|
|
100
|
-
value = MutableListSlot([nested])
|
|
101
|
-
copied = value.copy()
|
|
102
|
-
self.assertIs(copied[0], nested)
|
|
103
|
-
|
|
104
|
-
def test_copy_empty(self: Self, /) -> None:
|
|
105
|
-
value: MutableListSlot[object]
|
|
106
|
-
value = MutableListSlot()
|
|
107
|
-
copied = value.copy()
|
|
108
|
-
self.assertEqual(list(copied), [])
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
class TestMethodCount(unittest.TestCase):
|
|
112
|
-
def test_count_existing_once(self: Self, /) -> None:
|
|
113
|
-
value = MutableListSlot([1, 2, 3])
|
|
114
|
-
self.assertEqual(value.count(2), 1)
|
|
115
|
-
|
|
116
|
-
def test_count_existing_multiple_times(self: Self, /) -> None:
|
|
117
|
-
value = MutableListSlot([1, 2, 1, 1])
|
|
118
|
-
self.assertEqual(value.count(1), 3)
|
|
119
|
-
|
|
120
|
-
def test_count_missing(self: Self, /) -> None:
|
|
121
|
-
value = MutableListSlot([1, 2, 3])
|
|
122
|
-
self.assertEqual(value.count(4), 0)
|
|
123
|
-
|
|
124
|
-
def test_count_empty(self: Self, /) -> None:
|
|
125
|
-
value: MutableListSlot[int] = MutableListSlot()
|
|
126
|
-
self.assertEqual(value.count(1), 0)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
class TestMethodExtend(unittest.TestCase):
|
|
130
|
-
def test_extend_with_list(self: Self, /) -> None:
|
|
131
|
-
value = MutableListSlot([1])
|
|
132
|
-
value.extend([2, 3])
|
|
133
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
134
|
-
|
|
135
|
-
def test_extend_empty(self: Self, /) -> None:
|
|
136
|
-
value = MutableListSlot([1])
|
|
137
|
-
value.extend([])
|
|
138
|
-
self.assertEqual(list(value), [1])
|
|
139
|
-
|
|
140
|
-
def test_extend_with_tuple(self: Self, /) -> None:
|
|
141
|
-
value = MutableListSlot([1])
|
|
142
|
-
value.extend((2, 3))
|
|
143
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
144
|
-
|
|
145
|
-
def test_extend_returns_none(self: Self, /) -> None:
|
|
146
|
-
value: MutableListSlot[int] = MutableListSlot()
|
|
147
|
-
self.assertIsNone(value.extend([1, 2])) # type: ignore[func-returns-value]
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
class TestMethodIndex(unittest.TestCase):
|
|
151
|
-
def test_index_existing(self: Self, /) -> None:
|
|
152
|
-
value = MutableListSlot(["a", "b", "c"])
|
|
153
|
-
self.assertEqual(value.index("b"), 1)
|
|
154
|
-
|
|
155
|
-
def test_index_returns_first_match(self: Self, /) -> None:
|
|
156
|
-
value = MutableListSlot([1, 2, 1])
|
|
157
|
-
self.assertEqual(value.index(1), 0)
|
|
158
|
-
|
|
159
|
-
def test_index_with_start(self: Self, /) -> None:
|
|
160
|
-
value = MutableListSlot([1, 2, 1])
|
|
161
|
-
self.assertEqual(value.index(1, 1), 2)
|
|
162
|
-
|
|
163
|
-
def test_index_missing_raises_value_error(self: Self, /) -> None:
|
|
164
|
-
value = MutableListSlot([1, 2, 3])
|
|
165
|
-
with self.assertRaises(ValueError):
|
|
166
|
-
value.index(4)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
class TestMethodInsert(unittest.TestCase):
|
|
170
|
-
def test_insert_at_start(self: Self, /) -> None:
|
|
171
|
-
value = MutableListSlot([2, 3])
|
|
172
|
-
value.insert(0, 1)
|
|
173
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
174
|
-
|
|
175
|
-
def test_insert_in_middle(self: Self, /) -> None:
|
|
176
|
-
value = MutableListSlot([1, 3])
|
|
177
|
-
value.insert(1, 2)
|
|
178
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
179
|
-
|
|
180
|
-
def test_insert_past_end(self: Self, /) -> None:
|
|
181
|
-
value = MutableListSlot([1, 2])
|
|
182
|
-
value.insert(100, 3)
|
|
183
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
184
|
-
|
|
185
|
-
def test_insert_returns_none(self: Self, /) -> None:
|
|
186
|
-
value: MutableListSlot[int]
|
|
187
|
-
value = MutableListSlot()
|
|
188
|
-
self.assertIsNone(value.insert(0, 1)) # type: ignore[func-returns-value]
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
class TestMethodPop(unittest.TestCase):
|
|
192
|
-
def test_pop_last(self: Self, /) -> None:
|
|
193
|
-
value = MutableListSlot([1, 2, 3])
|
|
194
|
-
result = value.pop()
|
|
195
|
-
self.assertEqual(result, 3)
|
|
196
|
-
self.assertEqual(list(value), [1, 2])
|
|
197
|
-
|
|
198
|
-
def test_pop_first(self: Self, /) -> None:
|
|
199
|
-
value = MutableListSlot([1, 2, 3])
|
|
200
|
-
result = value.pop(0)
|
|
201
|
-
self.assertEqual(result, 1)
|
|
202
|
-
self.assertEqual(list(value), [2, 3])
|
|
203
|
-
|
|
204
|
-
def test_pop_negative_index(self: Self, /) -> None:
|
|
205
|
-
value = MutableListSlot([1, 2, 3])
|
|
206
|
-
result = value.pop(-2)
|
|
207
|
-
self.assertEqual(result, 2)
|
|
208
|
-
self.assertEqual(list(value), [1, 3])
|
|
209
|
-
|
|
210
|
-
def test_pop_empty_raises_index_error(self: Self, /) -> None:
|
|
211
|
-
value: MutableListSlot[object] = MutableListSlot()
|
|
212
|
-
with self.assertRaises(IndexError):
|
|
213
|
-
value.pop()
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
class TestMethodRemove(unittest.TestCase):
|
|
217
|
-
def test_remove_existing(self: Self, /) -> None:
|
|
218
|
-
value = MutableListSlot([1, 2, 3])
|
|
219
|
-
value.remove(2)
|
|
220
|
-
self.assertEqual(list(value), [1, 3])
|
|
221
|
-
|
|
222
|
-
def test_remove_only_first_match(self: Self, /) -> None:
|
|
223
|
-
value = MutableListSlot([1, 2, 1])
|
|
224
|
-
value.remove(1)
|
|
225
|
-
self.assertEqual(list(value), [2, 1])
|
|
226
|
-
|
|
227
|
-
def test_remove_missing_raises_value_error(self: Self, /) -> None:
|
|
228
|
-
value = MutableListSlot([1, 2, 3])
|
|
229
|
-
with self.assertRaises(ValueError):
|
|
230
|
-
value.remove(4)
|
|
231
|
-
|
|
232
|
-
def test_remove_returns_none(self: Self, /) -> None:
|
|
233
|
-
value = MutableListSlot([1])
|
|
234
|
-
self.assertIsNone(value.remove(1)) # type: ignore[func-returns-value]
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
class TestMethodReverse(unittest.TestCase):
|
|
238
|
-
def test_reverse_multiple_items(self: Self, /) -> None:
|
|
239
|
-
value = MutableListSlot([1, 2, 3])
|
|
240
|
-
value.reverse()
|
|
241
|
-
self.assertEqual(list(value), [3, 2, 1])
|
|
242
|
-
|
|
243
|
-
def test_reverse_single_item(self: Self, /) -> None:
|
|
244
|
-
value = MutableListSlot([1])
|
|
245
|
-
value.reverse()
|
|
246
|
-
self.assertEqual(list(value), [1])
|
|
247
|
-
|
|
248
|
-
def test_reverse_empty(self: Self, /) -> None:
|
|
249
|
-
value: MutableListSlot[object] = MutableListSlot()
|
|
250
|
-
value.reverse()
|
|
251
|
-
self.assertEqual(list(value), [])
|
|
252
|
-
|
|
253
|
-
def test_reverse_returns_none(self: Self, /) -> None:
|
|
254
|
-
value = MutableListSlot([1, 2])
|
|
255
|
-
self.assertIsNone(value.reverse()) # type: ignore[func-returns-value]
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
class TestMethodSort(unittest.TestCase):
|
|
259
|
-
def test_sort_ascending(self: Self, /) -> None:
|
|
260
|
-
value = MutableListSlot([3, 1, 2])
|
|
261
|
-
value.sort()
|
|
262
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
263
|
-
|
|
264
|
-
def test_sort_reverse(self: Self, /) -> None:
|
|
265
|
-
value = MutableListSlot([1, 3, 2])
|
|
266
|
-
value.sort(reverse=True)
|
|
267
|
-
self.assertEqual(list(value), [3, 2, 1])
|
|
268
|
-
|
|
269
|
-
def test_sort_with_key(self: Self, /) -> None:
|
|
270
|
-
value = MutableListSlot(["bbb", "a", "cc"])
|
|
271
|
-
value.sort(key=len)
|
|
272
|
-
self.assertEqual(list(value), ["a", "cc", "bbb"])
|
|
273
|
-
|
|
274
|
-
def test_sort_returns_none(self: Self, /) -> None:
|
|
275
|
-
value = MutableListSlot([2, 1])
|
|
276
|
-
self.assertIsNone(value.sort())
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
class TestOperatorAdd(unittest.TestCase):
|
|
280
|
-
def test_add_two_nonempty_lists(self: Self, /) -> None:
|
|
281
|
-
result = MutableListSlot([1, 2]) + MutableListSlot([3, 4])
|
|
282
|
-
self.assertEqual(list(result), [1, 2, 3, 4])
|
|
283
|
-
|
|
284
|
-
def test_add_empty_list(self: Self, /) -> None:
|
|
285
|
-
result = MutableListSlot([1, 2]) + MutableListSlot([])
|
|
286
|
-
self.assertEqual(list(result), [1, 2])
|
|
287
|
-
|
|
288
|
-
def test_add_to_empty_slot(self: Self, /) -> None:
|
|
289
|
-
result = MutableListSlot([]) + MutableListSlot([1, 2])
|
|
290
|
-
self.assertEqual(list(result), [1, 2])
|
|
291
|
-
|
|
292
|
-
def test_add_does_not_modify_original(self: Self, /) -> None:
|
|
293
|
-
value = MutableListSlot([1, 2])
|
|
294
|
-
value + MutableListSlot([3])
|
|
295
|
-
self.assertEqual(list(value), [1, 2])
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
class TestOperatorContains(unittest.TestCase):
|
|
299
|
-
def test_contains_first_element(self: Self, /) -> None:
|
|
300
|
-
self.assertTrue(1 in MutableListSlot([1, 2, 3]))
|
|
301
|
-
|
|
302
|
-
def test_contains_last_element(self: Self, /) -> None:
|
|
303
|
-
self.assertTrue(3 in MutableListSlot([1, 2, 3]))
|
|
304
|
-
|
|
305
|
-
def test_does_not_contain_missing_element(self: Self, /) -> None:
|
|
306
|
-
self.assertFalse(4 in MutableListSlot([1, 2, 3]))
|
|
307
|
-
|
|
308
|
-
def test_empty_slot_contains_nothing(self: Self, /) -> None:
|
|
309
|
-
self.assertFalse(1 in MutableListSlot([]))
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
class TestOperatorDelItem(unittest.TestCase):
|
|
313
|
-
def test_delete_first_item(self: Self, /) -> None:
|
|
314
|
-
value = MutableListSlot([1, 2, 3])
|
|
315
|
-
del value[0]
|
|
316
|
-
self.assertEqual(list(value), [2, 3])
|
|
317
|
-
|
|
318
|
-
def test_delete_last_item(self: Self, /) -> None:
|
|
319
|
-
value = MutableListSlot([1, 2, 3])
|
|
320
|
-
del value[-1]
|
|
321
|
-
self.assertEqual(list(value), [1, 2])
|
|
322
|
-
|
|
323
|
-
def test_delete_slice(self: Self, /) -> None:
|
|
324
|
-
value = MutableListSlot([1, 2, 3, 4])
|
|
325
|
-
del value[1:3]
|
|
326
|
-
self.assertEqual(list(value), [1, 4])
|
|
327
|
-
|
|
328
|
-
def test_delete_out_of_range_raises(self: Self, /) -> None:
|
|
329
|
-
value = MutableListSlot([1, 2])
|
|
330
|
-
with self.assertRaises(IndexError):
|
|
331
|
-
del value[5]
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
class TestOperatorEqual(unittest.TestCase):
|
|
335
|
-
def test_equal_same_contents(self: Self, /) -> None:
|
|
336
|
-
self.assertTrue(MutableListSlot([1, 2]) == MutableListSlot([1, 2]))
|
|
337
|
-
|
|
338
|
-
def test_equal_empty_lists(self: Self, /) -> None:
|
|
339
|
-
self.assertTrue(MutableListSlot([]) == MutableListSlot([]))
|
|
340
|
-
|
|
341
|
-
def test_not_equal_different_values(self: Self, /) -> None:
|
|
342
|
-
self.assertFalse(MutableListSlot([1, 2]) == MutableListSlot([1, 3]))
|
|
343
|
-
|
|
344
|
-
def test_not_equal_different_lengths(self: Self, /) -> None:
|
|
345
|
-
self.assertFalse(MutableListSlot([1, 2]) == MutableListSlot([1, 2, 3]))
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
class TestOperatorGetItem(unittest.TestCase):
|
|
349
|
-
def test_get_first_item(self: Self, /) -> None:
|
|
350
|
-
value = MutableListSlot([10, 20, 30])
|
|
351
|
-
self.assertEqual(value[0], 10)
|
|
352
|
-
|
|
353
|
-
def test_get_last_item_with_negative_index(self: Self, /) -> None:
|
|
354
|
-
value = MutableListSlot([10, 20, 30])
|
|
355
|
-
self.assertEqual(value[-1], 30)
|
|
356
|
-
|
|
357
|
-
def test_get_slice(self: Self, /) -> None:
|
|
358
|
-
value = MutableListSlot([1, 2, 3, 4])
|
|
359
|
-
self.assertEqual(value[1:3], MutableListSlot([2, 3]))
|
|
360
|
-
|
|
361
|
-
def test_out_of_range_index_raises(self: Self, /) -> None:
|
|
362
|
-
value = MutableListSlot([1, 2])
|
|
363
|
-
with self.assertRaises(IndexError):
|
|
364
|
-
value[5]
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
class TestOperatorGreaterThan(unittest.TestCase):
|
|
368
|
-
def test_greater_than_by_first_element(self: Self, /) -> None:
|
|
369
|
-
self.assertTrue(MutableListSlot([2, 0]) > MutableListSlot([1, 9]))
|
|
370
|
-
|
|
371
|
-
def test_greater_than_by_later_element(self: Self, /) -> None:
|
|
372
|
-
self.assertTrue(MutableListSlot([1, 3]) > MutableListSlot([1, 2]))
|
|
373
|
-
|
|
374
|
-
def test_longer_list_is_greater_than_prefix(self: Self, /) -> None:
|
|
375
|
-
self.assertTrue(MutableListSlot([1, 2, 3]) > MutableListSlot([1, 2]))
|
|
376
|
-
|
|
377
|
-
def test_equal_list_is_not_greater_than(self: Self, /) -> None:
|
|
378
|
-
self.assertFalse(MutableListSlot([1, 2]) > MutableListSlot([1, 2]))
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
class TestOperatorGreaterThanOrEqual(unittest.TestCase):
|
|
382
|
-
def test_greater_value_is_greater_or_equal(self: Self, /) -> None:
|
|
383
|
-
self.assertTrue(MutableListSlot([2]) >= MutableListSlot([1]))
|
|
384
|
-
|
|
385
|
-
def test_equal_value_is_greater_or_equal(self: Self, /) -> None:
|
|
386
|
-
self.assertTrue(MutableListSlot([1, 2]) >= MutableListSlot([1, 2]))
|
|
387
|
-
|
|
388
|
-
def test_longer_list_is_greater_or_equal_to_prefix(self: Self, /) -> None:
|
|
389
|
-
self.assertTrue(MutableListSlot([1, 2]) >= MutableListSlot([1]))
|
|
390
|
-
|
|
391
|
-
def test_smaller_value_is_not_greater_or_equal(self: Self, /) -> None:
|
|
392
|
-
self.assertFalse(MutableListSlot([1]) >= MutableListSlot([2]))
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
class TestOperatorIAdd(unittest.TestCase):
|
|
396
|
-
def test_iadd_nonempty_list(self: Self, /) -> None:
|
|
397
|
-
value = MutableListSlot([1, 2])
|
|
398
|
-
value += [3, 4]
|
|
399
|
-
self.assertEqual(list(value), [1, 2, 3, 4])
|
|
400
|
-
|
|
401
|
-
def test_iadd_empty_list(self: Self, /) -> None:
|
|
402
|
-
value = MutableListSlot([1, 2])
|
|
403
|
-
value += "" # type: ignore[arg-type]
|
|
404
|
-
self.assertEqual(list(value), [1, 2])
|
|
405
|
-
|
|
406
|
-
def test_iadd_to_empty_slot(self: Self, /) -> None:
|
|
407
|
-
value: MutableListSlot[int] = MutableListSlot([])
|
|
408
|
-
value += (1, 2)
|
|
409
|
-
self.assertEqual(list(value), [1, 2])
|
|
410
|
-
|
|
411
|
-
def test_iadd_multiple_times(self: Self, /) -> None:
|
|
412
|
-
value = MutableListSlot([1])
|
|
413
|
-
value += [2]
|
|
414
|
-
value += [3]
|
|
415
|
-
self.assertEqual(list(value), [1, 2, 3])
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
class TestOperatorLessThan(unittest.TestCase):
|
|
419
|
-
def test_less_than_by_first_element(self: Self, /) -> None:
|
|
420
|
-
self.assertTrue(MutableListSlot([1, 9]) < MutableListSlot([2, 0]))
|
|
421
|
-
|
|
422
|
-
def test_less_than_by_later_element(self: Self, /) -> None:
|
|
423
|
-
self.assertTrue(MutableListSlot([1, 2]) < MutableListSlot([1, 3]))
|
|
424
|
-
|
|
425
|
-
def test_prefix_is_less_than_longer_list(self: Self, /) -> None:
|
|
426
|
-
self.assertTrue(MutableListSlot([1, 2]) < MutableListSlot([1, 2, 3]))
|
|
427
|
-
|
|
428
|
-
def test_equal_list_is_not_less_than(self: Self, /) -> None:
|
|
429
|
-
self.assertFalse(MutableListSlot([1, 2]) < MutableListSlot([1, 2]))
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
class TestOperatorLessThanOrEqual(unittest.TestCase):
|
|
433
|
-
def test_less_value_is_less_or_equal(self: Self, /) -> None:
|
|
434
|
-
self.assertTrue(MutableListSlot([1]) <= MutableListSlot([2]))
|
|
435
|
-
|
|
436
|
-
def test_equal_value_is_less_or_equal(self: Self, /) -> None:
|
|
437
|
-
self.assertTrue(MutableListSlot([1, 2]) <= MutableListSlot([1, 2]))
|
|
438
|
-
|
|
439
|
-
def test_prefix_is_less_or_equal(self: Self, /) -> None:
|
|
440
|
-
self.assertTrue(MutableListSlot([1]) <= MutableListSlot([1, 2]))
|
|
441
|
-
|
|
442
|
-
def test_greater_value_is_not_less_or_equal(self: Self, /) -> None:
|
|
443
|
-
self.assertFalse(MutableListSlot([2]) <= MutableListSlot([1]))
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
class TestOperatorMul(unittest.TestCase):
|
|
447
|
-
def test_multiply_by_positive_integer(self: Self, /) -> None:
|
|
448
|
-
result = MutableListSlot([1, 2]) * 3
|
|
449
|
-
self.assertEqual(list(result), [1, 2, 1, 2, 1, 2])
|
|
450
|
-
|
|
451
|
-
def test_multiply_by_one(self: Self, /) -> None:
|
|
452
|
-
result = MutableListSlot([1, 2]) * 1
|
|
453
|
-
self.assertEqual(list(result), [1, 2])
|
|
454
|
-
|
|
455
|
-
def test_multiply_by_zero(self: Self, /) -> None:
|
|
456
|
-
result = MutableListSlot([1, 2]) * 0
|
|
457
|
-
self.assertEqual(list(result), [])
|
|
458
|
-
|
|
459
|
-
def test_multiply_by_negative_integer(self: Self, /) -> None:
|
|
460
|
-
result = MutableListSlot([1, 2]) * -2
|
|
461
|
-
self.assertEqual(list(result), [])
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
class TestOperatorIMul(unittest.TestCase):
|
|
465
|
-
def test_imul_by_positive_integer(self: Self, /) -> None:
|
|
466
|
-
value = MutableListSlot([1, 2])
|
|
467
|
-
value *= 2
|
|
468
|
-
self.assertEqual(list(value), [1, 2, 1, 2])
|
|
469
|
-
|
|
470
|
-
def test_imul_by_one(self: Self, /) -> None:
|
|
471
|
-
value = MutableListSlot([1, 2])
|
|
472
|
-
value *= 1
|
|
473
|
-
self.assertEqual(list(value), [1, 2])
|
|
474
|
-
|
|
475
|
-
def test_imul_by_zero(self: Self, /) -> None:
|
|
476
|
-
value = MutableListSlot([1, 2])
|
|
477
|
-
value *= 0
|
|
478
|
-
self.assertEqual(list(value), [])
|
|
479
|
-
|
|
480
|
-
def test_imul_by_negative_integer(self: Self, /) -> None:
|
|
481
|
-
value = MutableListSlot([1, 2])
|
|
482
|
-
value *= -1
|
|
483
|
-
self.assertEqual(list(value), [])
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
class TestOperatorIterSequence(unittest.TestCase):
|
|
487
|
-
def test_shrinking_makes_next_index_out_of_range(self: Self, /) -> None:
|
|
488
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
489
|
-
iterator = iter(values)
|
|
490
|
-
|
|
491
|
-
self.assertEqual(next(iterator), 0)
|
|
492
|
-
del values[1:]
|
|
493
|
-
|
|
494
|
-
with self.assertRaises(StopIteration):
|
|
495
|
-
next(iterator)
|
|
496
|
-
|
|
497
|
-
def test_exhaustion_remains_after_regrowth(self: Self, /) -> None:
|
|
498
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
499
|
-
iterator = iter(values)
|
|
500
|
-
|
|
501
|
-
self.assertEqual(next(iterator), 0)
|
|
502
|
-
del values[1:]
|
|
503
|
-
|
|
504
|
-
with self.assertRaises(StopIteration):
|
|
505
|
-
next(iterator)
|
|
506
|
-
|
|
507
|
-
values.extend([10, 11, 12, 13])
|
|
508
|
-
|
|
509
|
-
with self.assertRaises(StopIteration):
|
|
510
|
-
next(iterator)
|
|
511
|
-
|
|
512
|
-
def test_regrowth_before_next_restores_valid_index(self: Self, /) -> None:
|
|
513
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
514
|
-
iterator = iter(values)
|
|
515
|
-
|
|
516
|
-
self.assertEqual(next(iterator), 0)
|
|
517
|
-
del values[1:]
|
|
518
|
-
values.extend([10, 11, 12])
|
|
519
|
-
|
|
520
|
-
self.assertEqual(next(iterator), 10)
|
|
521
|
-
|
|
522
|
-
def test_deletion_before_cursor_does_not_repair_index(
|
|
523
|
-
self: Self, /
|
|
524
|
-
) -> None:
|
|
525
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
526
|
-
iterator = iter(values)
|
|
527
|
-
|
|
528
|
-
self.assertEqual(next(iterator), 0)
|
|
529
|
-
del values[0]
|
|
530
|
-
|
|
531
|
-
self.assertEqual(next(iterator), 2)
|
|
532
|
-
|
|
533
|
-
def test_growth_before_exhaustion_is_seen(self: Self, /) -> None:
|
|
534
|
-
values = MutableListSlot([0, 1])
|
|
535
|
-
iterator = iter(values)
|
|
536
|
-
|
|
537
|
-
self.assertEqual(next(iterator), 0)
|
|
538
|
-
self.assertEqual(next(iterator), 1)
|
|
539
|
-
|
|
540
|
-
values.append(2)
|
|
541
|
-
|
|
542
|
-
self.assertEqual(next(iterator), 2)
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
class TestOperatorNotEqual(unittest.TestCase):
|
|
546
|
-
def test_not_equal_different_contents(self: Self, /) -> None:
|
|
547
|
-
self.assertTrue(MutableListSlot([1, 2]) != MutableListSlot([1, 3]))
|
|
548
|
-
|
|
549
|
-
def test_not_equal_different_lengths(self: Self, /) -> None:
|
|
550
|
-
self.assertTrue(MutableListSlot([1]) != MutableListSlot([1, 2]))
|
|
551
|
-
|
|
552
|
-
def test_equal_values_are_not_unequal(self: Self, /) -> None:
|
|
553
|
-
self.assertFalse(MutableListSlot([1, 2]) != MutableListSlot([1, 2]))
|
|
554
|
-
|
|
555
|
-
def test_empty_values_are_not_unequal(self: Self, /) -> None:
|
|
556
|
-
self.assertFalse(MutableListSlot([]) != MutableListSlot([]))
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
class TestOperatorRMul(unittest.TestCase):
|
|
560
|
-
def test_rmul_by_positive_integer(self: Self, /) -> None:
|
|
561
|
-
result = 3 * MutableListSlot([1, 2])
|
|
562
|
-
self.assertEqual(list(result), [1, 2, 1, 2, 1, 2])
|
|
563
|
-
|
|
564
|
-
def test_rmul_by_one(self: Self, /) -> None:
|
|
565
|
-
result = 1 * MutableListSlot([1, 2])
|
|
566
|
-
self.assertEqual(list(result), [1, 2])
|
|
567
|
-
|
|
568
|
-
def test_rmul_by_zero(self: Self, /) -> None:
|
|
569
|
-
result = 0 * MutableListSlot([1, 2])
|
|
570
|
-
self.assertEqual(list(result), [])
|
|
571
|
-
|
|
572
|
-
def test_rmul_by_negative_integer(self: Self, /) -> None:
|
|
573
|
-
result = -3 * MutableListSlot([1, 2])
|
|
574
|
-
self.assertEqual(list(result), [])
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
class TestOperatorReversedSequence(unittest.TestCase):
|
|
578
|
-
def test_shrinking_makes_next_index_out_of_range(self: Self, /) -> None:
|
|
579
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
580
|
-
iterator = reversed(values)
|
|
581
|
-
|
|
582
|
-
self.assertEqual(next(iterator), 4)
|
|
583
|
-
del values[1:]
|
|
584
|
-
|
|
585
|
-
with self.assertRaises(StopIteration):
|
|
586
|
-
next(iterator)
|
|
587
|
-
|
|
588
|
-
def test_exhaustion_remains_after_regrowth(self: Self, /) -> None:
|
|
589
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
590
|
-
iterator = reversed(values)
|
|
591
|
-
|
|
592
|
-
self.assertEqual(next(iterator), 4)
|
|
593
|
-
del values[1:]
|
|
594
|
-
|
|
595
|
-
with self.assertRaises(StopIteration):
|
|
596
|
-
next(iterator)
|
|
597
|
-
|
|
598
|
-
values.extend([10, 11, 12, 13])
|
|
599
|
-
|
|
600
|
-
with self.assertRaises(StopIteration):
|
|
601
|
-
next(iterator)
|
|
602
|
-
|
|
603
|
-
def test_regrowth_before_next_restores_valid_index(self: Self, /) -> None:
|
|
604
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
605
|
-
iterator = reversed(values)
|
|
606
|
-
|
|
607
|
-
self.assertEqual(next(iterator), 4)
|
|
608
|
-
del values[1:]
|
|
609
|
-
values.extend([10, 11, 12, 13])
|
|
610
|
-
|
|
611
|
-
self.assertEqual(next(iterator), 12)
|
|
612
|
-
|
|
613
|
-
def test_deletion_before_cursor_does_not_repair_index(
|
|
614
|
-
self: Self, /
|
|
615
|
-
) -> None:
|
|
616
|
-
values = MutableListSlot([0, 1, 2, 3, 4])
|
|
617
|
-
iterator = reversed(values)
|
|
618
|
-
|
|
619
|
-
self.assertEqual(next(iterator), 4)
|
|
620
|
-
del values[0]
|
|
621
|
-
|
|
622
|
-
self.assertEqual(next(iterator), 4)
|
|
623
|
-
|
|
624
|
-
def test_growth_beyond_initial_reverse_range_is_not_seen(
|
|
625
|
-
self: Self, /
|
|
626
|
-
) -> None:
|
|
627
|
-
values = MutableListSlot([0, 1, 2])
|
|
628
|
-
iterator = reversed(values)
|
|
629
|
-
|
|
630
|
-
values.append(3)
|
|
631
|
-
|
|
632
|
-
self.assertEqual(list(iterator), [2, 1, 0])
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
class TestOperatorSetItem(unittest.TestCase):
|
|
636
|
-
def test_set_first_item(self: Self, /) -> None:
|
|
637
|
-
value = MutableListSlot([1, 2, 3])
|
|
638
|
-
value[0] = 10
|
|
639
|
-
self.assertEqual(list(value), [10, 2, 3])
|
|
640
|
-
|
|
641
|
-
def test_set_last_item_with_negative_index(self: Self, /) -> None:
|
|
642
|
-
value = MutableListSlot([1, 2, 3])
|
|
643
|
-
value[-1] = 10
|
|
644
|
-
self.assertEqual(list(value), [1, 2, 10])
|
|
645
|
-
|
|
646
|
-
def test_set_slice_same_length(self: Self, /) -> None:
|
|
647
|
-
value = MutableListSlot([1, 2, 3, 4])
|
|
648
|
-
value[1:3] = [20, 30]
|
|
649
|
-
self.assertEqual(list(value), [1, 20, 30, 4])
|
|
650
|
-
|
|
651
|
-
def test_set_slice_different_length(self: Self, /) -> None:
|
|
652
|
-
value = MutableListSlot([1, 2, 3])
|
|
653
|
-
value[1:2] = [10, 20, 30]
|
|
654
|
-
self.assertEqual(list(value), [1, 10, 20, 30, 3])
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
if __name__ == "__main__":
|
|
658
|
-
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|