From cabb4ae9df11c3918c0c2ce6e25787143c361b9b Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Mon, 7 Nov 2016 13:50:36 +0100 Subject: [PATCH 1/2] oweditdomain: Initialize `var` attribute Fix an AttributeError due to an uninitialized attribute --- Orange/widgets/data/oweditdomain.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Orange/widgets/data/oweditdomain.py b/Orange/widgets/data/oweditdomain.py index 84070137e28..5af8fed5fd4 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): @@ -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. From b3f58410558ae87936c6560f6d4e21a44316d979 Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Mon, 7 Nov 2016 14:52:55 +0100 Subject: [PATCH 2/2] oweditdomain: Fix errors and add basic tests for variable editors --- Orange/widgets/data/oweditdomain.py | 9 +-- .../widgets/data/tests/test_oweditdomain.py | 60 ++++++++++++++++++- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Orange/widgets/data/oweditdomain.py b/Orange/widgets/data/oweditdomain.py index 5af8fed5fd4..667d93e6dd9 100644 --- a/Orange/widgets/data/oweditdomain.py +++ b/Orange/widgets/data/oweditdomain.py @@ -217,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 @@ -321,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 @@ -333,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)