|
1 | 1 | # Test methods with long descriptive names can omit docstrings |
2 | 2 | # pylint: disable=missing-docstring |
3 | | -from PyQt4 import QtGui |
4 | | - |
5 | | -from Orange.data import Table |
6 | 3 | from Orange.widgets.classify.owsvmclassification import OWSVMClassification |
7 | | -from Orange.widgets.tests.base import WidgetTest |
| 4 | +from Orange.widgets.tests.base import (WidgetTest, DefaultParameterMapping, |
| 5 | + ParameterMapping, WidgetLearnerTestMixin) |
8 | 6 |
|
9 | 7 |
|
10 | | -class TestOWSVMClassification(WidgetTest): |
| 8 | +class TestOWSVMClassification(WidgetTest, WidgetLearnerTestMixin): |
11 | 9 | def setUp(self): |
12 | | - self.widget = self.create_widget(OWSVMClassification) |
13 | | - self.widget.spin_boxes = self.widget.findChildren(QtGui.QDoubleSpinBox) |
14 | | - # max iter spin |
15 | | - self.widget.spin_boxes.append(self.widget.findChildren(QtGui.QSpinBox)[0]) |
16 | | - # max iter checkbox |
17 | | - self.widget.max_iter_check_box = self.widget.findChildren(QtGui.QCheckBox)[0] |
18 | | - self.spin_boxes = self.widget.spin_boxes |
19 | | - self.event_data = None |
20 | | - |
21 | | - def test_kernel_equation_run(self): |
22 | | - """ Check if right text is written for specific kernel """ |
23 | | - for i in range(0, 4): |
24 | | - if self.widget.kernel_box.buttons[i].isChecked(): |
25 | | - self.assertEqual(self.widget.kernel_eq, self.widget.kernels[i][1]) |
26 | | - |
27 | | - def test_kernel_equation(self): |
28 | | - """ Check if right text is written for specific kernel after click """ |
29 | | - for index in range(0, 4): |
30 | | - self.widget.kernel_box.buttons[index].click() |
31 | | - self.assertEqual(self.widget.kernel_eq, self.widget.kernels[index][1]) |
32 | | - |
33 | | - def test_kernel_display_run(self): |
34 | | - """ Check if right spinner box for selected kernel are visible after widget start """ |
35 | | - for button_pos, value in ((0, [False, False, False]), |
36 | | - (1, [True, True, True]), |
37 | | - (2, [True, False, False]), |
38 | | - (3, [True, True, False])): |
39 | | - if self.widget.kernel_box.buttons[button_pos].isChecked(): |
40 | | - self.assertEqual([not self.spin_boxes[i].box.isHidden() for i in range(2, 5)], |
41 | | - value) |
42 | | - break |
| 10 | + self.widget = self.create_widget(OWSVMClassification, |
| 11 | + stored_settings={"auto_apply": False}) |
| 12 | + self.init() |
| 13 | + gamma_spin = self.widget._kernel_params[0] |
| 14 | + values = [self.widget._default_gamma, gamma_spin.maximum()] |
43 | 15 |
|
44 | | - def test_kernel_display(self): |
45 | | - """ Check if right spinner box for selected kernel are visible after we select kernel """ |
46 | | - for button_pos, value in ((0, [False, False, False]), |
47 | | - (1, [True, True, True]), |
48 | | - (2, [True, False, False]), |
49 | | - (3, [True, True, False])): |
50 | | - self.widget.kernel_box.buttons[button_pos].click() |
51 | | - self.widget.kernel_box.buttons[button_pos].isChecked() |
52 | | - self.assertEqual([not self.spin_boxes[i].box.isHidden() for i in range(2, 5)], value) |
| 16 | + def getter(): |
| 17 | + value = gamma_spin.value() |
| 18 | + return gamma_spin.specialValueText() \ |
| 19 | + if value == gamma_spin.minimum() else value |
53 | 20 |
|
54 | | - def test_optimization_box_visible(self): |
55 | | - """ Check if both spinner box is visible after starting widget """ |
56 | | - self.assertEqual(self.spin_boxes[5].box.isHidden(), False) |
57 | | - self.assertEqual(self.spin_boxes[6].box.isHidden(), False) |
| 21 | + def setter(value): |
| 22 | + if value == gamma_spin.specialValueText(): |
| 23 | + gamma_spin.setValue(gamma_spin.minimum()) |
| 24 | + else: |
| 25 | + gamma_spin.setValue(value) |
58 | 26 |
|
59 | | - def test_optimization_box_checked(self): |
60 | | - """ Check if spinner box for iteration limit is enabled or disabled """ |
61 | | - for value in (True, False): |
62 | | - self.widget.max_iter_check_box.setChecked(value) |
63 | | - self.assertEqual(self.widget.max_iter_check_box.isChecked(), value) |
64 | | - self.assertEqual(self.spin_boxes[6].isEnabled(), value) |
| 27 | + self.parameters = [ |
| 28 | + ParameterMapping("C", self.widget.c_spin), |
| 29 | + ParameterMapping("gamma", self.widget._kernel_params[0], |
| 30 | + values=values, setter=setter, getter=getter), |
| 31 | + ParameterMapping("coef0", self.widget._kernel_params[1]), |
| 32 | + ParameterMapping("degree", self.widget._kernel_params[2]), |
| 33 | + ParameterMapping("tol", self.widget.tol_spin), |
| 34 | + ParameterMapping("max_iter", self.widget.max_iter_spin[1])] |
65 | 35 |
|
66 | | - def test_type_button_checked(self): |
67 | | - """ Check if SVM type is selected after click """ |
68 | | - self.widget.type_box.buttons[0].click() |
69 | | - self.assertEqual(self.widget.type_box.buttons[0].isChecked(), True) |
70 | | - self.widget.type_box.buttons[1].click() |
71 | | - self.assertEqual(self.widget.type_box.buttons[1].isChecked(), True) |
| 36 | + def test_parameters_unchecked(self): |
| 37 | + """Check learner and model for various values of all parameters |
| 38 | + when Iteration limit is not checked |
| 39 | + """ |
| 40 | + self.widget.max_iter_spin[0].setCheckState(False) |
| 41 | + self.parameters[-1] = DefaultParameterMapping("max_iter", -1) |
| 42 | + self.test_parameters() |
72 | 43 |
|
73 | | - def test_type_button_properties_visible(self): |
74 | | - """ Check if spinner box in SVM type are visible """ |
75 | | - self.assertEqual(not self.spin_boxes[0].isHidden(), True) |
76 | | - self.assertEqual(not self.spin_boxes[1].isHidden(), True) |
| 44 | + def test_parameters_svm_type(self): |
| 45 | + """Check learner and model for various values of all parameters |
| 46 | + when NuSVM is chosen |
| 47 | + """ |
| 48 | + self.assertEqual(self.widget.svmtype, OWSVMClassification.C_SVC) |
| 49 | + # setChecked(True) does not trigger callback event |
| 50 | + self.widget.nu_radio.click() |
| 51 | + self.assertEqual(self.widget.svmtype, OWSVMClassification.Nu_SVC) |
| 52 | + self.parameters[0] = ParameterMapping("nu", self.widget.nu_spin) |
| 53 | + self.test_parameters() |
77 | 54 |
|
78 | | - def test_data_before_apply(self): |
79 | | - """ Check if data are set """ |
80 | | - self.widget.set_data(Table("iris")[:100]) |
81 | | - self.widget.apply() |
82 | | - self.assertEqual(len(self.widget.data), 100) |
83 | | - |
84 | | - def test_output_signal_learner(self): |
85 | | - """ Check if we have on output learner """ |
86 | | - self.widget.kernel_box.buttons[0].click() |
87 | | - self.widget.set_data(Table("iris")[:100]) |
88 | | - self.widget.apply() |
89 | | - self.assertNotEqual(self.widget.learner, None) |
| 55 | + def test_kernel_equation(self): |
| 56 | + """Check if the right equation is written according to kernel """ |
| 57 | + for i in range(4): |
| 58 | + if self.widget.kernel_box.buttons[i].isChecked(): |
| 59 | + self.assertEqual(self.widget.kernel_eq, |
| 60 | + self.widget.kernels[i][1]) |
| 61 | + break |
| 62 | + for i in range(4): |
| 63 | + self.widget.kernel_box.buttons[i].click() |
| 64 | + self.assertEqual(self.widget.kernel_eq, self.widget.kernels[i][1]) |
90 | 65 |
|
91 | | - def test_output_params(self): |
92 | | - """ Check ouput params """ |
93 | | - self.widget.kernel_box.buttons[0].click() |
94 | | - self.widget.set_data(Table("iris")[:100]) |
95 | | - self.widget.max_iter_check_box.setChecked(True) |
96 | | - self.widget.apply() |
97 | | - self.widget.type_box.buttons[0].click() |
98 | | - params = self.widget.learner.params |
99 | | - self.assertEqual(params.get('C'), self.spin_boxes[0].value()) |
100 | | - self.widget.type_box.buttons[1].click() |
101 | | - params = self.widget.learner.params |
102 | | - self.assertEqual(params.get('nu'), self.spin_boxes[1].value()) |
103 | | - self.assertEqual(params.get('gamma'), self.spin_boxes[2].value()) |
104 | | - self.assertEqual(params.get('coef0'), self.spin_boxes[3].value()) |
105 | | - self.assertEqual(params.get('degree'), self.spin_boxes[4].value()) |
106 | | - self.assertEqual(params.get('tol'), self.spin_boxes[5].value()) |
107 | | - self.assertEqual(params.get('max_iter'), self.spin_boxes[6].value()) |
| 66 | + def test_kernel_spins(self): |
| 67 | + """Check if the right spins are visible according to kernel """ |
| 68 | + for i, hidden in enumerate([[True, True, True], |
| 69 | + [False, False, False], |
| 70 | + [False, True, True], |
| 71 | + [False, False, True]]): |
| 72 | + if self.widget.kernel_box.buttons[i].isChecked(): |
| 73 | + self.assertEqual([self.widget._kernel_params[j].box.isHidden() |
| 74 | + for j in range(3)], hidden) |
| 75 | + break |
| 76 | + for i, hidden in enumerate([[True, True, True], |
| 77 | + [False, False, False], |
| 78 | + [False, True, True], |
| 79 | + [False, False, True]]): |
| 80 | + self.widget.kernel_box.buttons[i].click() |
| 81 | + self.assertEqual([self.widget._kernel_params[j].box.isHidden() |
| 82 | + for j in range(3)], hidden) |
0 commit comments