hook tracker

This commit is contained in:
John Lancaster
2026-02-22 18:32:37 -06:00
parent 406024d990
commit 977e87d7f5

View File

@@ -1,7 +1,25 @@
from dataclasses import dataclass, field
from hooked_containers import events as e
from hooked_containers.mapping import HookedMapping
@dataclass
class HookTracker:
added: list[e.AddItemEvent] = field(default_factory=list)
set: list[e.SetItemEvent] = field(default_factory=list)
removed: list[e.RemoveItemEvent] = field(default_factory=list)
def hook(self, event: e.ChangeEvent):
match event:
case e.AddItemEvent():
self.added.append(event.item)
case e.SetItemEvent():
self.set.append(event.item)
case e.RemoveItemEvent():
self.removed.append(event.item)
class TestHookedMapping:
class TestConstruction:
def test_empty(self):
@@ -25,34 +43,26 @@ class TestHookedMapping:
class TestMappingOps:
def test_setitem(self):
added = []
def hook(event: e.ChangeEvent):
assert isinstance(event, e.AddItemEvent)
added.append(event.item)
m = HookedMapping({}, hook)
tracker = HookTracker()
m = HookedMapping({}, tracker.hook)
m["a"] = 1
assert m._data == {"a": 1}
assert added == [1]
assert tracker.added == [1]
def test_nested_setitem(self):
added = []
def hook(event: e.ChangeEvent):
assert isinstance(event, e.AddItemEvent)
added.append(event.item)
m = HookedMapping({"a": {}}, hook)
tracker = HookTracker()
m = HookedMapping({"a": {}}, tracker.hook)
m["a"]["x"] = 1
assert m._data == {"a": {"x": 1}}
assert added == [1]
assert tracker.added == [1]
def test_getitem(self):
m = HookedMapping({"a": 1})
assert m["a"] == 1
def test_delitem(self):
m = HookedMapping({"a": 1})
tracker = HookTracker()
m = HookedMapping({"a": 1}, tracker.hook)
del m["a"]
assert not m["a"]
assert tracker.removed == [1]