diff --git a/numpy_ringbuffer/__init__.py b/numpy_ringbuffer/__init__.py index 719a29b..d99d80a 100644 --- a/numpy_ringbuffer/__init__.py +++ b/numpy_ringbuffer/__init__.py @@ -162,11 +162,17 @@ def __len__(self): return self._right_index - self._left_index def __getitem__(self, item): + if len(self) == 0: + raise IndexError("Buffer is empty") # handle simple (b[1]) and basic (b[np.array([1, 2, 3])]) fancy indexing specially if not isinstance(item, tuple): item_arr = np.asarray(item) if issubclass(item_arr.dtype.type, np.integer): - item_arr = (item_arr + self._left_index) % self._capacity + if self.is_full: + item_arr = (item_arr + self._left_index) % self._capacity + else: + item_arr = ((item_arr + self._left_index) + % self._right_index) return self._arr[item_arr] # for everything else, get it right at the expense of efficiency diff --git a/tests.py b/tests.py index feeb9ae..a5b5547 100644 --- a/tests.py +++ b/tests.py @@ -185,6 +185,23 @@ def test_degenerate(self): except IndexError: self.fail() + def test_raises_error_indexing_empty_buffer(self): + r = RingBuffer(10) + with self.assertRaises(IndexError, + msg="Fails to raise an IndexError when " + "trying to index an empty buffer."): + r[0] + + def test_negative_indices_give_recent_data_with_unfull_buffer(self): + r = RingBuffer(10) + for i in range(5): + r.append(i) + for i in reversed(range(-len(r), 0)): + self.assertAlmostEqual(r[i], r[i+5], + msg="Fails to index from the back of " + "the filled portion of the buffer " + "given a negative index.") + if not hasattr(TestAll, 'assertRaisesRegex'): TestAll.assertRaisesRegex = TestAll.assertRaisesRegexp