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(existing=[]) assert list(lst) == [] def test_with_items(self): lst = HookedList(existing=[1, 2, 3]) assert list(lst) == [1, 2, 3] def test_recreation(self): initial = [1, 2, 3] initial_id = id(initial) lst = HookedList(existing=initial) assert id(lst._data) == initial_id lst2 = HookedList(existing=lst) assert id(lst2._data) == initial_id class TestSeqOps: def test_len(self): lst = HookedList(existing=[1, 2, 3]) assert len(lst) == 3 def test_getitem(self): lst = HookedList(existing=[1, 2, 3]) assert lst[0] == 1 assert lst[1] == 2 assert lst[-1] == 3 def test_contains(self): lst = HookedList(existing=[1, 2, 3]) assert 2 in lst assert 4 not in lst def test_iter(self): lst = HookedList(existing=[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(existing=[1, 2, 3]) del lst[1] assert list(lst) == [1, 3] def test_insert(self): lst = HookedList(existing=[1, 3]) lst.insert(1, 2) assert list(lst) == [1, 2, 3]