def test_remove_variable(qtbot): """Test removing of the correct variable.""" variables = {'a': 1, 'b': 2, 'c': 3, 'd': '4', 'e': 5} editor = CollectionsEditorTableView(None, variables.copy()) qtbot.addWidget(editor) editor.setCurrentIndex(editor.model.index(1, 0)) editor.remove_item(force=True) assert editor.model.rowCount() == 4 assert data(editor.model, 0, 0) == 'a' assert data(editor.model, 1, 0) == 'c' assert data(editor.model, 2, 0) == 'd' assert data(editor.model, 3, 0) == 'e' # Reset variables and try removing one again editor.set_data(variables.copy()) editor.adjust_columns() editor.setCurrentIndex(editor.model.index(1, 0)) editor.remove_item(force=True) assert editor.model.rowCount() == 4 assert data(editor.model, 0, 0) == 'a' assert data(editor.model, 1, 0) == 'c' assert data(editor.model, 2, 0) == 'd' assert data(editor.model, 3, 0) == 'e'
def test_filter_rows(qtbot): """Test rows filtering.""" df = pandas.DataFrame(['foo', 'bar']) editor = CollectionsEditorTableView(None, {'dfa': df, 'dfb': df}) editor.finder = NamespacesBrowserFinder(editor, editor.set_regex) qtbot.addWidget(editor) # Initially two rows assert editor.model.rowCount() == 2 # Match two rows by name editor.finder.setText("df") assert editor.model.rowCount() == 2 # Match two rows by type editor.finder.setText("DataFrame") assert editor.model.rowCount() == 2 # Only one match editor.finder.setText("dfb") assert editor.model.rowCount() == 1 # No match editor.finder.setText("dfbc") assert editor.model.rowCount() == 0
def test_create_dataframeeditor_with_correct_format(qtbot, monkeypatch): df = pandas.DataFrame(['foo', 'bar']) editor = CollectionsEditorTableView(None, {'df': df}) qtbot.addWidget(editor) CONF.set('variable_explorer', 'dataframe_format', '10d') editor.delegate.createEditor(None, None, editor.model.index(0, 3)) dataframe_editor = next(iter(editor.delegate._editors.values()))['editor'] qtbot.addWidget(dataframe_editor) dataframe_editor.dataModel._format == '%10d'
def test_shows_dataframeeditor_when_editing_index(qtbot, monkeypatch): for rng_name, rng in generate_pandas_indexes().items(): MockDataFrameEditor = Mock() mockDataFrameEditor_instance = MockDataFrameEditor() monkeypatch.setattr('spyder.plugins.variableexplorer.widgets.collectionsdelegate.DataFrameEditor', MockDataFrameEditor) coll = {'rng': rng} editor = CollectionsEditorTableView(None, coll) editor.delegate.createEditor(None, None, editor.model.index(0, 3)) mockDataFrameEditor_instance.show.assert_called_once_with()
def test_accept_sig_option_changed_from_dataframeeditor(qtbot, monkeypatch): df = pandas.DataFrame(['foo', 'bar']) editor = CollectionsEditorTableView(None, {'df': df}) qtbot.addWidget(editor) editor.set_dataframe_format('%10d') assert editor.source_model.dataframe_format == '%10d' editor.delegate.createEditor(None, None, editor.model.index(0, 3)) dataframe_editor = next(iter(editor.delegate._editors.values()))['editor'] qtbot.addWidget(dataframe_editor) dataframe_editor.sig_option_changed.emit('dataframe_format', '%5f') assert editor.source_model.dataframe_format == '%5f'
def test_create_dataframeeditor_with_correct_format(qtbot, monkeypatch): MockDataFrameEditor = Mock() mockDataFrameEditor_instance = MockDataFrameEditor() monkeypatch.setattr('spyder.plugins.variableexplorer.widgets.collectionsdelegate.DataFrameEditor', MockDataFrameEditor) df = pandas.DataFrame(['foo', 'bar']) editor = CollectionsEditorTableView(None, {'df': df}) qtbot.addWidget(editor) editor.set_dataframe_format('%10d') editor.delegate.createEditor(None, None, editor.model.index(0, 3)) mockDataFrameEditor_instance.dataModel.set_format.assert_called_once_with('%10d')
def test_editor_parent_set(monkeypatch): """ Test that editors have their parent set so they close with Spyder. Regression test for spyder-ide/spyder#5696. """ # Mocking and setup test_parent = QWidget() MockCollectionsEditor = Mock() attr_to_patch_coledit = ('spyder.widgets.' + 'collectionseditor.CollectionsEditor') monkeypatch.setattr(attr_to_patch_coledit, MockCollectionsEditor) MockArrayEditor = Mock() attr_to_patch_arredit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.ArrayEditor') monkeypatch.setattr(attr_to_patch_arredit, MockArrayEditor) MockDataFrameEditor = Mock() attr_to_patch_dfedit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.DataFrameEditor') monkeypatch.setattr(attr_to_patch_dfedit, MockDataFrameEditor) MockTextEditor = Mock() attr_to_patch_textedit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.TextEditor') monkeypatch.setattr(attr_to_patch_textedit, MockTextEditor) MockObjectExplorer = Mock() attr_to_patch_objectexplorer = ('spyder.plugins.variableexplorer.widgets.' + 'objectexplorer.ObjectExplorer') monkeypatch.setattr(attr_to_patch_objectexplorer, MockObjectExplorer) editor_data = [[0, 1, 2, 3, 4], numpy.array([1.0, 42.0, 1337.0]), pandas.DataFrame([[1, 2, 3], [20, 30, 40]]), os, "012345678901234567890123456789012345678901234567890123456"] col_editor = CollectionsEditorTableView(test_parent, editor_data) assert col_editor.parent() is test_parent for idx, mock_class in enumerate([MockCollectionsEditor, MockArrayEditor, MockDataFrameEditor, MockObjectExplorer, MockTextEditor]): col_editor.delegate.createEditor(col_editor.parent(), None, col_editor.model.index(idx, 3)) assert mock_class.call_count == 1 + (idx // 4) assert mock_class.call_args[1]["parent"] is test_parent
def test_rename_and_duplicate_item_in_collection_editor(): collections = {'list': ([1, 2, 3], False, True), 'tuple': ((1, 2, 3), False, False), 'dict': ({'a': 1, 'b': 2}, True, True)} for coll, rename_enabled, duplicate_enabled in collections.values(): coll_copy = copy.copy(coll) editor = CollectionsEditorTableView(None, coll) assert editor.rename_action.isEnabled() assert editor.duplicate_action.isEnabled() editor.setCurrentIndex(editor.model.index(0, 0)) editor.refresh_menu() assert editor.rename_action.isEnabled() == rename_enabled assert editor.duplicate_action.isEnabled() == duplicate_enabled if isinstance(coll, list): editor.duplicate_item() assert editor.source_model.get_data() == coll_copy + [coll_copy[0]]
def test_edit_datetime(monkeypatch): """ Test datetimes are editable and NaT values are correctly handled. Regression test for spyder-ide/spyder#13557 and spyder-ide/spyder#8329 """ variables = [pandas.NaT, datetime.date.today()] editor_list = CollectionsEditorTableView(None, variables) # Test that the NaT value cannot be edited on the variable explorer editor_list_value = editor_list.delegate.createEditor( None, None, editor_list.model.index(0, 3)) assert editor_list_value is None # Test that a date can be edited on the variable explorer editor_list_value = editor_list.delegate.createEditor( None, None, editor_list.model.index(1, 3)) assert isinstance(editor_list_value, QDateEdit)
def test_edit_mutable_and_immutable_types(monkeypatch): """ Test that mutable objs/vals are editable in VarExp; immutable ones aren't. Regression test for spyder-ide/spyder#5991. """ MockQLineEdit = Mock() attr_to_patch_qlineedit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.QLineEdit') monkeypatch.setattr(attr_to_patch_qlineedit, MockQLineEdit) MockTextEditor = Mock() attr_to_patch_textedit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.TextEditor') monkeypatch.setattr(attr_to_patch_textedit, MockTextEditor) MockQDateTimeEdit = Mock() attr_to_patch_qdatetimeedit = ('spyder.plugins.variableexplorer.widgets.' + 'collectionsdelegate.QDateTimeEdit') monkeypatch.setattr(attr_to_patch_qdatetimeedit, MockQDateTimeEdit) MockCollectionsEditor = Mock() mockCollectionsEditor_instance = MockCollectionsEditor() attr_to_patch_coledit = ('spyder.widgets.' + 'collectionseditor.CollectionsEditor') monkeypatch.setattr(attr_to_patch_coledit, MockCollectionsEditor) list_test = [1, "012345678901234567901234567890123456789012", datetime.datetime(2017, 12, 24, 7, 9), [1, 2, 3], (2, "eggs")] tup_test = tuple(list_test) # Tests for mutable type (list) # editor_list = CollectionsEditorTableView(None, list_test) # Directly editable values inside list editor_list_value = editor_list.delegate.createEditor( None, None, editor_list.model.index(0, 3)) assert editor_list_value is not None assert MockQLineEdit.call_count == 1 # Text Editor for long text inside list editor_list.delegate.createEditor(None, None, editor_list.model.index(1, 3)) assert MockTextEditor.call_count == 2 assert not MockTextEditor.call_args[1]["readonly"] # Datetime inside list editor_list_datetime = editor_list.delegate.createEditor( None, None, editor_list.model.index(2, 3)) assert editor_list_datetime is not None assert MockQDateTimeEdit.call_count == 1 # List inside list editor_list.delegate.createEditor(None, None, editor_list.model.index(3, 3)) assert mockCollectionsEditor_instance.show.call_count == 1 assert not mockCollectionsEditor_instance.setup.call_args[1]["readonly"] # Tuple inside list editor_list.delegate.createEditor(None, None, editor_list.model.index(4, 3)) assert mockCollectionsEditor_instance.show.call_count == 2 assert mockCollectionsEditor_instance.setup.call_args[1]["readonly"] # Tests for immutable type (tuple) # editor_tup = CollectionsEditorTableView(None, tup_test) # Directly editable values inside tuple editor_tup_value = editor_tup.delegate.createEditor( None, None, editor_tup.model.index(0, 3)) assert editor_tup_value is None assert MockQLineEdit.call_count == 1 # Text Editor for long text inside tuple editor_tup.delegate.createEditor(None, None, editor_tup.model.index(1, 3)) assert MockTextEditor.call_count == 4 assert MockTextEditor.call_args[1]["readonly"] # Datetime inside tuple editor_tup_datetime = editor_tup.delegate.createEditor( None, None, editor_tup.model.index(2, 3)) assert editor_tup_datetime is None assert MockQDateTimeEdit.call_count == 1 # List inside tuple editor_tup.delegate.createEditor(None, None, editor_tup.model.index(3, 3)) assert mockCollectionsEditor_instance.show.call_count == 3 assert mockCollectionsEditor_instance.setup.call_args[1]["readonly"] # Tuple inside tuple editor_tup.delegate.createEditor(None, None, editor_tup.model.index(4, 3)) assert mockCollectionsEditor_instance.show.call_count == 4 assert mockCollectionsEditor_instance.setup.call_args[1]["readonly"]