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)
Ejemplo n.º 2
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)
Ejemplo n.º 4
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
Ejemplo n.º 5
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_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']
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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)
Ejemplo n.º 14
0
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
Ejemplo n.º 17
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
Ejemplo n.º 20
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
Ejemplo n.º 21
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]
Ejemplo n.º 22
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]
Ejemplo n.º 23
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'
Ejemplo n.º 24
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'