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_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))
示例#3
0
    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()))
示例#5
0
    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()))
示例#6
0
    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)
示例#8
0
    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)
示例#9
0
    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_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)
示例#11
0
    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)
示例#13
0
    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_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_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_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_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_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)
示例#19
0
    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_go_to_next_page(self):
        buf = ScreenBuffer(page_size=2, buffer_size=5)

        for i in range(10):
            buf.append_record(self._get_line(i + 1))

        buf.go_to_previous_page()
        buf.go_to_previous_line()
        buf.go_to_next_page()

        cur = buf.get_current_lines()
        self.assertEqual(2, len(cur))
        self.assertEqual('8', cur[0].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)
示例#23
0
    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_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)
示例#25
0
    def test_should_go_to_next_line(self):
        buf = ScreenBuffer(page_size=2, buffer_size=5)

        for i in range(10):
            buf.append_record(self._get_line(i + 1))

        buf.go_to_previous_page()
        buf.go_to_next_line()

        cur = buf.get_current_lines()
        self.assertEqual(2, len(cur))
        self.assertEqual('8', cur[0].message)
示例#26
0
    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()))
示例#27
0
    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)
示例#28
0
 def __init__(self, lines):
     self._lines = []
     dt = datetime.datetime(2016, 6, 4)
     for i, (line, is_continuation) in enumerate(lines):
         data = { 'id': i + 1, 'datetime': dt, 'host': 'test',
             'program': 'example', 'facility_num': 0, 'level_num': 7,
             'message': 'test message' }
         data.update(line)
         self._lines.append(ScreenBuffer.Line(data, is_continuation))
    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()))
示例#30
0
    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_auto_scroll_after_manual_scroll(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)
        buf.go_to_next_page()
        buf.go_to_next_page()
        buf.go_to_next_line()
        buf.append_record(self._get_line(20))
        cur = buf.get_current_lines()
        self.assertEqual(2, len(cur))
        self.assertEqual('19', cur[0].message)
        self.assertEqual('20', cur[1].message)
示例#32
0
    def test_should_change_page_size_before_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.go_to_previous_page()
        buf.page_size = 3

        cur = buf.get_current_lines()
        self.assertEqual(3, len(cur))
        self.assertEqual('7', cur[0].message)
示例#33
0
    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)
示例#34
0
    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_not_stop_fetching_if_fetch_returns_correct_number_of_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_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('7', cur[0].message)
        self.assertEqual('8', cur[1].message)
示例#36
0
    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()
示例#37
0
    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)
示例#38
0
    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))
示例#39
0
    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_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)
示例#41
0
    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()))
示例#42
0
    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))
示例#43
0
 def test_should_translate_invalid_integers_to_blank(self):
     line = ScreenBuffer.Line(
         {
             'id': 1,
             'datetime': '',
             'host': '',
             'program': '',
             'message': '',
             'facility_num': 'a',
             'level_num': 'b'
         }, False)
     self.assertEqual('', line.facility)
     self.assertEqual('', line.level)
示例#44
0
 def test_should_translate_out_of_range_values_to_blank(self):
     line = ScreenBuffer.Line(
         {
             'id': 1,
             'datetime': '',
             'host': '',
             'program': '',
             'message': '',
             'facility_num': 24,
             'level_num': 8
         }, False)
     self.assertEqual('', line.facility)
     self.assertEqual('', line.level)
示例#45
0
 def test_should_translate_strings_to_description(self):
     line = ScreenBuffer.Line(
         {
             'id': 1,
             'datetime': '',
             'host': '',
             'program': '',
             'message': '',
             'facility_num': '1',
             'level_num': '6'
         }, False)
     self.assertEqual('user', line.facility)
     self.assertEqual('info', line.level)
    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)
示例#47
0
    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_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)
示例#49
0
    def test_should_stop_fetching_if_fetch_returns_less_records_than_asked(
            self):
        buf = ScreenBuffer(page_size=2, buffer_size=5)

        drv = ScreenBufferTest.FakeDriver(self.queue)

        self.queue.push_backward_records(6, 6)

        buf.get_records(drv)

        buf.go_to_previous_page()
        buf.go_to_previous_page()

        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_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_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_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_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_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)
示例#55
0
    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()
示例#56
0
    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_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_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_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_stop_fetching_if_fetch_returns_less_records_than_asked(self):
        buf = ScreenBuffer(page_size=2, buffer_size=5)

        drv = ScreenBufferTest.FakeDriver(self.queue)

        self.queue.push_backward_records(6, 6)

        buf.get_records(drv)

        buf.go_to_previous_page()
        buf.go_to_previous_page()

        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)