def test_should_not_stop_fetching_if_forward_fetch_returns_fewer_records( self): buf = ScreenBuffer(page_size=2, buffer_size=5) drv = ScreenBufferTest.FakeDriver(self.queue) self.queue.push_backward_records(14, 7) buf.get_records(drv) buf.go_to_previous_line() self.queue.push(None) buf.get_records(drv) buf.go_to_previous_page() buf.go_to_previous_page() self.queue.push_backward_records(7, 7) buf.get_records(drv) buf.go_to_previous_page() cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('6', cur[0].message) self.assertEqual('7', cur[1].message)
def test_should_stop_observing(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.add_observer(self.observer.notify) buf.prepend_record(self._get_line(2)) buf.remove_observer(self.observer.notify) buf.prepend_record(self._get_line(1)) self.assertEqual(1, self.observer.count)
def test_should_get_buffer_instructions_for_forward_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) for i in range(10, 0, -1): buf.prepend_record(self._get_line(i)) self.assertEqual( ((10, False, 5), ), buf.get_buffer_instructions(ScreenBufferTest.NullDriver()))
def test_should_fallback_to_default_buffer_instructions_if_record_with_given_date_is_not_found( self): dt = datetime.datetime.utcnow() buf = ScreenBuffer(page_size=2, buffer_size=5) self.queue.push(None) drv = ScreenBufferTest.FakeDriver(self.queue, dt) self.assertEqual(((None, True, 7), ), buf.get_buffer_instructions(drv))
def test_should_append_record_on_non_empty_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(2)) buf.append_record(self._get_line(3)) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('2', cur[0].message) self.assertEqual('3', cur[1].message)
def test_should_append_multi_line_record_spanning_over_end_of_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(1)) buf.append_record(self._get_line(2, 'a\nb')) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('a', cur[0].message) self.assertEqual('b', cur[1].message)
def test_should_prepend_multi_line_record_on_empty_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.prepend_record(self._get_line(1, 'a\nb')) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('a', cur[0].message) self.assertEqual(False, cur[0].is_continuation) self.assertEqual('b', cur[1].message) self.assertEqual(True, cur[1].is_continuation)
def test_should_get_timeout_if_forward_fetch_returns_fewer_records(self): buf = ScreenBuffer(2, buffer_size=5, timeout=13) drv = ScreenBufferTest.FakeDriver(self.queue) self.queue.push_backward_records(7, 7) buf.get_records(drv) buf.go_to_previous_line() self.queue.push_forward_records(8, 4) self.assertEqual(13, buf.get_records(drv))
def test_should_go_to_next_page_with_less_lines_than_page_size(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(1)) buf.go_to_next_page() cur = buf.get_current_lines() self.assertEqual(1, len(cur)) self.assertEqual('1', cur[0].message)
def test_should_not_start_already_started_driver(self): buf = ScreenBuffer(page_size=2, buffer_size=5) drv = ScreenBufferTest.FakeDriver(self.queue) buf.start(drv) self.queue.push(None) try: self.assertRaises(ValueError, buf.start, drv) finally: buf.stop()
def test_should_get_buffer_instructions_if_both_buffers_are_below_threshold( self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(11)) buf.append_record(self._get_line(12)) self.assertEqual( ((12, False, 5), (11, True, 5)), buf.get_buffer_instructions(ScreenBufferTest.NullDriver()))
def test_should_start_and_stop_driver(self): buf = ScreenBuffer(page_size=2, buffer_size=5) drv = ScreenBufferTest.FakeDriver(self.queue) buf.start(drv) drv.started.wait() self.queue.push_none_and_wait() buf.stop() self.assertTrue(drv.stopped)
def test_should_get_buffer_instructions_for_given_date(self): dt = datetime.datetime.utcnow() buf = ScreenBuffer(page_size=2, buffer_size=5) self.queue.push(13) self.queue.push(None) drv = ScreenBufferTest.FakeDriver(self.queue, dt) self.assertEqual(((12, False, 7), (13, True, 5)), buf.get_buffer_instructions(drv))
def test_should_change_page_size_at_end_of_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) for i in range(10, 0, -1): buf.prepend_record(self._get_line(i)) buf.page_size = 3 cur = buf.get_current_lines() self.assertEqual(3, len(cur)) self.assertEqual('8', cur[0].message)
def test_should_append_record_on_empty_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.add_observer(self.observer.notify) buf.append_record(self._get_line(2)) self.assertEqual(1, self.observer.count) cur = buf.get_current_lines() self.assertEqual(1, len(cur)) self.assertEqual('2', cur[0].message)
def test_should_get_buffer_instructions_for_backward_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) for i in range(10, 20): buf.append_record(self._get_line(i + 1)) for i in range(0, 3): buf.go_to_previous_page() self.assertEqual( ((11, True, 5), ), buf.get_buffer_instructions(ScreenBufferTest.NullDriver()))
def test_should_not_get_timeout_if_forward_fetch_returns_correct_number_of_records( self): buf = ScreenBuffer(2, buffer_size=5, timeout=13) drv = ScreenBufferTest.FakeDriver(self.queue) self.queue.push_backward_records(7, 7) buf.get_records(drv) buf.go_to_previous_line() self.queue.push_forward_records(8, 5) self.assertIsNone(buf.get_records(drv))
def test_should_go_to_previous_line(self): buf = ScreenBuffer(page_size=2, buffer_size=5) for i in range(10, 0, -1): buf.prepend_record(self._get_line(i)) buf.go_to_previous_line() cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('8', cur[0].message)
def test_should_not_get_timeout_if_backward_fetch_returns_fewer_records( self): buf = ScreenBuffer(2, buffer_size=5, timeout=13) drv = ScreenBufferTest.FakeDriver(self.queue) self.queue.push_backward_records(14, 7) buf.get_records(drv) buf.go_to_previous_page() buf.go_to_previous_page() self.queue.push_backward_records(7, 4) self.assertIsNone(buf.get_records(drv))
def test_should_fetch_records_in_descending_order(self): buf = ScreenBuffer(page_size=2, buffer_size=5) self.queue.push_backward_records(2, 2) drv = ScreenBufferTest.FakeDriver(self.queue) buf.get_records(drv) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('1', cur[0].message) self.assertEqual('2', cur[1].message)
def test_should_prepend_record_on_buffer_not_at_end_of_screen(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(2)) buf.append_record(self._get_line(3)) buf.append_record(self._get_line(4)) buf.go_to_previous_line() buf.prepend_record(self._get_line(1)) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('2', cur[0].message) self.assertEqual('3', cur[1].message)
def test_should_not_get_buffer_instructions_for_backward_buffer_if_below_threshold( self): buf = ScreenBuffer(page_size=2, buffer_size=5) for i in range(10, 20): buf.append_record(self._get_line(i + 1)) buf.go_to_previous_page() buf.go_to_previous_page() buf.go_to_previous_line() self.assertEqual( tuple(), buf.get_buffer_instructions(ScreenBufferTest.NullDriver()))
def test_should_restart_driver(self): buf = ScreenBuffer(page_size=2, buffer_size=5) drv = ScreenBufferTest.FakeDriver(self.queue) buf.start(drv) self.queue.push(None) queue2 = ScreenBufferTest.Queue() drv2 = ScreenBufferTest.FakeDriver(queue2) buf.restart(drv2) queue2.push(None) buf.stop()
def test_should_prepend_record_on_off_screen_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.prepend_record(self._get_line(3)) buf.prepend_record(self._get_line(2)) buf.add_observer(self.observer.notify) buf.prepend_record(self._get_line(1)) self.assertEqual(0, self.observer.count) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('2', cur[0].message) self.assertEqual('3', cur[1].message)
def test_should_wait_with_timeout(self): buf = ScreenBuffer(2, buffer_size=5, timeout=13) drv = ScreenBufferTest.FakeDriver(self.queue) with patch.object(buf._condition_var, 'wait', wraps=buf._condition_var.wait) as cond_wait: buf.start(drv) drv.started.wait() self.queue.push_backward_records(14, 7) self.queue.wait() buf.stop() cond_wait.assert_called_once_with(13)
def test_should_auto_scroll_on_append_if_screen_is_at_end_of_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(2)) buf.append_record(self._get_line(3)) buf.add_observer(self.observer.notify) buf.append_record(self._get_line(4)) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('3', cur[0].message) self.assertEqual('4', cur[1].message) self.assertEqual(1, self.observer.count)
def test_should_not_auto_scroll_if_starting_driver_with_date(self): dt = datetime.datetime.utcnow() buf = ScreenBuffer(page_size=2, buffer_size=5) self.queue.push(13) self.queue.push(None) self.queue.push_forward_records(13, 7) self.queue.push_forward_records(12, 5) drv = ScreenBufferTest.FakeDriver(self.queue, dt) buf.get_records(drv) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('13', cur[0].message) self.assertEqual('14', cur[1].message)
def test_should_not_auto_scroll_if_not_at_end_of_buffer(self): buf = ScreenBuffer(page_size=2, buffer_size=5) buf.append_record(self._get_line(2)) buf.append_record(self._get_line(3)) buf.append_record(self._get_line(4)) buf.go_to_previous_line() buf.add_observer(self.observer.notify) buf.append_record(self._get_line(5)) cur = buf.get_current_lines() self.assertEqual(2, len(cur)) self.assertEqual('2', cur[0].message) self.assertEqual(0, self.observer.count)
def test_should_clear_existing_records_on_restart(self): drv = ScreenBufferTest.FakeDriver(self.queue) buf = ScreenBuffer(page_size=2, buffer_size=5) buf.start(drv) self.queue.push_backward_records(2, 2) self.queue.wait() queue2 = ScreenBufferTest.Queue() drv2 = ScreenBufferTest.FakeDriver(queue2) buf.restart(drv2) queue2.push_none_and_wait() try: self.assertEqual(0, len(buf.get_current_lines())) finally: buf.stop()
def test_should_fetch_records_from_thread(self): drv = ScreenBufferTest.FakeDriver(self.queue) buf = ScreenBuffer(page_size=2, buffer_size=5) buf.start(drv) self.queue.push_backward_records(2, 2) self.queue.wait() cur = buf.get_current_lines() buf.stop() self.assertTrue(drv.stopped) self.assertFalse(drv.error) self.assertEqual((None, True, 7), drv.instruction) self.assertEqual(2, len(cur)) self.assertEqual('1', cur[0].message) self.assertEqual('2', cur[1].message)