diff --git a/Orange/widgets/data/oweditdomain.py b/Orange/widgets/data/oweditdomain.py index 84070137e28..667d93e6dd9 100644 --- a/Orange/widgets/data/oweditdomain.py +++ b/Orange/widgets/data/oweditdomain.py @@ -122,6 +122,7 @@ class VariableEditor(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) + self.var = None self.setup_gui() def setup_gui(self): @@ -216,7 +217,7 @@ def get_data(self): labels = self.labels_model.get_dict() # Is the variable actually changed. - if not self.is_same(): + if self.var is not None and not self.is_same(): var = type(self.var)(name) var.attributes.update(labels) self.var = var @@ -231,7 +232,8 @@ def is_same(self): name = str(self.name_edit.text()) labels = self.labels_model.get_dict() - return self.var and name == self.var.name and labels == self.var.attributes + return (self.var is not None and name == self.var.name and + labels == self.var.attributes) def clear(self): """Clear the editor state. @@ -319,7 +321,7 @@ def get_data(self): labels = self.labels_model.get_dict() values = map(str, self.values_model) - if not self.is_same(): + if self.var is not None and not self.is_same(): var = type(self.var)(name, values=values) var.attributes.update(labels) self.var = var @@ -331,8 +333,9 @@ def get_data(self): def is_same(self): """Is the current model state the same as the input. """ - values = map(str, self.values_model) - return VariableEditor.is_same(self) and self.var.values == values + values = list(map(str, self.values_model)) + return (VariableEditor.is_same(self) and self.var is not None and + self.var.values == values) def clear(self): """Clear the model state. diff --git a/Orange/widgets/data/tests/test_oweditdomain.py b/Orange/widgets/data/tests/test_oweditdomain.py index b174361772f..b4a92798cfa 100644 --- a/Orange/widgets/data/tests/test_oweditdomain.py +++ b/Orange/widgets/data/tests/test_oweditdomain.py @@ -6,11 +6,12 @@ from AnyQt.QtCore import QModelIndex, Qt -from Orange.data import ContinuousVariable, DiscreteVariable, Table, Domain +from Orange.data import ContinuousVariable, DiscreteVariable, \ + StringVariable, Table, Domain from Orange.widgets.data.oweditdomain import EditDomainReport, OWEditDomain, \ - ContinuousVariableEditor + ContinuousVariableEditor, DiscreteVariableEditor, VariableEditor from Orange.widgets.data.owcolor import OWColor, ColorRole -from Orange.widgets.tests.base import WidgetTest +from Orange.widgets.tests.base import WidgetTest, GuiTest SECTION_NAME = "NAME" @@ -138,3 +139,56 @@ def test_list_attributes_remain_lists(self): self.widget.unconditional_commit() t2 = self.get_output("Data") self.assertEqual(t2.domain["a"].attributes["list"], [1, 2, 4]) + + +class TestEditors(GuiTest): + def test_variable_editor(self): + w = VariableEditor() + self.assertIs(w.get_data(), None) + + v = StringVariable(name="S") + v.attributes.update({"A": 1, "B": "b"},) + w.set_data(v) + + self.assertEqual(w.name_edit.text(), v.name) + self.assertEqual(w.labels_model.get_dict(), v.attributes) + self.assertTrue(w.is_same()) + + w.set_data(None) + self.assertEqual(w.name_edit.text(), "") + self.assertEqual(w.labels_model.get_dict(), {}) + self.assertIs(w.get_data(), None) + + def test_continuous_editor(self): + w = ContinuousVariableEditor() + self.assertIs(w.get_data(), None) + + v = ContinuousVariable("X", number_of_decimals=5) + v.attributes.update({"A": 1, "B": "b"}) + w.set_data(v) + + self.assertEqual(w.name_edit.text(), v.name) + self.assertEqual(w.labels_model.get_dict(), v.attributes) + self.assertTrue(w.is_same()) + + w.set_data(None) + self.assertEqual(w.name_edit.text(), "") + self.assertEqual(w.labels_model.get_dict(), {}) + self.assertIs(w.get_data(), None) + + def test_discrete_editor(self): + w = DiscreteVariableEditor() + self.assertIs(w.get_data(), None) + + v = DiscreteVariable("C", values=["a", "b", "c"]) + v.attributes.update({"A": 1, "B": "b"}) + w.set_data(v) + + self.assertEqual(w.name_edit.text(), v.name) + self.assertEqual(w.labels_model.get_dict(), v.attributes) + self.assertTrue(w.is_same()) + + w.set_data(None) + self.assertEqual(w.name_edit.text(), "") + self.assertEqual(w.labels_model.get_dict(), {}) + self.assertIs(w.get_data(), None)