Skip to content

Commit 8dea6c6

Browse files
authored
Merge pull request #1476 from VesnaT/tree_test
[ENH] TestWidgetTree: Cls and reg tree widgets test upgrade
2 parents d46b8e1 + db3cab6 commit 8dea6c6

File tree

3 files changed

+93
-16
lines changed

3 files changed

+93
-16
lines changed

Orange/widgets/classify/owclassificationtree.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,25 @@ class OWClassificationTree(OWBaseLearner):
2626
scores = (("Entropy", "entropy"), ("Gini Index", "gini"))
2727

2828
def add_main_layout(self):
29-
gui.comboBox(self.controlArea, self, "attribute_score",
30-
box='Feature Selection',
31-
items=[name for name, _ in self.scores],
32-
callback=self.settings_changed)
29+
self.score_combo = gui.comboBox(
30+
self.controlArea, self, "attribute_score", box='Feature Selection',
31+
items=[name for name, _ in self.scores],
32+
callback=self.settings_changed)
3333

3434
box = gui.vBox(self.controlArea, 'Pruning')
35-
gui.spin(box, self, "min_leaf", 1, 1000,
36-
label="Min. instances in leaves: ", checked="limit_min_leaf",
37-
callback=self.settings_changed)
38-
gui.spin(box, self, "min_internal", 1, 1000,
39-
label="Stop splitting nodes with less instances than: ",
40-
checked="limit_min_internal",
41-
callback=self.settings_changed)
42-
gui.spin(box, self, "max_depth", 1, 1000,
43-
label="Limit the depth to: ", checked="limit_depth",
44-
callback=self.settings_changed)
35+
self.min_leaf_spin = gui.spin(
36+
box, self, "min_leaf", 1, 1000, label="Min. instances in leaves: ",
37+
checked="limit_min_leaf", callback=self.settings_changed,
38+
checkCallback=self.settings_changed)
39+
self.min_internal_spin = gui.spin(
40+
box, self, "min_internal", 1, 1000,
41+
label="Stop splitting nodes with less instances than: ",
42+
checked="limit_min_internal", callback=self.settings_changed,
43+
checkCallback=self.settings_changed)
44+
self.max_depth_spin = gui.spin(
45+
box, self, "max_depth", 1, 1000, label="Limit the depth to: ",
46+
checked="limit_depth", callback=self.settings_changed,
47+
checkCallback=self.settings_changed)
4548

4649
def create_learner(self):
4750
return self.LEARNER(
Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,48 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
33
from Orange.widgets.classify.owclassificationtree import OWClassificationTree
4-
from Orange.widgets.tests.base import WidgetTest, WidgetLearnerTestMixin
4+
from Orange.widgets.tests.base import (WidgetTest, WidgetLearnerTestMixin,
5+
GuiToParam)
56

67

78
class TestOWClassificationTree(WidgetTest, WidgetLearnerTestMixin):
89
def setUp(self):
910
self.widget = self.create_widget(OWClassificationTree,
1011
stored_settings={"auto_apply": False})
1112
self.init()
13+
14+
def combo_set_value(i, x):
15+
x.activated.emit(i)
16+
x.setCurrentIndex(i)
17+
18+
scores = [score[1] for score in self.widget.scores]
19+
md_spin = self.widget.max_depth_spin[1]
20+
mi_spin = self.widget.min_internal_spin[1]
21+
ml_spin = self.widget.min_leaf_spin[1]
22+
md_min_max = [md_spin.minimum(), md_spin.maximum()]
23+
mi_min_max = [mi_spin.minimum(), mi_spin.maximum()]
24+
ml_min_max = [ml_spin.minimum(), ml_spin.maximum()]
25+
self.gui_to_params = [
26+
GuiToParam('criterion', self.widget.score_combo,
27+
lambda x: scores[x.currentIndex()],
28+
combo_set_value, scores, list(range(len(scores)))),
29+
GuiToParam('max_depth', md_spin, lambda x: x.value(),
30+
lambda i, x: x.setValue(i), md_min_max, md_min_max),
31+
GuiToParam('min_samples_split', mi_spin, lambda x: x.value(),
32+
lambda i, x: x.setValue(i), mi_min_max, mi_min_max),
33+
GuiToParam('min_samples_leaf', ml_spin, lambda x: x.value(),
34+
lambda i, x: x.setValue(i), ml_min_max, ml_min_max)]
35+
36+
def test_parameters_unchecked(self):
37+
"""Check learner and model for various values of all parameters
38+
when pruning parameters are not checked
39+
"""
40+
self.widget.max_depth_spin[0].setCheckState(False)
41+
self.widget.min_internal_spin[0].setCheckState(False)
42+
self.widget.min_leaf_spin[0].setCheckState(False)
43+
for i, val in ((1, None), (2, 2), (3, 1)):
44+
el = self.gui_to_params[i]
45+
self.gui_to_params[i] = GuiToParam(
46+
el.name, el.gui_el, lambda x, value=val: value,
47+
el.set, [val], el.set_values[0:1])
48+
self.test_parameters()
Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,48 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
33
from Orange.widgets.regression.owregressiontree import OWRegressionTree
4-
from Orange.widgets.tests.base import WidgetTest, WidgetLearnerTestMixin
4+
from Orange.widgets.tests.base import (WidgetTest, WidgetLearnerTestMixin,
5+
GuiToParam)
56

67

78
class TestOWRegressionTree(WidgetTest, WidgetLearnerTestMixin):
89
def setUp(self):
910
self.widget = self.create_widget(OWRegressionTree,
1011
stored_settings={"auto_apply": False})
1112
self.init()
13+
14+
def combo_set_value(i, x):
15+
x.activated.emit(i)
16+
x.setCurrentIndex(i)
17+
18+
scores = [score[1] for score in self.widget.scores]
19+
md_spin = self.widget.max_depth_spin[1]
20+
mi_spin = self.widget.min_internal_spin[1]
21+
ml_spin = self.widget.min_leaf_spin[1]
22+
md_min_max = [md_spin.minimum(), md_spin.maximum()]
23+
mi_min_max = [mi_spin.minimum(), mi_spin.maximum()]
24+
ml_min_max = [ml_spin.minimum(), ml_spin.maximum()]
25+
self.gui_to_params = [
26+
GuiToParam('criterion', self.widget.score_combo,
27+
lambda x: scores[x.currentIndex()],
28+
combo_set_value, scores, list(range(len(scores)))),
29+
GuiToParam('max_depth', md_spin, lambda x: x.value(),
30+
lambda i, x: x.setValue(i), md_min_max, md_min_max),
31+
GuiToParam('min_samples_split', mi_spin, lambda x: x.value(),
32+
lambda i, x: x.setValue(i), mi_min_max, mi_min_max),
33+
GuiToParam('min_samples_leaf', ml_spin, lambda x: x.value(),
34+
lambda i, x: x.setValue(i), ml_min_max, ml_min_max)]
35+
36+
def test_parameters_unchecked(self):
37+
"""Check learner and model for various values of all parameters
38+
when pruning parameters are not checked
39+
"""
40+
self.widget.max_depth_spin[0].setCheckState(False)
41+
self.widget.min_internal_spin[0].setCheckState(False)
42+
self.widget.min_leaf_spin[0].setCheckState(False)
43+
for i, val in ((1, None), (2, 2), (3, 1)):
44+
el = self.gui_to_params[i]
45+
self.gui_to_params[i] = GuiToParam(
46+
el.name, el.gui_el, lambda x, value=val: value,
47+
el.set, [val], el.set_values[0:1])
48+
self.test_parameters()

0 commit comments

Comments
 (0)