Fix handling of small/big fuzzyval's in NeighborList.

This fixes an exception when having a really big or small zoom (e.g. 0) and
then using +/-.

Fixes #361.
This commit is contained in:
Florian Bruhin 2014-12-18 23:04:43 +01:00
parent 410d78cfa2
commit 29ce0a5157
2 changed files with 32 additions and 2 deletions

View File

@ -355,6 +355,30 @@ class SnapInTests(unittest.TestCase):
self.assertEqual(self.nl.previtem(), 1)
self.assertEqual(self.nl._idx, 2)
def test_too_big_next(self):
"""Test fuzzyval/next with a value bigger than any in the list."""
self.nl.fuzzyval = 30
self.assertEqual(self.nl.nextitem(), 20)
self.assertEqual(self.nl._idx, 0)
def test_too_big_prev(self):
"""Test fuzzyval/prev with a value bigger than any in the list."""
self.nl.fuzzyval = 30
self.assertEqual(self.nl.previtem(), 20)
self.assertEqual(self.nl._idx, 0)
def test_too_small_next(self):
"""Test fuzzyval/next with a value smaller than any in the list."""
self.nl.fuzzyval = 0
self.assertEqual(self.nl.nextitem(), 1)
self.assertEqual(self.nl._idx, 2)
def test_too_small_prev(self):
"""Test fuzzyval/prev with a value smaller than any in the list."""
self.nl.fuzzyval = 0
self.assertEqual(self.nl.previtem(), 1)
self.assertEqual(self.nl._idx, 2)
if __name__ == '__main__':
unittest.main()

View File

@ -116,8 +116,14 @@ class NeighborList(collections.abc.Sequence):
op = operator.le if offset < 0 else operator.ge
items = [(idx, e) for (idx, e) in enumerate(self._items)
if op(e, self.fuzzyval)]
close_item = min(items, key=lambda tpl: abs(self.fuzzyval - tpl[1]))
self._idx = close_item[0]
if items:
item = min(items, key=lambda tpl: abs(self.fuzzyval - tpl[1]))
else:
sorted_items = sorted([(idx, e) for (idx, e) in
enumerate(self.items)])
idx = 0 if offset < 0 else -1
item = sorted_items[idx]
self._idx = item[0]
return self.fuzzyval not in self._items
def _get_new_item(self, offset):