From eec1696e8f3b05e4f8a19c0bf21a9377fa0f601c Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 2 Jun 2023 11:23:33 +0200 Subject: [PATCH] fix predicate interference --- owrx/active/list/__init__.py | 12 +++++----- test/owrx/active/list/test_active_list.py | 28 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/owrx/active/list/__init__.py b/owrx/active/list/__init__.py index 3ee49d07..718ba78d 100644 --- a/owrx/active/list/__init__.py +++ b/owrx/active/list/__init__.py @@ -123,10 +123,10 @@ class ActiveListFilterListener(ActiveListListener): def onListChange(self, source: "ActiveList", changes: list[ActiveListChange]): for change in changes: if isinstance(change, ActiveListIndexAdded): + idx = len([x for x in self.keyMap if x < change.index]) + for i in range(idx, len(self.keyMap)): + self.keyMap[i] += 1 if self.filter.predicate(change.newValue): - idx = len([x for x in self.keyMap if x < change.index]) - for i in range(idx, len(self.keyMap)): - self.keyMap[i] += 1 self.keyMap.insert(idx, change.index) self.target.insert(idx, change.newValue) self.filter.monitor(change.newValue, partial(self._onMonitor, change.newValue)) @@ -146,12 +146,12 @@ class ActiveListFilterListener(ActiveListListener): self.filter.monitor(change.newValue, partial(self._onMonitor, change.newValue)) elif isinstance(change, ActiveListIndexDeleted): self.filter.unmonitor(change.oldValue) + idx = len([x for x in self.keyMap if x < change.index]) if change.index in self.keyMap: - idx = self.keyMap.index(change.index) del self.target[idx] del self.keyMap[idx] - for i in range(idx, len(self.keyMap)): - self.keyMap[i] -= 1 + for i in range(idx, len(self.keyMap)): + self.keyMap[i] -= 1 def _onMonitor(self, value): idx = self.source.index(value) diff --git a/test/owrx/active/list/test_active_list.py b/test/owrx/active/list/test_active_list.py index a0716bab..bcbf2787 100644 --- a/test/owrx/active/list/test_active_list.py +++ b/test/owrx/active/list/test_active_list.py @@ -305,3 +305,31 @@ class ActiveListTest(TestCase): del list[1] self.assertEqual(filteredList[2], 5) + + def testFilterDeletionWithFilteredIndices(self): + list = ActiveList([1, 2, 3, 4, 5]) + filteredList = list.filter(lambda x: x > 3) + + del list[0] + self.assertEqual(len(filteredList), 2) + self.assertEqual(filteredList[0], 4) + + list[2] = 42 + # update should not change length of filtered list + self.assertEqual(len(filteredList), 2) + # update should propagate + self.assertEqual(filteredList[0], 42) + + def testFilterAdditionWithFilteredIndices(self): + list = ActiveList([1, 2, 3, 4, 5]) + filteredList = list.filter(lambda x: x > 3) + + list.insert(0, 0) + self.assertEqual(len(filteredList), 2) + self.assertEqual(filteredList[0], 4) + + list[4] = 42 + # update should not change length of filtered list + self.assertEqual(len(filteredList), 2) + # update should propagate + self.assertEqual(filteredList[0], 42)