diff options
Diffstat (limited to 'silx/gui/plot/test/testPlotWidget.py')
-rw-r--r-- | silx/gui/plot/test/testPlotWidget.py | 203 |
1 files changed, 179 insertions, 24 deletions
diff --git a/silx/gui/plot/test/testPlotWidget.py b/silx/gui/plot/test/testPlotWidget.py index dac6580..857b9bc 100644 --- a/silx/gui/plot/test/testPlotWidget.py +++ b/silx/gui/plot/test/testPlotWidget.py @@ -26,7 +26,7 @@ __authors__ = ["T. Vincent"] __license__ = "MIT" -__date__ = "24/04/2018" +__date__ = "21/09/2018" import unittest @@ -34,8 +34,8 @@ import logging import numpy from silx.utils.testutils import ParametricTestCase, parameterize -from silx.gui.test.utils import SignalListener -from silx.gui.test.utils import TestCaseQt +from silx.gui.utils.testutils import SignalListener +from silx.gui.utils.testutils import TestCaseQt from silx.utils import testutils from silx.utils import deprecation @@ -43,6 +43,7 @@ from silx.test.utils import test_options from silx.gui import qt from silx.gui.plot import PlotWidget +from silx.gui.plot.items.curve import CurveStyle from silx.gui.colors import Colormap from .utils import PlotWidgetTestCase @@ -118,6 +119,7 @@ class TestPlotWidget(PlotWidgetTestCase, ParametricTestCase): """Test resizing the widget and receiving limitsChanged events""" self.plot.resize(200, 200) self.qapp.processEvents() + self.qWait(100) xlim = self.plot.getXAxis().getLimits() ylim = self.plot.getYAxis().getLimits() @@ -129,18 +131,58 @@ class TestPlotWidget(PlotWidgetTestCase, ParametricTestCase): # Resize without aspect ratio self.plot.resize(200, 300) self.qapp.processEvents() + self.qWait(100) self._checkLimits(expectedXLim=xlim, expectedYLim=ylim) self.assertEqual(listener.callCount(), 0) # Resize with aspect ratio self.plot.setKeepDataAspectRatio(True) self.qapp.processEvents() + self.qWait(1000) listener.clear() # Clean-up received signal self.plot.resize(200, 200) self.qapp.processEvents() + self.qWait(100) self.assertNotEqual(listener.callCount(), 0) + def testAddRemoveItemSignals(self): + """Test sigItemAdded and sigItemAboutToBeRemoved""" + listener = SignalListener() + self.plot.sigItemAdded.connect(listener.partial('add')) + self.plot.sigItemAboutToBeRemoved.connect(listener.partial('remove')) + + self.plot.addCurve((1, 2, 3), (3, 2, 1), legend='curve') + self.assertEqual(listener.callCount(), 1) + + curve = self.plot.getCurve('curve') + self.plot.remove('curve') + self.assertEqual(listener.callCount(), 2) + self.assertEqual(listener.arguments(callIndex=0), ('add', curve)) + self.assertEqual(listener.arguments(callIndex=1), ('remove', curve)) + + def testGetItems(self): + """Test getItems method""" + curve_x = 1, 2 + self.plot.addCurve(curve_x, (3, 4)) + image = (0, 1), (2, 3) + self.plot.addImage(image) + scatter_x = 10, 11 + self.plot.addScatter(scatter_x, (12, 13), (0, 1)) + marker_pos = 5, 5 + self.plot.addMarker(*marker_pos) + marker_x = 6 + self.plot.addXMarker(marker_x) + self.plot.addItem((0, 5), (2, 10), shape='rectangle') + + items = self.plot.getItems() + self.assertEqual(len(items), 6) + self.assertTrue(numpy.all(numpy.equal(items[0].getXData(), curve_x))) + self.assertTrue(numpy.all(numpy.equal(items[1].getData(), image))) + self.assertTrue(numpy.all(numpy.equal(items[2].getXData(), scatter_x))) + self.assertTrue(numpy.all(numpy.equal(items[3].getPosition(), marker_pos))) + self.assertTrue(numpy.all(numpy.equal(items[4].getPosition()[0], marker_x))) + self.assertEqual(items[5].getType(), 'rectangle') class TestPlotImage(PlotWidgetTestCase, ParametricTestCase): """Basic tests for addImage""" @@ -270,10 +312,10 @@ class TestPlotImage(PlotWidgetTestCase, ParametricTestCase): self.plot.setKeepDataAspectRatio(True) xmin, xmax = self.plot.getXAxis().getLimits() ymin, ymax = self.plot.getYAxis().getLimits() - self.assertTrue(xmin <= min(xbounds)) - self.assertTrue(xmax >= max(xbounds)) - self.assertTrue(ymin <= min(ybounds)) - self.assertTrue(ymax >= max(ybounds)) + self.assertTrue(round(xmin, 7) <= min(xbounds)) + self.assertTrue(round(xmax, 7) >= max(xbounds)) + self.assertTrue(round(ymin, 7) <= min(ybounds)) + self.assertTrue(round(ymax, 7) >= max(ybounds)) self.plot.setKeepDataAspectRatio(False) # Reset aspect ratio self.plot.clear() @@ -390,8 +432,7 @@ class TestPlotCurve(PlotWidgetTestCase): self.plot.addCurve(self.xData, self.yData, legend="curve 2", replace=False, resetzoom=False, - color=color, symbol='o') - + color=color, symbol='o') class TestPlotMarker(PlotWidgetTestCase): """Basic tests for add*Marker""" @@ -562,7 +603,15 @@ class TestPlotItem(PlotWidgetTestCase): class TestPlotActiveCurveImage(PlotWidgetTestCase): - """Basic tests for active image handling""" + """Basic tests for active curve and image handling""" + xData = numpy.arange(1000) + yData = -500 + 100 * numpy.sin(xData) + xData2 = xData + 1000 + yData2 = xData - 1000 + 200 * numpy.random.random(1000) + + def tearDown(self): + self.plot.setActiveCurveHandling(False) + super(TestPlotActiveCurveImage, self).tearDown() def testActiveCurveAndLabels(self): # Active curve handling off, no label change @@ -589,6 +638,7 @@ class TestPlotActiveCurveImage(PlotWidgetTestCase): # labels changed as active curve self.plot.addCurve((1, 2), (1, 2), legend='1', xlabel='x1', ylabel='y1') + self.plot.setActiveCurve('1') self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') @@ -610,6 +660,110 @@ class TestPlotActiveCurveImage(PlotWidgetTestCase): self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') + def testPlotActiveCurveSelectionMode(self): + self.plot.clear() + self.plot.setActiveCurveHandling(True) + legend = "curve 1" + self.plot.addCurve(self.xData, self.yData, + legend=legend, + color="green") + + # active curve should be None + self.assertEqual(self.plot.getActiveCurve(just_legend=True), None) + + # active curve should be None when None is set as active curve + self.plot.setActiveCurve(legend) + current = self.plot.getActiveCurve(just_legend=True) + self.assertEqual(current, legend) + self.plot.setActiveCurve(None) + current = self.plot.getActiveCurve(just_legend=True) + self.assertEqual(current, None) + + # testing it automatically toggles if there is only one + self.plot.setActiveCurveSelectionMode("legacy") + current = self.plot.getActiveCurve(just_legend=True) + self.assertEqual(current, legend) + + # active curve should not change when None set as active curve + self.assertEqual(self.plot.getActiveCurveSelectionMode(), "legacy") + self.plot.setActiveCurve(None) + current = self.plot.getActiveCurve(just_legend=True) + self.assertEqual(current, legend) + + # situation where no curve is active + self.plot.clear() + self.plot.setActiveCurveHandling(True) + self.assertEqual(self.plot.getActiveCurveSelectionMode(), "atmostone") + self.plot.addCurve(self.xData, self.yData, + legend=legend, + color="green") + self.assertEqual(self.plot.getActiveCurve(just_legend=True), None) + self.plot.addCurve(self.xData2, self.yData2, + legend="curve 2", + color="red") + self.assertEqual(self.plot.getActiveCurve(just_legend=True), None) + self.plot.setActiveCurveSelectionMode("legacy") + self.assertEqual(self.plot.getActiveCurve(just_legend=True), None) + + # the first curve added should be active + self.plot.clear() + self.plot.addCurve(self.xData, self.yData, + legend=legend, + color="green") + self.assertEqual(self.plot.getActiveCurve(just_legend=True), legend) + self.plot.addCurve(self.xData2, self.yData2, + legend="curve 2", + color="red") + self.assertEqual(self.plot.getActiveCurve(just_legend=True), legend) + + def testActiveCurveStyle(self): + """Test change of active curve style""" + self.plot.setActiveCurveHandling(True) + self.plot.setActiveCurveStyle(color='black') + style = self.plot.getActiveCurveStyle() + self.assertEqual(style.getColor(), (0., 0., 0., 1.)) + self.assertIsNone(style.getLineStyle()) + self.assertIsNone(style.getLineWidth()) + self.assertIsNone(style.getSymbol()) + self.assertIsNone(style.getSymbolSize()) + + self.plot.addCurve(x=self.xData, y=self.yData, legend="curve1") + curve = self.plot.getCurve("curve1") + curve.setColor('blue') + curve.setLineStyle('-') + curve.setLineWidth(1) + curve.setSymbol('o') + curve.setSymbolSize(5) + + # Check default current style + defaultStyle = curve.getCurrentStyle() + self.assertEqual(defaultStyle, CurveStyle(color='blue', + linestyle='-', + linewidth=1, + symbol='o', + symbolsize=5)) + + # Activate curve with highlight color=black + self.plot.setActiveCurve("curve1") + style = curve.getCurrentStyle() + self.assertEqual(style.getColor(), (0., 0., 0., 1.)) + self.assertEqual(style.getLineStyle(), '-') + self.assertEqual(style.getLineWidth(), 1) + self.assertEqual(style.getSymbol(), 'o') + self.assertEqual(style.getSymbolSize(), 5) + + # Change highlight to linewidth=2 + self.plot.setActiveCurveStyle(linewidth=2) + style = curve.getCurrentStyle() + self.assertEqual(style.getColor(), (0., 0., 1., 1.)) + self.assertEqual(style.getLineStyle(), '-') + self.assertEqual(style.getLineWidth(), 2) + self.assertEqual(style.getSymbol(), 'o') + self.assertEqual(style.getSymbolSize(), 5) + + self.plot.setActiveCurve(None) + self.assertEqual(curve.getCurrentStyle(), defaultStyle) + def testActiveImageAndLabels(self): # Active image handling always on, no API for toggling it self.plot.getXAxis().setLabel('XLabel') @@ -881,7 +1035,7 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): self.plot.getYAxis(axis="right").sigLimitsChanged.connect(listener.partial(axis="y2")) self.plot.setLimits(0, 1, 0, 1, 0, 1) # at least one event per axis - self.assertEquals(len(set(listener.karguments(argumentName="axis"))), 3) + self.assertEqual(len(set(listener.karguments(argumentName="axis"))), 3) def testLimitsChanged_resetZoom(self): self.plot.addCurve(self.xData, self.yData, @@ -894,7 +1048,7 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): self.plot.getYAxis(axis="right").sigLimitsChanged.connect(listener.partial(axis="y2")) self.plot.resetZoom() # at least one event per axis - self.assertEquals(len(set(listener.karguments(argumentName="axis"))), 3) + self.assertEqual(len(set(listener.karguments(argumentName="axis"))), 3) def testLimitsChanged_setXLimit(self): self.plot.addCurve(self.xData, self.yData, @@ -906,8 +1060,8 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): axis.sigLimitsChanged.connect(listener) axis.setLimits(20, 30) # at least one event per axis - self.assertEquals(listener.arguments(callIndex=-1), (20.0, 30.0)) - self.assertEquals(axis.getLimits(), (20.0, 30.0)) + self.assertEqual(listener.arguments(callIndex=-1), (20.0, 30.0)) + self.assertEqual(axis.getLimits(), (20.0, 30.0)) def testLimitsChanged_setYLimit(self): self.plot.addCurve(self.xData, self.yData, @@ -919,8 +1073,8 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): axis.sigLimitsChanged.connect(listener) axis.setLimits(20, 30) # at least one event per axis - self.assertEquals(listener.arguments(callIndex=-1), (20.0, 30.0)) - self.assertEquals(axis.getLimits(), (20.0, 30.0)) + self.assertEqual(listener.arguments(callIndex=-1), (20.0, 30.0)) + self.assertEqual(axis.getLimits(), (20.0, 30.0)) def testLimitsChanged_setYRightLimit(self): self.plot.addCurve(self.xData, self.yData, @@ -932,8 +1086,8 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): axis.sigLimitsChanged.connect(listener) axis.setLimits(20, 30) # at least one event per axis - self.assertEquals(listener.arguments(callIndex=-1), (20.0, 30.0)) - self.assertEquals(axis.getLimits(), (20.0, 30.0)) + self.assertEqual(listener.arguments(callIndex=-1), (20.0, 30.0)) + self.assertEqual(axis.getLimits(), (20.0, 30.0)) def testScaleProxy(self): listener = SignalListener() @@ -943,9 +1097,9 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): yright.sigScaleChanged.connect(listener.partial("right")) yright.setScale(yright.LOGARITHMIC) - self.assertEquals(y.getScale(), y.LOGARITHMIC) + self.assertEqual(y.getScale(), y.LOGARITHMIC) events = listener.arguments() - self.assertEquals(len(events), 2) + self.assertEqual(len(events), 2) self.assertIn(("left", y.LOGARITHMIC), events) self.assertIn(("right", y.LOGARITHMIC), events) @@ -957,9 +1111,9 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): yright.sigAutoScaleChanged.connect(listener.partial("right")) yright.setAutoScale(False) - self.assertEquals(y.isAutoScale(), False) + self.assertEqual(y.isAutoScale(), False) events = listener.arguments() - self.assertEquals(len(events), 2) + self.assertEqual(len(events), 2) self.assertIn(("left", False), events) self.assertIn(("right", False), events) @@ -971,9 +1125,9 @@ class TestPlotAxes(TestCaseQt, ParametricTestCase): yright.sigInvertedChanged.connect(listener.partial("right")) yright.setInverted(True) - self.assertEquals(y.isInverted(), True) + self.assertEqual(y.isInverted(), True) events = listener.arguments() - self.assertEquals(len(events), 2) + self.assertEqual(len(events), 2) self.assertIn(("left", True), events) self.assertIn(("right", True), events) @@ -1363,6 +1517,7 @@ class TestPlotItemLog(PlotWidgetTestCase): def suite(): testClasses = (TestPlotWidget, TestPlotImage, TestPlotCurve, TestPlotMarker, TestPlotItem, TestPlotAxes, + TestPlotActiveCurveImage, TestPlotEmptyLog, TestPlotCurveLog, TestPlotImageLog, TestPlotMarkerLog, TestPlotItemLog) |