diff options
-rw-r--r-- | urwid/raw_display.py | 44 | ||||
-rw-r--r-- | urwid/tests/test_treetools.py | 98 |
2 files changed, 140 insertions, 2 deletions
diff --git a/urwid/raw_display.py b/urwid/raw_display.py index 9eadc0e..94c8080 100644 --- a/urwid/raw_display.py +++ b/urwid/raw_display.py @@ -539,6 +539,20 @@ class Screen(BaseScreen, RealTerminal): return ready def _getch(self, timeout): + """ + Wait for character on _term_input_file. + + >>> import os + >>> r, w = os.pipe() + >>> r = os.fdopen(r) + >>> w = os.fdopen(w, 'w') + >>> s = Screen(input=r) + >>> _ = w.write('x') + >>> w.close() + >>> chr(s._getch(1)) + 'x' + + """ ready = self._wait_for_input_ready(timeout) if self.gpm_mev is not None: if self.gpm_mev.stdout.fileno() in ready: @@ -1020,6 +1034,32 @@ class Screen(BaseScreen, RealTerminal): 0 <= index < 256 (some terminals will only have 16 or 88 colors) 0 <= red, green, blue < 256 + + >>> import os + >>> r, w = os.pipe() + >>> r = os.fdopen(r) + >>> w = os.fdopen(w, 'w') + >>> s = Screen(output=w) + >>> s.modify_terminal_palette([ + ... (1, 10, 20, 30), + ... (2, 40, 50, 60) + ... ]) + + >>> import os + >>> r, w = os.pipe() + >>> r = os.fdopen(r) + >>> w = os.fdopen(w, 'w') + >>> os.environ['TERM'] = 'fbterm' + >>> s = Screen(output=w) + >>> s.modify_terminal_palette([ + ... (1, 10, 20, 30), + ... (2, 40, 50, 60) + ... ]) + >>> s.write('foo\\n') + >>> w.close() + >>> r.read(128) + '\\x1b[3;1;10;20;30;2;40;50;60}foo\\n' + """ if self.term == 'fbterm': @@ -1038,9 +1078,9 @@ class Screen(BaseScreen, RealTerminal): AttrSpec = lambda self, fg, bg: AttrSpec(fg, bg, self.colors) -def _test(): +def _test(): # pragma: no cover import doctest doctest.testmod() -if __name__=='__main__': +if __name__=='__main__': # pragma: no cover _test() diff --git a/urwid/tests/test_treetools.py b/urwid/tests/test_treetools.py new file mode 100644 index 0000000..1defde8 --- /dev/null +++ b/urwid/tests/test_treetools.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +import unittest +from textwrap import dedent + +from urwid.compat import B +import urwid + + +class ExampleTreeWidget(urwid.TreeWidget): + """ Display widget for leaf nodes """ + def get_display_text(self): + return self.get_node().get_value()['name'] + + +class ExampleNode(urwid.TreeNode): + """ Data storage object for leaf nodes """ + def load_widget(self): + return ExampleTreeWidget(self) + + +class ExampleParentNode(urwid.ParentNode): + """ Data storage object for interior/parent nodes """ + def load_widget(self): + return ExampleTreeWidget(self) + + def load_child_keys(self): + data = self.get_value() + return range(len(data['children'])) + + def load_child_node(self, key): + """Return either an ExampleNode or ExampleParentNode""" + childdata = self.get_value()['children'][key] + childdepth = self.get_depth() + 1 + if 'children' in childdata: + childclass = ExampleParentNode + else: + childclass = ExampleNode + return childclass(childdata, parent=self, key=key, depth=childdepth) + + +class TreeToolsTest(unittest.TestCase): + def setUp(self): + self.data = dict( + name='Countries', + children=[ + dict( + name='Ukraine', + children=[ + dict( + name='Lviv' + ), + dict( + name='Kyiv' + ) + ] + ), + dict( + name='United States of America', + children=[ + dict( + name='New York' + ), + dict( + name='Los Angeles' + ) + ] + ) + ] + ) + self.node = ExampleParentNode(self.data) + # self.tree = ExampleTreeWidget(self.node) + # self.tree.expanded = True + self.listbox = urwid.TreeListBox(urwid.TreeWalker(self.node)) + + self.expected_tree = dedent('''\ + - Countries + - Ukraine + Lviv + Kyiv + - United States of America + New York + Los Angeles + ''') + + def test_render_listbox(self): + canvas = self.listbox.render((30, 8)) + lines = [ + ''.join([ + (block[2] if isinstance(block, tuple) else block).decode('utf-8') + for block + in line + ]).rstrip() + for line + in canvas.content() + ] + result = '\n'.join(lines) + self.assertEqual(result, self.expected_tree) + |