diff options
Diffstat (limited to 'silx/gui/plot/test/testPlotWidget.py')
-rw-r--r-- | silx/gui/plot/test/testPlotWidget.py | 775 |
1 files changed, 582 insertions, 193 deletions
diff --git a/silx/gui/plot/test/testPlotWidget.py b/silx/gui/plot/test/testPlotWidget.py index 2de18a8..deeb198 100644 --- a/silx/gui/plot/test/testPlotWidget.py +++ b/silx/gui/plot/test/testPlotWidget.py @@ -1,7 +1,7 @@ # coding: utf-8 # /*########################################################################## # -# Copyright (c) 2016 European Synchrotron Radiation Facility +# Copyright (c) 2016-2017 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -26,18 +26,24 @@ __authors__ = ["T. Vincent"] __license__ = "MIT" -__date__ = "05/12/2016" +__date__ = "01/09/2017" import unittest - +import logging import numpy from silx.test.utils import ParametricTestCase +from silx.gui.test.utils import SignalListener from silx.gui.test.utils import TestCaseQt +from silx.test import utils +from silx.utils import deprecation from silx.gui import qt from silx.gui.plot import PlotWidget +from silx.gui.plot.Colormap import Colormap + +from .utils import PlotWidgetTestCase SIZE = 1024 @@ -47,27 +53,10 @@ DATA_2D = numpy.arange(SIZE ** 2).reshape(SIZE, SIZE) """Image data set""" -class _PlotWidgetTest(TestCaseQt): - """Base class for tests of PlotWidget, not a TestCase in itself. - - plot attribute is the PlotWidget created for the test. - """ - - def setUp(self): - super(_PlotWidgetTest, self).setUp() - self.plot = PlotWidget() - self.plot.show() - self.qWaitForWindowExposed(self.plot) - - def tearDown(self): - self.qapp.processEvents() - self.plot.setAttribute(qt.Qt.WA_DeleteOnClose) - self.plot.close() - del self.plot - super(_PlotWidgetTest, self).tearDown() +logger = logging.getLogger(__name__) -class TestPlotWidget(_PlotWidgetTest, ParametricTestCase): +class TestPlotWidget(PlotWidgetTestCase, ParametricTestCase): """Basic tests for PlotWidget""" def testShow(self): @@ -79,77 +68,115 @@ class TestPlotWidget(_PlotWidgetTest, ParametricTestCase): title, xlabel, ylabel = 'the title', 'x label', 'y label' self.plot.setGraphTitle(title) - self.plot.setGraphXLabel(xlabel) - self.plot.setGraphYLabel(ylabel) + self.plot.getXAxis().setLabel(xlabel) + self.plot.getYAxis().setLabel(ylabel) self.qapp.processEvents() self.assertEqual(self.plot.getGraphTitle(), title) - self.assertEqual(self.plot.getGraphXLabel(), xlabel) - self.assertEqual(self.plot.getGraphYLabel(), ylabel) + self.assertEqual(self.plot.getXAxis().getLabel(), xlabel) + self.assertEqual(self.plot.getYAxis().getLabel(), ylabel) - def testChangeLimitsWithAspectRatio(self): - def checkLimits(expectedXLim=None, expectedYLim=None, - expectedRatio=None): - xlim = self.plot.getGraphXLimits() - ylim = self.plot.getGraphYLimits() - ratio = abs(xlim[1] - xlim[0]) / abs(ylim[1] - ylim[0]) + def _checkLimits(self, + expectedXLim=None, + expectedYLim=None, + expectedRatio=None): + """Assert that limits are as expected""" + xlim = self.plot.getXAxis().getLimits() + ylim = self.plot.getYAxis().getLimits() + ratio = abs(xlim[1] - xlim[0]) / abs(ylim[1] - ylim[0]) - if expectedXLim is not None: - self.assertEqual(expectedXLim, xlim) + if expectedXLim is not None: + self.assertEqual(expectedXLim, xlim) - if expectedYLim is not None: - self.assertEqual(expectedYLim, ylim) + if expectedYLim is not None: + self.assertEqual(expectedYLim, ylim) - if expectedRatio is not None: - self.assertTrue( - numpy.allclose(expectedRatio, ratio, atol=0.01)) + if expectedRatio is not None: + self.assertTrue( + numpy.allclose(expectedRatio, ratio, atol=0.01)) + def testChangeLimitsWithAspectRatio(self): self.plot.setKeepDataAspectRatio() self.qapp.processEvents() - xlim = self.plot.getGraphXLimits() - ylim = self.plot.getGraphYLimits() + xlim = self.plot.getXAxis().getLimits() + ylim = self.plot.getYAxis().getLimits() defaultRatio = abs(xlim[1] - xlim[0]) / abs(ylim[1] - ylim[0]) - self.plot.setGraphXLimits(1., 10.) - checkLimits(expectedXLim=(1., 10.), expectedRatio=defaultRatio) + self.plot.getXAxis().setLimits(1., 10.) + self._checkLimits(expectedXLim=(1., 10.), expectedRatio=defaultRatio) + self.qapp.processEvents() + self._checkLimits(expectedXLim=(1., 10.), expectedRatio=defaultRatio) + + self.plot.getYAxis().setLimits(1., 10.) + self._checkLimits(expectedYLim=(1., 10.), expectedRatio=defaultRatio) self.qapp.processEvents() - checkLimits(expectedXLim=(1., 10.), expectedRatio=defaultRatio) + self._checkLimits(expectedYLim=(1., 10.), expectedRatio=defaultRatio) - self.plot.setGraphYLimits(1., 10.) - checkLimits(expectedYLim=(1., 10.), expectedRatio=defaultRatio) + def testResizeWidget(self): + """Test resizing the widget and receiving limitsChanged events""" + self.plot.resize(200, 200) self.qapp.processEvents() - checkLimits(expectedYLim=(1., 10.), expectedRatio=defaultRatio) + xlim = self.plot.getXAxis().getLimits() + ylim = self.plot.getYAxis().getLimits() -class TestPlotImage(_PlotWidgetTest, ParametricTestCase): + listener = SignalListener() + self.plot.getXAxis().sigLimitsChanged.connect(listener.partial('x')) + self.plot.getYAxis().sigLimitsChanged.connect(listener.partial('y')) + + # Resize without aspect ratio + self.plot.resize(200, 300) + self.qapp.processEvents() + self._checkLimits(expectedXLim=xlim, expectedYLim=ylim) + self.assertEqual(listener.callCount(), 0) + + # Resize with aspect ratio + self.plot.setKeepDataAspectRatio(True) + listener.clear() # Clean-up received signal + self.qapp.processEvents() + self.assertEqual(listener.callCount(), 0) # No event when redrawing + + self.plot.resize(200, 200) + self.qapp.processEvents() + + self.assertNotEqual(listener.callCount(), 0) + + +class TestPlotImage(PlotWidgetTestCase, ParametricTestCase): """Basic tests for addImage""" def setUp(self): super(TestPlotImage, self).setUp() - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') def testPlotColormapTemperature(self): self.plot.setGraphTitle('Temp. Linear') - colormap = {'name': 'temperature', 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='temperature', + normalization='linear', + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", colormap=colormap) def testPlotColormapGray(self): self.plot.setKeepDataAspectRatio(False) self.plot.setGraphTitle('Gray Linear') - colormap = {'name': 'gray', 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='gray', + normalization='linear', + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", colormap=colormap) def testPlotColormapTemperatureLog(self): self.plot.setGraphTitle('Temp. Log') - colormap = {'name': 'temperature', 'normalization': 'log', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='temperature', + normalization=Colormap.LOGARITHM, + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", colormap=colormap) def testPlotRgbRgba(self): @@ -180,19 +207,23 @@ class TestPlotImage(_PlotWidgetTest, ParametricTestCase): self.plot.setKeepDataAspectRatio(False) self.plot.setGraphTitle('Custom colormap') - colormap = {'name': None, 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0, - 'colors': ((0., 0., 0.), (1., 0., 0.), - (0., 1., 0.), (0., 0., 1.))} + colormap = Colormap(name=None, + normalization=Colormap.LINEAR, + vmin=None, + vmax=None, + colors=((0., 0., 0.), (1., 0., 0.), + (0., 1., 0.), (0., 0., 1.))) self.plot.addImage(DATA_2D, legend="image 1", colormap=colormap, replace=False, resetzoom=False) - colormap = {'name': None, 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0, - 'colors': numpy.array( - ((0, 0, 0, 0), (0, 0, 0, 128), - (128, 128, 128, 128), (255, 255, 255, 255)), - dtype=numpy.uint8)} + colormap = Colormap(name=None, + normalization=Colormap.LINEAR, + vmin=None, + vmax=None, + colors=numpy.array( + ((0, 0, 0, 0), (0, 0, 0, 128), + (128, 128, 128, 128), (255, 255, 255, 255)), + dtype=numpy.uint8)) self.plot.addImage(DATA_2D, legend="image 2", colormap=colormap, origin=(DATA_2D.shape[0], 0), replace=False, resetzoom=False) @@ -228,8 +259,8 @@ class TestPlotImage(_PlotWidgetTest, ParametricTestCase): ybounds = oy, oy + DATA_2D.shape[0] * sy # Check limits without aspect ratio - xmin, xmax = self.plot.getGraphXLimits() - ymin, ymax = self.plot.getGraphYLimits() + xmin, xmax = self.plot.getXAxis().getLimits() + ymin, ymax = self.plot.getYAxis().getLimits() self.assertEqual(xmin, min(xbounds)) self.assertEqual(xmax, max(xbounds)) self.assertEqual(ymin, min(ybounds)) @@ -237,8 +268,8 @@ class TestPlotImage(_PlotWidgetTest, ParametricTestCase): # Check limits with aspect ratio self.plot.setKeepDataAspectRatio(True) - xmin, xmax = self.plot.getGraphXLimits() - ymin, ymax = self.plot.getGraphYLimits() + 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)) @@ -248,8 +279,42 @@ class TestPlotImage(_PlotWidgetTest, ParametricTestCase): self.plot.clear() self.plot.resetZoom() + def testPlotColormapDictAPI(self): + """Test that the addImage API using a colormap dictionary is still + working""" + self.plot.setGraphTitle('Temp. Log') + + colormap = { + 'name': 'temperature', + 'normalization': 'log', + 'vmin': None, + 'vmax': None + } + self.plot.addImage(DATA_2D, legend="image 1", colormap=colormap) + + def testPlotComplexImage(self): + """Test that a complex image is displayed as its absolute value.""" + data = numpy.linspace(1, 1j, 100).reshape(10, 10) + self.plot.addImage(data, legend='complex') + + image = self.plot.getActiveImage() + retrievedData = image.getData(copy=False) + self.assertTrue( + numpy.all(numpy.equal(retrievedData, numpy.absolute(data)))) + + def testPlotBooleanImage(self): + """Test that a boolean image is displayed and converted to int8.""" + data = numpy.zeros((10, 10), dtype=numpy.bool) + data[::2, ::2] = True + self.plot.addImage(data, legend='boolean') -class TestPlotCurve(_PlotWidgetTest): + image = self.plot.getActiveImage() + retrievedData = image.getData(copy=False) + self.assertTrue(numpy.all(numpy.equal(retrievedData, data))) + self.assertIs(retrievedData.dtype.type, numpy.int8) + + +class TestPlotCurve(PlotWidgetTestCase): """Basic tests for addCurve.""" # Test data sets @@ -261,8 +326,8 @@ class TestPlotCurve(_PlotWidgetTest): def setUp(self): super(TestPlotCurve, self).setUp() self.plot.setGraphTitle('Curve') - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') self.plot.setActiveCurveHandling(False) @@ -307,16 +372,16 @@ class TestPlotCurve(_PlotWidgetTest): self.plot.resetZoom() -class TestPlotMarker(_PlotWidgetTest): +class TestPlotMarker(PlotWidgetTestCase): """Basic tests for add*Marker""" def setUp(self): super(TestPlotMarker, self).setUp() - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') - self.plot.setXAxisAutoScale(False) - self.plot.setYAxisAutoScale(False) + self.plot.getXAxis().setAutoScale(False) + self.plot.getYAxis().setAutoScale(False) self.plot.setKeepDataAspectRatio(False) self.plot.setLimits(0., 100., -100., 100.) @@ -382,7 +447,7 @@ class TestPlotMarker(_PlotWidgetTest): def testPlotMarkerWithoutLegend(self): self.plot.setGraphTitle('Markers without legend') - self.plot.setYAxisInverted(True) + self.plot.getYAxis().setInverted(True) # Markers without legend self.plot.addMarker(10, 10) @@ -401,7 +466,7 @@ class TestPlotMarker(_PlotWidgetTest): # TestPlotItem ################################################################ -class TestPlotItem(_PlotWidgetTest): +class TestPlotItem(PlotWidgetTestCase): """Basic tests for addItem.""" # Polygon coordinates and color @@ -431,10 +496,10 @@ class TestPlotItem(_PlotWidgetTest): def setUp(self): super(TestPlotItem, self).setUp() - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') - self.plot.setXAxisAutoScale(False) - self.plot.setYAxisAutoScale(False) + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') + self.plot.getXAxis().setAutoScale(False) + self.plot.getYAxis().setAutoScale(False) self.plot.setKeepDataAspectRatio(False) self.plot.setLimits(0., 100., -100., 100.) @@ -475,102 +540,428 @@ class TestPlotItem(_PlotWidgetTest): self.plot.resetZoom() -class TestPlotActiveCurveImage(_PlotWidgetTest): +class TestPlotActiveCurveImage(PlotWidgetTestCase): """Basic tests for active image handling""" def testActiveCurveAndLabels(self): # Active curve handling off, no label change self.plot.setActiveCurveHandling(False) - self.plot.setGraphXLabel('XLabel') - self.plot.setGraphYLabel('YLabel') + self.plot.getXAxis().setLabel('XLabel') + self.plot.getYAxis().setLabel('YLabel') self.plot.addCurve((1, 2), (1, 2)) - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') self.plot.addCurve((1, 2), (2, 3), xlabel='x1', ylabel='y1') - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') self.plot.clear() - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') # Active curve handling on, label changes self.plot.setActiveCurveHandling(True) - self.plot.setGraphXLabel('XLabel') - self.plot.setGraphYLabel('YLabel') + self.plot.getXAxis().setLabel('XLabel') + self.plot.getYAxis().setLabel('YLabel') # labels changed as active curve self.plot.addCurve((1, 2), (1, 2), legend='1', xlabel='x1', ylabel='y1') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') # labels not changed as not active curve self.plot.addCurve((1, 2), (2, 3), legend='2') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') # labels changed self.plot.setActiveCurve('2') - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') self.plot.setActiveCurve('1') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') self.plot.clear() - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') def testActiveImageAndLabels(self): # Active image handling always on, no API for toggling it - self.plot.setGraphXLabel('XLabel') - self.plot.setGraphYLabel('YLabel') + self.plot.getXAxis().setLabel('XLabel') + self.plot.getYAxis().setLabel('YLabel') # labels changed as active curve self.plot.addImage(numpy.arange(100).reshape(10, 10), replace=False, legend='1', xlabel='x1', ylabel='y1') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') # labels not changed as not active curve self.plot.addImage(numpy.arange(100).reshape(10, 10), replace=False, legend='2') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') # labels changed self.plot.setActiveImage('2') - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') self.plot.setActiveImage('1') - self.assertEqual(self.plot.getGraphXLabel(), 'x1') - self.assertEqual(self.plot.getGraphYLabel(), 'y1') + self.assertEqual(self.plot.getXAxis().getLabel(), 'x1') + self.assertEqual(self.plot.getYAxis().getLabel(), 'y1') self.plot.clear() - self.assertEqual(self.plot.getGraphXLabel(), 'XLabel') - self.assertEqual(self.plot.getGraphYLabel(), 'YLabel') + self.assertEqual(self.plot.getXAxis().getLabel(), 'XLabel') + self.assertEqual(self.plot.getYAxis().getLabel(), 'YLabel') ############################################################################## # Log ############################################################################## -class TestPlotEmptyLog(_PlotWidgetTest): +class TestPlotEmptyLog(PlotWidgetTestCase): """Basic tests for log plot""" def testEmptyPlotTitleLabelsLog(self): self.plot.setGraphTitle('Empty Log Log') - self.plot.setGraphXLabel('X') - self.plot.setGraphYLabel('Y') + self.plot.getXAxis().setLabel('X') + self.plot.getYAxis().setLabel('Y') + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) + self.plot.resetZoom() + + +class TestPlotAxes(TestCaseQt, ParametricTestCase): + + # Test data + xData = numpy.arange(1, 10) + yData = xData ** 2 + + def setUp(self): + super(TestPlotAxes, self).setUp() + self.plot = PlotWidget() + # It is not needed to display the plot + # It saves a lot of time + # self.plot.show() + # self.qWaitForWindowExposed(self.plot) + + def tearDown(self): + self.qapp.processEvents() + self.plot.setAttribute(qt.Qt.WA_DeleteOnClose) + self.plot.close() + del self.plot + super(TestPlotAxes, self).tearDown() + + def testDefaultAxes(self): + axis = self.plot.getXAxis() + self.assertEqual(axis.getScale(), axis.LINEAR) + axis = self.plot.getYAxis() + self.assertEqual(axis.getScale(), axis.LINEAR) + axis = self.plot.getYAxis(axis="right") + self.assertEqual(axis.getScale(), axis.LINEAR) + + def testOldPlotAxis_getterSetter(self): + """Test silx API prior to silx 0.6""" + x = self.plot.getXAxis() + y = self.plot.getYAxis() + p = self.plot + + tests = [ + # setters + (p.setGraphXLimits, (10, 20), x.getLimits, (10, 20)), + (p.setGraphYLimits, (10, 20), y.getLimits, (10, 20)), + (p.setGraphXLabel, "foox", x.getLabel, "foox"), + (p.setGraphYLabel, "fooy", y.getLabel, "fooy"), + (p.setYAxisInverted, True, y.isInverted, True), + (p.setXAxisLogarithmic, True, x.getScale, x.LOGARITHMIC), + (p.setYAxisLogarithmic, True, y.getScale, y.LOGARITHMIC), + (p.setXAxisAutoScale, False, x.isAutoScale, False), + (p.setYAxisAutoScale, False, y.isAutoScale, False), + # getters + (x.setLimits, (11, 20), p.getGraphXLimits, (11, 20)), + (y.setLimits, (11, 20), p.getGraphYLimits, (11, 20)), + (x.setLabel, "fooxx", p.getGraphXLabel, "fooxx"), + (y.setLabel, "fooyy", p.getGraphYLabel, "fooyy"), + (y.setInverted, False, p.isYAxisInverted, False), + (x.setScale, x.LINEAR, p.isXAxisLogarithmic, False), + (y.setScale, y.LINEAR, p.isYAxisLogarithmic, False), + (x.setAutoScale, True, p.isXAxisAutoScale, True), + (y.setAutoScale, True, p.isYAxisAutoScale, True), + ] + for testCase in tests: + setter, value, getter, expected = testCase + with self.subTest(): + if setter is not None: + if not isinstance(value, tuple): + value = (value, ) + setter(*value) + if getter is not None: + self.assertEqual(getter(), expected) + + @utils.test_logging(deprecation.depreclog.name, warning=2) + def testOldPlotAxis_Logarithmic(self): + """Test silx API prior to silx 0.6""" + x = self.plot.getXAxis() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + + listener = SignalListener() + self.plot.sigSetXAxisLogarithmic.connect(listener.partial("x")) + self.plot.sigSetYAxisLogarithmic.connect(listener.partial("y")) + + self.assertEqual(x.getScale(), x.LINEAR) + self.assertEqual(y.getScale(), x.LINEAR) + self.assertEqual(yright.getScale(), x.LINEAR) + self.plot.setXAxisLogarithmic(True) + self.assertEqual(x.getScale(), x.LOGARITHMIC) + self.assertEqual(y.getScale(), x.LINEAR) + self.assertEqual(yright.getScale(), x.LINEAR) + self.assertEqual(self.plot.isXAxisLogarithmic(), True) + self.assertEqual(self.plot.isYAxisLogarithmic(), False) + self.assertEqual(listener.arguments(callIndex=-1), ("x", True)) + self.plot.setYAxisLogarithmic(True) - self.plot.resetZoom() + self.assertEqual(x.getScale(), x.LOGARITHMIC) + self.assertEqual(y.getScale(), x.LOGARITHMIC) + self.assertEqual(yright.getScale(), x.LOGARITHMIC) + self.assertEqual(self.plot.isXAxisLogarithmic(), True) + self.assertEqual(self.plot.isYAxisLogarithmic(), True) + self.assertEqual(listener.arguments(callIndex=-1), ("y", True)) + + yright.setScale(yright.LINEAR) + self.assertEqual(x.getScale(), x.LOGARITHMIC) + self.assertEqual(y.getScale(), x.LINEAR) + self.assertEqual(yright.getScale(), x.LINEAR) + self.assertEqual(self.plot.isXAxisLogarithmic(), True) + self.assertEqual(self.plot.isYAxisLogarithmic(), False) + self.assertEqual(listener.arguments(callIndex=-1), ("y", False)) + + @utils.test_logging(deprecation.depreclog.name, warning=2) + def testOldPlotAxis_AutoScale(self): + """Test silx API prior to silx 0.6""" + x = self.plot.getXAxis() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + + listener = SignalListener() + self.plot.sigSetXAxisAutoScale.connect(listener.partial("x")) + self.plot.sigSetYAxisAutoScale.connect(listener.partial("y")) + + self.assertEqual(x.isAutoScale(), True) + self.assertEqual(y.isAutoScale(), True) + self.assertEqual(yright.isAutoScale(), True) + + self.plot.setXAxisAutoScale(False) + self.assertEqual(x.isAutoScale(), False) + self.assertEqual(y.isAutoScale(), True) + self.assertEqual(yright.isAutoScale(), True) + self.assertEqual(self.plot.isXAxisAutoScale(), False) + self.assertEqual(self.plot.isYAxisAutoScale(), True) + self.assertEqual(listener.arguments(callIndex=-1), ("x", False)) + + self.plot.setYAxisAutoScale(False) + self.assertEqual(x.isAutoScale(), False) + self.assertEqual(y.isAutoScale(), False) + self.assertEqual(yright.isAutoScale(), False) + self.assertEqual(self.plot.isXAxisAutoScale(), False) + self.assertEqual(self.plot.isYAxisAutoScale(), False) + self.assertEqual(listener.arguments(callIndex=-1), ("y", False)) + + yright.setAutoScale(True) + self.assertEqual(x.isAutoScale(), False) + self.assertEqual(y.isAutoScale(), True) + self.assertEqual(yright.isAutoScale(), True) + self.assertEqual(self.plot.isXAxisAutoScale(), False) + self.assertEqual(self.plot.isYAxisAutoScale(), True) + self.assertEqual(listener.arguments(callIndex=-1), ("y", True)) + + @utils.test_logging(deprecation.depreclog.name, warning=1) + def testOldPlotAxis_Inverted(self): + """Test silx API prior to silx 0.6""" + x = self.plot.getXAxis() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + + listener = SignalListener() + self.plot.sigSetYAxisInverted.connect(listener.partial("y")) + + self.assertEqual(x.isInverted(), False) + self.assertEqual(y.isInverted(), False) + self.assertEqual(yright.isInverted(), False) + + self.plot.setYAxisInverted(True) + self.assertEqual(x.isInverted(), False) + self.assertEqual(y.isInverted(), True) + self.assertEqual(yright.isInverted(), True) + self.assertEqual(self.plot.isYAxisInverted(), True) + self.assertEqual(listener.arguments(callIndex=-1), ("y", True)) + + yright.setInverted(False) + self.assertEqual(x.isInverted(), False) + self.assertEqual(y.isInverted(), False) + self.assertEqual(yright.isInverted(), False) + self.assertEqual(self.plot.isYAxisInverted(), False) + self.assertEqual(listener.arguments(callIndex=-1), ("y", False)) + + def testLogXWithData(self): + self.plot.setGraphTitle('Curve X: Log Y: Linear') + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=True, + color='green', linestyle="-", symbol='o') + axis = self.plot.getXAxis() + axis.setScale(axis.LOGARITHMIC) + + self.assertEqual(axis.getScale(), axis.LOGARITHMIC) + + def testLogYWithData(self): + self.plot.setGraphTitle('Curve X: Linear Y: Log') + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=True, + color='green', linestyle="-", symbol='o') + axis = self.plot.getYAxis() + axis.setScale(axis.LOGARITHMIC) + self.assertEqual(axis.getScale(), axis.LOGARITHMIC) + axis = self.plot.getYAxis(axis="right") + self.assertEqual(axis.getScale(), axis.LOGARITHMIC) -class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): + def testLogYRightWithData(self): + self.plot.setGraphTitle('Curve X: Linear Y: Log') + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=True, + color='green', linestyle="-", symbol='o') + axis = self.plot.getYAxis(axis="right") + axis.setScale(axis.LOGARITHMIC) + + self.assertEqual(axis.getScale(), axis.LOGARITHMIC) + axis = self.plot.getYAxis() + self.assertEqual(axis.getScale(), axis.LOGARITHMIC) + + def testLimitsChanged_setLimits(self): + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=False, + color='green', linestyle="-", symbol='o') + listener = SignalListener() + self.plot.getXAxis().sigLimitsChanged.connect(listener.partial(axis="x")) + self.plot.getYAxis().sigLimitsChanged.connect(listener.partial(axis="y")) + 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) + + def testLimitsChanged_resetZoom(self): + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=False, + color='green', linestyle="-", symbol='o') + listener = SignalListener() + self.plot.getXAxis().sigLimitsChanged.connect(listener.partial(axis="x")) + self.plot.getYAxis().sigLimitsChanged.connect(listener.partial(axis="y")) + 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) + + def testLimitsChanged_setXLimit(self): + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=False, + color='green', linestyle="-", symbol='o') + listener = SignalListener() + axis = self.plot.getXAxis() + 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)) + + def testLimitsChanged_setYLimit(self): + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=False, + color='green', linestyle="-", symbol='o') + listener = SignalListener() + axis = self.plot.getYAxis() + 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)) + + def testLimitsChanged_setYRightLimit(self): + self.plot.addCurve(self.xData, self.yData, + legend="curve", + replace=False, resetzoom=False, + color='green', linestyle="-", symbol='o') + listener = SignalListener() + axis = self.plot.getYAxis(axis="right") + 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)) + + def testScaleProxy(self): + listener = SignalListener() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + y.sigScaleChanged.connect(listener.partial("left")) + yright.sigScaleChanged.connect(listener.partial("right")) + yright.setScale(yright.LOGARITHMIC) + + self.assertEquals(y.getScale(), y.LOGARITHMIC) + events = listener.arguments() + self.assertEquals(len(events), 2) + self.assertIn(("left", y.LOGARITHMIC), events) + self.assertIn(("right", y.LOGARITHMIC), events) + + def testAutoScaleProxy(self): + listener = SignalListener() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + y.sigAutoScaleChanged.connect(listener.partial("left")) + yright.sigAutoScaleChanged.connect(listener.partial("right")) + yright.setAutoScale(False) + + self.assertEquals(y.isAutoScale(), False) + events = listener.arguments() + self.assertEquals(len(events), 2) + self.assertIn(("left", False), events) + self.assertIn(("right", False), events) + + def testInvertedProxy(self): + listener = SignalListener() + y = self.plot.getYAxis() + yright = self.plot.getYAxis(axis="right") + y.sigInvertedChanged.connect(listener.partial("left")) + yright.sigInvertedChanged.connect(listener.partial("right")) + yright.setInverted(True) + + self.assertEquals(y.isInverted(), True) + events = listener.arguments() + self.assertEquals(len(events), 2) + self.assertIn(("left", True), events) + self.assertIn(("right", True), events) + + def testAxesDisplayedFalse(self): + """Test coverage on setAxesDisplayed(False)""" + self.plot.setAxesDisplayed(False) + + def testAxesDisplayedTrue(self): + """Test coverage on setAxesDisplayed(True)""" + self.plot.setAxesDisplayed(True) + + +class TestPlotCurveLog(PlotWidgetTestCase, ParametricTestCase): """Basic tests for addCurve with log scale axes""" # Test data @@ -578,12 +969,12 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): yData = xData ** 2 def _setLabels(self): - self.plot.setGraphXLabel('X') - self.plot.setGraphYLabel('X * X') + self.plot.getXAxis().setLabel('X') + self.plot.getYAxis().setLabel('X * X') def testPlotCurveLogX(self): self._setLabels() - self.plot.setXAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) self.plot.setGraphTitle('Curve X: Log Y: Linear') self.plot.addCurve(self.xData, self.yData, @@ -593,7 +984,7 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): def testPlotCurveLogY(self): self._setLabels() - self.plot.setYAxisLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.plot.setGraphTitle('Curve X: Linear Y: Log') @@ -604,8 +995,8 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): def testPlotCurveLogXY(self): self._setLabels() - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.plot.setGraphTitle('Curve X: Log Y: Log') @@ -615,8 +1006,8 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): color='green', linestyle="-", symbol='o') def testPlotCurveErrorLogXY(self): - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) # Every second error leads to negative number errors = numpy.ones_like(self.xData) @@ -666,17 +1057,17 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): self.qapp.processEvents() # no log axis - xLim = self.plot.getGraphXLimits() + xLim = self.plot.getXAxis().getLimits() self.assertEqual(xLim, (min(xData), max(xData))) - yLim = self.plot.getGraphYLimits() + yLim = self.plot.getYAxis().getLimits() self.assertEqual(yLim, (min(yData), max(yData))) # x axis log - self.plot.setXAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) self.qapp.processEvents() - xLim = self.plot.getGraphXLimits() - yLim = self.plot.getGraphYLimits() + xLim = self.plot.getXAxis().getLimits() + yLim = self.plot.getYAxis().getLimits() positives = xData > 0 if numpy.any(positives): self.assertTrue(numpy.allclose( @@ -688,11 +1079,11 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): self.assertEqual(yLim, (1., 100.)) # x axis and y axis log - self.plot.setYAxisLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.qapp.processEvents() - xLim = self.plot.getGraphXLimits() - yLim = self.plot.getGraphYLimits() + xLim = self.plot.getXAxis().getLimits() + yLim = self.plot.getYAxis().getLimits() positives = numpy.logical_and(xData > 0, yData > 0) if numpy.any(positives): self.assertTrue(numpy.allclose( @@ -704,11 +1095,11 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): self.assertEqual(yLim, (1., 100.)) # y axis log - self.plot.setXAxisLogarithmic(False) + self.plot.getXAxis()._setLogarithmic(False) self.qapp.processEvents() - xLim = self.plot.getGraphXLimits() - yLim = self.plot.getGraphYLimits() + xLim = self.plot.getXAxis().getLimits() + yLim = self.plot.getYAxis().getLimits() positives = yData > 0 if numpy.any(positives): self.assertEqual( @@ -720,12 +1111,12 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): self.assertEqual(yLim, (1., 100.)) # no log axis - self.plot.setYAxisLogarithmic(False) + self.plot.getYAxis()._setLogarithmic(False) self.qapp.processEvents() - xLim = self.plot.getGraphXLimits() + xLim = self.plot.getXAxis().getLimits() self.assertEqual(xLim, (min(xData), max(xData))) - yLim = self.plot.getGraphYLimits() + yLim = self.plot.getYAxis().getLimits() self.assertEqual(yLim, (min(yData), max(yData))) self.plot.clear() @@ -733,52 +1124,58 @@ class TestPlotCurveLog(_PlotWidgetTest, ParametricTestCase): self.qapp.processEvents() -class TestPlotImageLog(_PlotWidgetTest): +class TestPlotImageLog(PlotWidgetTestCase): """Basic tests for addImage with log scale axes.""" def setUp(self): super(TestPlotImageLog, self).setUp() - self.plot.setGraphXLabel('Columns') - self.plot.setGraphYLabel('Rows') + self.plot.getXAxis().setLabel('Columns') + self.plot.getYAxis().setLabel('Rows') def testPlotColormapGrayLogX(self): - self.plot.setXAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) self.plot.setGraphTitle('CMap X: Log Y: Linear') - colormap = {'name': 'gray', 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='gray', + normalization='linear', + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", origin=(1., 1.), scale=(1., 1.), replace=False, resetzoom=False, colormap=colormap) self.plot.resetZoom() def testPlotColormapGrayLogY(self): - self.plot.setYAxisLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.plot.setGraphTitle('CMap X: Linear Y: Log') - colormap = {'name': 'gray', 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='gray', + normalization='linear', + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", origin=(1., 1.), scale=(1., 1.), replace=False, resetzoom=False, colormap=colormap) self.plot.resetZoom() def testPlotColormapGrayLogXY(self): - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.plot.setGraphTitle('CMap X: Log Y: Log') - colormap = {'name': 'gray', 'normalization': 'linear', - 'autoscale': True, 'vmin': 0.0, 'vmax': 1.0} + colormap = Colormap(name='gray', + normalization='linear', + vmin=None, + vmax=None) self.plot.addImage(DATA_2D, legend="image 1", origin=(1., 1.), scale=(1., 1.), replace=False, resetzoom=False, colormap=colormap) self.plot.resetZoom() def testPlotRgbRgbaLogXY(self): - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) self.plot.setGraphTitle('RGB + RGBA X: Log Y: Log') rgb = numpy.array( @@ -801,7 +1198,7 @@ class TestPlotImageLog(_PlotWidgetTest): self.plot.resetZoom() -class TestPlotMarkerLog(_PlotWidgetTest): +class TestPlotMarkerLog(PlotWidgetTestCase): """Basic tests for markers on log scales""" # Test marker parameters @@ -816,14 +1213,14 @@ class TestPlotMarkerLog(_PlotWidgetTest): def setUp(self): super(TestPlotMarkerLog, self).setUp() - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') - self.plot.setXAxisAutoScale(False) - self.plot.setYAxisAutoScale(False) + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') + self.plot.getXAxis().setAutoScale(False) + self.plot.getYAxis().setAutoScale(False) self.plot.setKeepDataAspectRatio(False) self.plot.setLimits(1., 100., 1., 1000.) - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) def testPlotMarkerXLog(self): self.plot.setGraphTitle('Markers X, Log axes') @@ -862,7 +1259,7 @@ class TestPlotMarkerLog(_PlotWidgetTest): self.plot.resetZoom() -class TestPlotItemLog(_PlotWidgetTest): +class TestPlotItemLog(PlotWidgetTestCase): """Basic tests for items with log scale axes""" # Polygon coordinates and color @@ -892,14 +1289,14 @@ class TestPlotItemLog(_PlotWidgetTest): def setUp(self): super(TestPlotItemLog, self).setUp() - self.plot.setGraphYLabel('Rows') - self.plot.setGraphXLabel('Columns') - self.plot.setXAxisAutoScale(False) - self.plot.setYAxisAutoScale(False) + self.plot.getYAxis().setLabel('Rows') + self.plot.getXAxis().setLabel('Columns') + self.plot.getXAxis().setAutoScale(False) + self.plot.getYAxis().setAutoScale(False) self.plot.setKeepDataAspectRatio(False) self.plot.setLimits(1., 100., 1., 100.) - self.plot.setXAxisLogarithmic(True) - self.plot.setYAxisLogarithmic(True) + self.plot.getXAxis()._setLogarithmic(True) + self.plot.getYAxis()._setLogarithmic(True) def testPlotItemPolygonLogFill(self): self.plot.setGraphTitle('Item Fill Log') @@ -940,26 +1337,18 @@ class TestPlotItemLog(_PlotWidgetTest): def suite(): test_suite = unittest.TestSuite() - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotWidget)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotImage)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotCurve)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotMarker)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotItem)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotEmptyLog)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotCurveLog)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotImageLog)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotMarkerLog)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestPlotItemLog)) + loadTests = unittest.defaultTestLoader.loadTestsFromTestCase + test_suite.addTest(loadTests(TestPlotWidget)) + test_suite.addTest(loadTests(TestPlotImage)) + test_suite.addTest(loadTests(TestPlotCurve)) + test_suite.addTest(loadTests(TestPlotMarker)) + test_suite.addTest(loadTests(TestPlotItem)) + test_suite.addTest(loadTests(TestPlotAxes)) + test_suite.addTest(loadTests(TestPlotEmptyLog)) + test_suite.addTest(loadTests(TestPlotCurveLog)) + test_suite.addTest(loadTests(TestPlotImageLog)) + test_suite.addTest(loadTests(TestPlotMarkerLog)) + test_suite.addTest(loadTests(TestPlotItemLog)) return test_suite |