76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from hooked_containers.sequence import HookedList
|
|
|
|
|
|
def get_id(a: Any):
|
|
return str(hex(id(a)))
|
|
|
|
|
|
class TestHookedList:
|
|
class TestConstruction:
|
|
def test_empty(self):
|
|
lst = HookedList([])
|
|
assert list(lst) == []
|
|
|
|
def test_with_items(self):
|
|
lst = HookedList([1, 2, 3])
|
|
assert list(lst) == [1, 2, 3]
|
|
|
|
def test_recreation(self):
|
|
initial = [1, 2, 3]
|
|
initial_id = id(initial)
|
|
|
|
lst = HookedList(initial)
|
|
assert id(lst._data) == initial_id
|
|
|
|
lst2 = HookedList(lst)
|
|
assert id(lst2._data) == initial_id
|
|
|
|
class TestSeqOps:
|
|
def test_len(self):
|
|
lst = HookedList([1, 2, 3])
|
|
assert len(lst) == 3
|
|
|
|
def test_getitem(self):
|
|
lst = HookedList([1, 2, 3])
|
|
assert lst[0] == 1
|
|
assert lst[1] == 2
|
|
assert lst[-1] == 3
|
|
|
|
def test_contains(self):
|
|
lst = HookedList([1, 2, 3])
|
|
assert 2 in lst
|
|
assert 4 not in lst
|
|
|
|
def test_iter(self):
|
|
lst = HookedList([1, 2, 3])
|
|
for i, item in enumerate(lst, start=1):
|
|
assert item == i
|
|
|
|
class TestMutableOps:
|
|
def test_setitem(self):
|
|
added = []
|
|
lst = HookedList(
|
|
[1, 2, [4, 5, [6, 7]]],
|
|
lambda e: added.append(e.item),
|
|
)
|
|
lst[0] = 10
|
|
lst.append(20)
|
|
assert added == [10, 20]
|
|
|
|
lst[2][-1].append(8)
|
|
assert added == [10, 20, 8]
|
|
|
|
def test_delitem(self):
|
|
lst = HookedList([1, 2, 3])
|
|
del lst[1]
|
|
assert list(lst) == [1, 3]
|
|
|
|
def test_insert(self):
|
|
lst = HookedList([1, 3])
|
|
lst.insert(1, 2)
|
|
assert list(lst) == [1, 2, 3]
|