def test_custom_close_tab_widget(qtapi): custom = CustomCloseTabWidget() qtapi.add_widget(custom) label = QLabel(custom._stack) label.setText('Label 1') custom.addTab(label, 't1', closeable=False) label = QLabel(custom._stack) label.setText('Label 2') custom.addTab(label, 't2', True) label = QLabel(custom._stack) label.setText('Label 3') custom.addTab(label, 't3', False) label = QLabel(custom._stack) label.setText('Label 4') custom.addTab(label, 't4', True) assert custom.tabText(3) == 't4' def on_remove(i): custom.removeTab(i) custom.on_remove_requested.register(on_remove) # qtapi.d() while custom.count() > 0: custom.removeTab(0)
def test_menu_creator(qtapi, data_regression): from pyvmmonitor_qt.qt_utils import MenuCreator menu_creator = MenuCreator() submenu = menu_creator.add_submenu('Sort') class Class(object): def cumulative(self): print('cumulative') def total(self): print('total') c = Class() submenu.add_action('Cumulative', c.cumulative) action = submenu.add_action('Total') action.triggered.connect(c.total) another = submenu.add_submenu('Another') another.add_action('F1') another.add_action('F2') menu = menu_creator.create_menu() qtapi.add_widget(menu) from pyvmmonitor_qt.qt.QtWidgets import QMenu assert isinstance(menu, QMenu) # I'd like to check what's there, but it seems QMenu doesn't have that API. data_regression.check(menu_creator.to_dict()) # view interactively # from pyvmmonitor_qt.qt.QtGui import QCursor # menu.exec_(QCursor.pos()) # Check that it doesn't keep a strong reference for bound methods c = weakref.ref(c) assert c() is None
def test_custom_close_tab_widget(qtapi): custom = CustomCloseTabWidget() qtapi.add_widget(custom) label = QLabel(custom._stack) label.setText('Label 1') custom.addTab(label, 't1', closeable=False) label = QLabel(custom._stack) label.setText('Label 2') custom.addTab(label, 't2', True) label = QLabel(custom._stack) label.setText('Label 3') custom.addTab(label, 't3', False) label = QLabel(custom._stack) label.setText('Label 4') custom.addTab(label, 't4', True) assert custom.tabText(3) == 't4' def on_remove(i): custom.removeTab(i) custom.on_remove_requested.register(on_remove) # qtapi.d() while custom.count() > 0: custom.removeTab(0)
def test_count_children(qtapi): from pyvmmonitor_qt.qt.QtWidgets import QWidget qwidget = QWidget() qwidget2 = QWidget(qwidget) qwidget3 = QWidget(qwidget2) qwidget4 = QWidget(qwidget2) qtapi.add_widget(qwidget) assert count_widget_children(qwidget) == 3
def test_count_children(qtapi): from pyvmmonitor_qt.qt.QtWidgets import QWidget qwidget = QWidget() qwidget2 = QWidget(qwidget) qwidget3 = QWidget(qwidget2) qwidget4 = QWidget(qwidget2) qtapi.add_widget(qwidget) assert count_widget_children(qwidget) == 3
def test_tree_view_expand_remove(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree['a'].expand() from pyvmmonitor_qt.qt_utils import count_items assert count_items(tree.tree) == 1 del tree['a'] assert count_items(tree.tree) == 0
def test_tree_view_expand_remove(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree['a'].expand() from pyvmmonitor_qt.qt_utils import count_items assert count_items(tree.tree) == 1 del tree['a'] assert count_items(tree.tree) == 0
def test_tree_view(qtapi, tree): from pyvmmonitor_qt import qt_utils from pyvmmonitor_qt.tree.pythonic_tree_view import TreeNode tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) # Usual API to use tree['a'] = [10, 20] tree['a.b'] = [20, 30] tree['a.c'] = ['30'] tree['a.b.c'] = ['30', 40] assert qt_utils.list_wiget_item_captions(tree.tree, cols=(0, 1)) == [['10', '20'], ['+20', '+30'], ['++30', '++40'], ['+30', '+']] tree['a'].expand() tree['a'].check(True) node = TreeNode([1, 2]) assert not node.is_expanded() with pytest.raises(RuntimeError): node.expand(True) assert not node.is_expanded( ) # We can only expand after it's added to the tree with pytest.raises(RuntimeError): node.check(True) assert not node.is_checked() tree['a.d'] = node node.expand() node.check() assert node.is_expanded() assert node.is_checked() tree['a.d.c'] = [2, 4] tree['a.d.c'].expand() assert tree['a.d.c'].is_expanded() assert node.is_expanded() assert node.is_checked() assert not node.is_checked(1) from pyvmmonitor_qt.qt_event_loop import process_events process_events() assert node.is_expanded() assert node.is_checked() assert not node.is_checked(1)
def test_selection(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) tree.set_selection(['a.b.c.d']) assert tree.get_selection() == ['a.b.c.d'] tree.set_selection(['a', 'a.b.c.d']) assert tree.get_selection() == ['a', 'a.b.c.d']
def test_selection(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) tree.set_selection(['a.b.c.d']) assert tree.get_selection() == ['a.b.c.d'] tree.set_selection(['a', 'a.b.c.d']) assert tree.get_selection() == ['a', 'a.b.c.d']
def test_expanded_items(qtapi): from pyvmmonitor_qt.qt.QtWidgets import QTreeView from pyvmmonitor_qt.qt_tree_utils import expanded_nodes_tree qtree_view = QTreeView() qtapi.add_widget(qtree_view) model = QStandardItemModel() qtree_view.setModel(model) model.appendRow(create_item('Item 1')) item2_no_children = create_item('Item 2a') model.appendRow(item2_no_children) item2 = create_item('Item 2') model.appendRow(item2) item3 = create_item('Item 3') item2.appendRow(item3) item4 = create_item('Item 4') model.appendRow(item4) item3_on_root = create_item('Item 3') model.appendRow(item3_on_root) qtree_view.setExpanded(item2.index(), True) qtree_view.setExpanded(item3.index(), True) qtree_view.setExpanded(item4.index(), True) stream = io.StringIO() initial_expanded = expanded_nodes_tree(qtree_view) initial_expanded.print_rep(stream=stream) expected_initial_expanded = u'''unicode: Item 2 unicode: Item 3 unicode: Item 4 '''.replace('\r\n', '\n').replace('\r', '\n') if compat.PY3: expected_initial_expanded = expected_initial_expanded.replace( 'unicode', 'str') assert stream.getvalue() == expected_initial_expanded qtree_view.setExpanded(item2.index(), False) qtree_view.setExpanded(item3.index(), False) qtree_view.setExpanded(item4.index(), False) stream = io.StringIO() expanded_nodes_tree(qtree_view).print_rep(stream=stream) assert stream.getvalue() == u'' expanded_nodes_tree(qtree_view, initial_expanded) stream = io.StringIO() expanded_nodes_tree(qtree_view).print_rep(stream=stream) assert stream.getvalue() == expected_initial_expanded
def test_expanded_items(qtapi): from pyvmmonitor_qt.qt.QtWidgets import QTreeView from pyvmmonitor_qt.qt_tree_utils import expanded_nodes_tree qtree_view = QTreeView() qtapi.add_widget(qtree_view) model = QStandardItemModel() qtree_view.setModel(model) model.appendRow(create_item('Item 1')) item2_no_children = create_item('Item 2a') model.appendRow(item2_no_children) item2 = create_item('Item 2') model.appendRow(item2) item3 = create_item('Item 3') item2.appendRow(item3) item4 = create_item('Item 4') model.appendRow(item4) item3_on_root = create_item('Item 3') model.appendRow(item3_on_root) qtree_view.setExpanded(item2.index(), True) qtree_view.setExpanded(item3.index(), True) qtree_view.setExpanded(item4.index(), True) stream = io.StringIO() initial_expanded = expanded_nodes_tree(qtree_view) initial_expanded.print_rep(stream=stream) expected_initial_expanded = u'''unicode: Item 2 unicode: Item 3 unicode: Item 4 '''.replace('\r\n', '\n').replace('\r', '\n') if compat.PY3: expected_initial_expanded = expected_initial_expanded.replace('unicode', 'str') assert stream.getvalue() == expected_initial_expanded qtree_view.setExpanded(item2.index(), False) qtree_view.setExpanded(item3.index(), False) qtree_view.setExpanded(item4.index(), False) stream = io.StringIO() expanded_nodes_tree(qtree_view).print_rep(stream=stream) assert stream.getvalue() == u'' expanded_nodes_tree(qtree_view, initial_expanded) stream = io.StringIO() expanded_nodes_tree(qtree_view).print_rep(stream=stream) assert stream.getvalue() == expected_initial_expanded
def test_tree_view(qtapi, tree): from pyvmmonitor_qt import qt_utils from pyvmmonitor_qt.tree.pythonic_tree_view import TreeNode tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) # Usual API to use tree['a'] = [10, 20] tree['a.b'] = [20, 30] tree['a.c'] = ['30'] tree['a.b.c'] = ['30', 40] assert qt_utils.list_wiget_item_captions(tree.tree, cols=(0, 1)) == [ ['10', '20'], ['+20', '+30'], ['++30', '++40'], ['+30', '+']] tree['a'].expand() tree['a'].check(True) node = TreeNode([1, 2]) assert not node.is_expanded() with pytest.raises(RuntimeError): node.expand(True) assert not node.is_expanded() # We can only expand after it's added to the tree with pytest.raises(RuntimeError): node.check(True) assert not node.is_checked() tree['a.d'] = node node.expand() node.check() assert node.is_expanded() assert node.is_checked() tree['a.d.c'] = [2, 4] tree['a.d.c'].expand() assert tree['a.d.c'].is_expanded() assert node.is_expanded() assert node.is_checked() assert not node.is_checked(1) from pyvmmonitor_qt.qt_event_loop import process_events process_events() assert node.is_expanded() assert node.is_checked() assert not node.is_checked(1)
def test_python_code_text_edit(qtapi): from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter from pyvmmonitor_qt.qt_utils import assert_focus_within_timeout from pyvmmonitor_qt.pyface_based.code_widget import CodeWidget PygmentsHighlighter.style = MonokaiStyle edit = CodeWidget(parent=None) edit.show() qtapi.add_widget(edit) edit.line_highlight_color = QColor(90, 90, 90) initial_code = '''class Error(object): pass''' edit.set_code(initial_code) cursor = edit.textCursor() assert_focus_within_timeout(edit) cursor.setPosition(len(initial_code)) edit.setTextCursor(cursor) # We must set it for it to be applied! assert edit.get_line_until_cursor() == ' pass' assert edit.get_current_line() == ' pass' QTest.sendKeyEvent(QTest.Click, edit, Qt.Key_Home, '', Qt.NoModifier) cursor = edit.textCursor() assert cursor.position(), len(initial_code) - len('pass') assert edit.get_line_until_cursor() == ' ' assert edit.get_current_line() == ' pass' QTest.sendKeyEvent(QTest.Click, edit, Qt.Key_Home, '', Qt.NoModifier) cursor = edit.textCursor() assert cursor.position(), len(initial_code) - len(' pass') assert edit.get_line_until_cursor() == '' assert edit.get_current_line() == ' pass' edit.set_code("""class Foo(object): def Method(self): ''' Docstring ''' a = 10 b += 20 c = 'single line string' self.a = 10 #Some comment """)
def test_hierarchy_different_from_ids(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) contents = [] for node in tree.iternodes('a'): contents.append(node.obj_id) assert ''.join(contents) == 'a.b.c.d' from pyvmmonitor_qt.qt_utils import count_items assert count_items(tree.tree) == 2 assert len(tree) == 2 del tree['a'] assert count_items(tree.tree) == 0
def test_hierarchy_different_from_ids(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) contents = [] for node in tree.iternodes('a'): contents.append(node.obj_id) assert ''.join(contents) == 'a.b.c.d' from pyvmmonitor_qt.qt_utils import count_items assert count_items(tree.tree) == 2 assert len(tree) == 2 del tree['a'] assert count_items(tree.tree) == 0
def test_python_code_text_edit(qtapi): from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter from pyvmmonitor_qt.pyface_based.code_widget import CodeWidget PygmentsHighlighter.style = MonokaiStyle edit = CodeWidget(parent=None) qtapi.add_widget(edit) edit.line_highlight_color = QColor(90, 90, 90) initial_code = '''class Error(object): pass''' edit.set_code(initial_code) cursor = edit.textCursor() edit.setFocus() cursor.setPosition(len(initial_code)) edit.setTextCursor(cursor) # We must set it for it to be applied! assert edit.get_line_until_cursor() == ' pass' assert edit.get_current_line() == ' pass' QTest.sendKeyEvent(QTest.Click, edit, Qt.Key_Home, '', Qt.NoModifier) cursor = edit.textCursor() assert cursor.position(), len(initial_code) - len('pass') assert edit.get_line_until_cursor() == ' ' assert edit.get_current_line() == ' pass' QTest.sendKeyEvent(QTest.Click, edit, Qt.Key_Home, '', Qt.NoModifier) cursor = edit.textCursor() assert cursor.position(), len(initial_code) - len(' pass') assert edit.get_line_until_cursor() == '' assert edit.get_current_line() == ' pass' edit.set_code("""class Foo(object): def Method(self): ''' Docstring ''' a = 10 b += 20 c = 'single line string' self.a = 10 #Some comment """)
def test_clear(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) contents = [] for node in tree.iternodes('a'): contents.append(node.obj_id) assert ''.join(contents) == 'a.b.c.d' from pyvmmonitor_qt import qt_utils assert qt_utils.count_items(tree.tree) == 2 tree.clear() assert qt_utils.count_items(tree.tree) == 0 tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) assert qt_utils.count_items(tree.tree) == 2
def test_clear(qtapi, tree): tree.tree.show() tree.columns = ['col1', 'col2'] qtapi.add_widget(tree.tree) tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) contents = [] for node in tree.iternodes('a'): contents.append(node.obj_id) assert ''.join(contents) == 'a.b.c.d' from pyvmmonitor_qt import qt_utils assert qt_utils.count_items(tree.tree) == 2 tree.clear() assert qt_utils.count_items(tree.tree) == 0 tree['a'] = [10, 20] tree.add_node('a', 'a.b.c.d', [1, 2]) assert qt_utils.count_items(tree.tree) == 2
def test_menu_creator(qtapi, data_regression): from pyvmmonitor_qt.qt_utils import MenuCreator menu_creator = MenuCreator() submenu = menu_creator.add_submenu('Sort') class Class(object): def cumulative(self): print('cumulative') def total(self): print('total') c = Class() submenu.add_action('Cumulative', c.cumulative) action = submenu.add_action('Total') action.triggered.connect(c.total) another = submenu.add_submenu('Another') another.add_action('F1') another.add_action('F2') menu = menu_creator.create_menu() qtapi.add_widget(menu) from pyvmmonitor_qt.qt.QtWidgets import QMenu assert isinstance(menu, QMenu) # I'd like to check what's there, but it seems QMenu doesn't have that API. data_regression.check(menu_creator.to_dict()) # view interactively # from pyvmmonitor_qt.qt.QtGui import QCursor # menu.exec_(QCursor.pos()) # Check that it doesn't keep a strong reference for bound methods c = weakref.ref(c) assert c() is None
def test_python_code_text_edit_dirty(qtapi, tmpdir): from pyvmmonitor_qt.pyface_based.saveable_code_widget import SaveableAdvancedCodeWidget from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter p = tmpdir.mkdir("sub").join("hello.py") initial_code = '''class Error(object): pass''' p.write(initial_code) PygmentsHighlighter.style = MonokaiStyle edit = SaveableAdvancedCodeWidget(parent=None) qtapi.add_widget(edit) edit.code.line_highlight_color = QColor(90, 90, 90) new_code = 'a = 10' dirty = [True] def on_dirty_changed(is_dirty): dirty[0] = is_dirty edit.on_dirty_changed.register(on_dirty_changed) edit.code.set_code(new_code) assert not dirty[0] edit.code.autoindent_newline() assert new_code + '\n' == edit.code.get_code() assert dirty[0] edit.filename = compat.unicode(p) edit.save() assert not dirty[0] edit.code.autoindent_newline() assert dirty[0] edit.code.undo() assert not dirty[0]
def test_python_code_text_edit_dirty(qtapi, tmpdir): from pyvmmonitor_qt.pyface_based.saveable_code_widget import SaveableAdvancedCodeWidget from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter p = tmpdir.mkdir("sub").join("hello.py") initial_code = '''class Error(object): pass''' p.write(initial_code) PygmentsHighlighter.style = MonokaiStyle edit = SaveableAdvancedCodeWidget(parent=None) qtapi.add_widget(edit) edit.code.line_highlight_color = QColor(90, 90, 90) new_code = 'a = 10' dirty = [True] def on_dirty_changed(is_dirty): dirty[0] = is_dirty edit.on_dirty_changed.register(on_dirty_changed) edit.code.set_code(new_code) assert not dirty[0] edit.code.autoindent_newline() assert new_code + '\n' == edit.code.get_code() assert dirty[0] edit.filename = compat.unicode(p) edit.save() assert not dirty[0] edit.code.autoindent_newline() assert dirty[0] edit.code.undo() assert not dirty[0]
def test_python_code_text_edit_save(qtapi, tmpdir): from pyvmmonitor_qt.pyface_based.saveable_code_widget import SaveableAdvancedCodeWidget from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter try: # Python 3 has mock builtin from unittest.mock import patch except ImportError: # Python 2: use mock module from mock import patch p = tmpdir.mkdir("sub").join("hello.py") initial_code = '''class Error(object): pass''' p.write(initial_code) PygmentsHighlighter.style = MonokaiStyle edit = SaveableAdvancedCodeWidget(parent=None) qtapi.add_widget(edit) edit.code.line_highlight_color = QColor(90, 90, 90) new_code = 'a = 10' dirty = [True] def on_dirty_changed(is_dirty): dirty[0] = is_dirty edit.on_dirty_changed.register(on_dirty_changed) edit.code.set_code(new_code) assert not dirty[0] edit.filename = compat.unicode(p) edit.save() assert p.read() == new_code if sys.platform == 'win32': time.sleep(.001) # pass some millis before changing else: time.sleep(1) # Timeout must be higher for linux/mac. p.write(initial_code) from pyvmmonitor_qt.qt import QtWidgets with patch('pyvmmonitor_qt.qt.QtWidgets.QMessageBox.exec_') as m: m.return_value = QtWidgets.QMessageBox.AcceptRole edit.save() # I.e.: reloaded assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write(new_code) with patch('pyvmmonitor_qt.qt.QtWidgets.QMessageBox.exec_') as m: m.return_value = QtWidgets.QMessageBox.RejectRole edit.save() # I.e.: not reloaded (overwrite) assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write('foo') with patch.object(qt_utils, 'ask_save_filename') as m: m.return_value = compat.unicode(p), '' edit.filename = '' edit.save() assert edit.filename == compat.unicode(p) assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write('foo') with patch.object(qt_utils, 'ask_save_filename') as m: m.return_value = '', '' edit.filename = '' edit.save() assert not edit.filename assert p.read() == 'foo' assert edit.code.get_code() == initial_code edit.filename = compat.unicode(p) edit.reload() assert p.read() == 'foo' assert edit.code.get_code() == 'foo'
def test_python_code_text_edit_save(qtapi, tmpdir): from pyvmmonitor_qt.pyface_based.saveable_code_widget import SaveableAdvancedCodeWidget from pyvmmonitor_qt.pyface_based.pygments_highlighter import PygmentsHighlighter try: # Python 3 has mock builtin from unittest.mock import patch except ImportError: # Python 2: use mock module from mock import patch p = tmpdir.mkdir("sub").join("hello.py") initial_code = '''class Error(object): pass''' p.write(initial_code) PygmentsHighlighter.style = MonokaiStyle edit = SaveableAdvancedCodeWidget(parent=None) qtapi.add_widget(edit) edit.code.line_highlight_color = QColor(90, 90, 90) new_code = 'a = 10' dirty = [True] def on_dirty_changed(is_dirty): dirty[0] = is_dirty edit.on_dirty_changed.register(on_dirty_changed) edit.code.set_code(new_code) assert not dirty[0] edit.filename = compat.unicode(p) edit.save() assert p.read() == new_code if sys.platform == 'win32': time.sleep(.001) # pass some millis before changing else: time.sleep(1) # Timeout must be higher for linux/mac. p.write(initial_code) from pyvmmonitor_qt.qt import QtWidgets with patch('pyvmmonitor_qt.qt.QtWidgets.QMessageBox.exec_') as m: m.return_value = QtWidgets.QMessageBox.AcceptRole edit.save() # I.e.: reloaded assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write(new_code) with patch('pyvmmonitor_qt.qt.QtWidgets.QMessageBox.exec_') as m: m.return_value = QtWidgets.QMessageBox.RejectRole edit.save() # I.e.: not reloaded (overwrite) assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write('foo') with patch.object(qt_utils, 'ask_save_filename') as m: m.return_value = compat.unicode(p), '' edit.filename = '' edit.save() assert edit.filename == compat.unicode(p) assert p.read() == initial_code assert edit.code.get_code() == initial_code p.write('foo') with patch.object(qt_utils, 'ask_save_filename') as m: m.return_value = '', '' edit.filename = '' edit.save() assert not edit.filename assert p.read() == 'foo' assert edit.code.get_code() == initial_code edit.filename = compat.unicode(p) edit.reload() assert p.read() == 'foo' assert edit.code.get_code() == 'foo'