hook tracker
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user