|
4 | 4 | import copy |
5 | 5 | import numpy as np |
6 | 6 |
|
| 7 | +from AnyQt.QtWidgets import QToolTip |
| 8 | + |
7 | 9 | import Orange.data |
8 | 10 | import Orange.evaluation |
9 | 11 | import Orange.classification |
|
12 | 14 | from Orange.widgets.evaluate.owrocanalysis import OWROCAnalysis |
13 | 15 | from Orange.widgets.evaluate.tests.base import EvaluateTest |
14 | 16 | from Orange.widgets.tests.base import WidgetTest |
| 17 | +from Orange.widgets.tests.utils import mouseMove |
15 | 18 |
|
16 | 19 |
|
17 | 20 | class TestROC(unittest.TestCase): |
@@ -156,3 +159,60 @@ def test_nan_input(self): |
156 | 159 | self.assertTrue(self.widget.Error.invalid_results.is_shown()) |
157 | 160 | self.send_signal(self.widget.Inputs.evaluation_results, None) |
158 | 161 | self.assertFalse(self.widget.Error.invalid_results.is_shown()) |
| 162 | + |
| 163 | + def test_tooltips(self): |
| 164 | + data_in = Orange.data.Table("titanic") |
| 165 | + res = Orange.evaluation.TestOnTrainingData( |
| 166 | + data=data_in, |
| 167 | + learners=[Orange.classification.KNNLearner(), |
| 168 | + Orange.classification.LogisticRegressionLearner()], |
| 169 | + store_data=True |
| 170 | + ) |
| 171 | + |
| 172 | + self.send_signal(self.widget.Inputs.evaluation_results, res) |
| 173 | + self.widget.roc_averaging = OWROCAnalysis.Merge |
| 174 | + self.widget.target_index = 0 |
| 175 | + self.widget.selected_classifiers = [0, 1] |
| 176 | + vb = self.widget.plot.getViewBox() |
| 177 | + vb.childTransform() # Force pyqtgraph to update transforms |
| 178 | + |
| 179 | + curve = self.widget.plot_curves(self.widget.target_index, 0) |
| 180 | + curve_merge = curve.merge() |
| 181 | + view = self.widget.plotview |
| 182 | + item = curve_merge.curve_item # type: pg.PlotCurveItem |
| 183 | + |
| 184 | + # no tooltips to be shown |
| 185 | + pos = item.mapToScene(0.0, 1.0) |
| 186 | + pos = view.mapFromScene(pos) |
| 187 | + mouseMove(view.viewport(), pos) |
| 188 | + self.assertIs(self.widget._tooltip_cache, None) |
| 189 | + |
| 190 | + # test single point |
| 191 | + pos = item.mapToScene(0.22504, 0.45400) |
| 192 | + pos = view.mapFromScene(pos) |
| 193 | + mouseMove(view.viewport(), pos) |
| 194 | + shown_thresh = self.widget._tooltip_cache[1] |
| 195 | + self.assertTrue(QToolTip.isVisible()) |
| 196 | + np.testing.assert_almost_equal(shown_thresh, [0.40000], decimal=5) |
| 197 | + |
| 198 | + pos = item.mapToScene(0.0, 0.0) |
| 199 | + pos = view.mapFromScene(pos) |
| 200 | + # test overlapping points |
| 201 | + mouseMove(view.viewport(), pos) |
| 202 | + shown_thresh = self.widget._tooltip_cache[1] |
| 203 | + self.assertTrue(QToolTip.isVisible()) |
| 204 | + np.testing.assert_almost_equal(shown_thresh, [1.8, 1.89336], decimal=5) |
| 205 | + |
| 206 | + # test that cache is invalidated when changing averaging mode |
| 207 | + self.widget.roc_averaging = OWROCAnalysis.Threshold |
| 208 | + self.widget._replot() |
| 209 | + mouseMove(view.viewport(), pos) |
| 210 | + shown_thresh = self.widget._tooltip_cache[1] |
| 211 | + self.assertTrue(QToolTip.isVisible()) |
| 212 | + np.testing.assert_almost_equal(shown_thresh, [1, 1]) |
| 213 | + |
| 214 | + # test nan thresholds |
| 215 | + self.widget.roc_averaging = OWROCAnalysis.Vertical |
| 216 | + self.widget._replot() |
| 217 | + mouseMove(view.viewport(), pos) |
| 218 | + self.assertIs(self.widget._tooltip_cache, None) |
0 commit comments