def test_render_first_items(self): """ Test we render properly when stuck to the top """ os.environ['TERM'] = 'dumb' app = Logria(None, False, False) # Fake window size: 10 x 100 app.height = 10 app.width = 100 # Set fake previous render app.last_row = app.height - 3 # simulate the last row we can render to app.current_end = 80 # Simulate the last message rendered # Set fake messages app.messages = [str(x) for x in range(100)] # Set positional booleans app.manually_controlled_line = False app.stick_to_top = True app.stick_to_bottom = False start, end = determine_position(app, app.messages) self.assertEqual(start, -1) self.assertEqual(end, 6) app.stop()
def test_can_render_matches(self): """ Test we render properly when using matches """ os.environ['TERM'] = 'dumb' app = Logria(None, False, False) # Fake window size: 10 x 100 app.height = 10 app.width = 100 # Set fake previous render app.last_row = app.height - 3 # simulate the last row we can render to app.current_end = 80 # Simulate the last message rendered # Set fake messages app.messages = [f'{x}|{x}' for x in range(20)] # Set fake filter app.func_handle = regex_generator.regex_test_generator(r'\d\|\d') process_matches(app) # Set positional booleans app.manually_controlled_line = False app.stick_to_top = True app.stick_to_bottom = False start, end = determine_position(app, app.matched_rows) self.assertEqual(start, -1) self.assertEqual(end, 6) app.stop()
def test_render_scroll_pgup_keystroke(self): """ Test we render properly when stuck to the bottom """ os.environ['TERM'] = 'dumb' app = Logria(None, False, False) # Fake window size: 10 x 100 app.height = 10 app.width = 100 # Set fake previous render app.last_row = app.height - 3 # simulate the last row we can render to app.current_end = 40 # Simulate the last message rendered # Set fake messages app.messages = [str(x) for x in range(100)] # Set positional booleans app.manually_controlled_line = False app.stick_to_top = True app.stick_to_bottom = True # Scroll action resolve_keypress(app, 'KEY_PPAGE') start, end = determine_position(app, app.messages) self.assertEqual(start, 25) self.assertEqual(end, 33) app.stop()
def render_text_in_output(self) -> None: """ Renders stream content in the output window If filters are inactive, we use `messages`. If they are active, we pull from `matched_rows` We write the whole message, regardless of length, because slicing a string allocates a new string """ # Store a pointer to the buffer of messages if self.func_handle is None: messages_pointer = self.messages else: # Ignore typing because we use different values depending on what this pointer is messages_pointer = self.matched_rows # type: ignore # Determine the start and end position of the render start, end = determine_position(self, messages_pointer) # Don't do anything if nothing changed; start at index 0 if not self.analytics_enabled and self.previous_render == (max( start, 0), end): return # Early escape self.previous_render = (max(start, 0), end) self.outwin.erase() current_row = self.last_row # The row we are currently rendering for i in range(end, start, -1): if messages_pointer is self.messages: # No processing needed for normal messages item = messages_pointer[i] elif messages_pointer is self.matched_rows: # Grab the matched message and optionally highlight it messages_idx = self.matched_rows[i] item = self.messages[messages_idx] if self.highlight_match: # Remove all color codes before applying highlighter item = re.sub(constants.ANSI_COLOR_PATTERN, '', item) match = re.search(self.regex_pattern, item) if match: start, end = match.span() matched_str = item[start:end] item = item.replace( matched_str, f'\u001b[35m{matched_str}\u001b[0m') # Find the correct start position current_row -= ceil(get_real_length(item) / self.width) if current_row < 0: break # Instead of window.addstr, handle colors color_handler.addstr(self.outwin, current_row, 0, item.rstrip()) self.outwin.refresh()