1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
4 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # Lesser General Public License for more details.
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 # Author : A. Bruneton
25 from curveplot import *
26 from curveplot.PlotTestBase import PlotTestBase, processDecorator
27 from curveplot.PlotSettings import PlotSettings
29 from pyqtside.QtWidgets import QApplication
31 qapp = QApplication(sys.argv)
33 class PlotTest(PlotTestBase):
34 """ Unit test suite for the curve plotter. The tests themselves are stored in this class,
35 the screenshot comparison logic is in PlotTestBase.
37 The class variable below can be turned on to regenerate base line files (reference images).
38 All baselines start with the name of the corresponding test, plus a possible suffix.
39 The baselines directory is set relative to the path of this script.
41 The decorator @runOnly can be used to run/rebuild a single test.
43 REBUILD_BASELINES = False
45 def __init__(self, methodName):
46 PlotTestBase.__init__(self, methodName)
51 def generateSine(self, alpha=1.0):
54 y = np.sin(x*alpha/np.pi)
57 def generateExp(self, alpha=1.0):
59 x = np.arange(20) + 1.0
64 ### The tests themselves
68 # Non GUI tests (some of them still need to show the widget to work properly but no
69 # screenshot comparison is made).
71 def testTableModel(self):
73 from curveplot.TableModel import TableModel
76 t.addColumn([1.0,2.0,3.0,4.0])
77 self.assertRaises(ValueError, t.addColumn, [1.0,2.0])
78 t.addColumn([1.0,2.0,3.0,4.0])
79 t.addColumn([1.0, 4.0, 9.0, 16.0])
80 self.assertEqual((4,3), t.getShape())
82 self.assertTrue(np.isnan(t.getData()[0,1]))
83 t.setColumnTitle(1, "a title")
84 self.assertEqual("a title", t.getColumnTitle(1))
85 self.assertEqual("", t.getColumnTitle(0))
87 def testGetAllPlotSets(self):
89 ids, titles = PlotController.GetAllPlotSets()
90 self.assertEqual([], ids)
91 self.assertEqual([], titles)
93 id1 = PlotController.AddPlotSet("toto")
94 id2 = PlotController.AddPlotSet("tutu")
95 id3 = PlotController.AddPlotSet("titi")
96 ids, titles = PlotController.GetAllPlotSets()
97 self.assertEqual([id1,id2,id3], ids)
98 self.assertEqual(["toto","tutu","titi"], titles)
100 def testGetCurrentXX(self):
102 self.assertEqual(-1, PlotController.GetCurrentCurveID())
103 self.assertEqual(-1, PlotController.GetCurrentPlotSetID())
105 x, y = self.generateSine()
106 _, psID1 = PlotController.AddCurve(x, y, append=False)
107 self.assertEqual(psID1, PlotController.GetCurrentPlotSetID())
108 _, psID2 = PlotController.AddCurve(x, y, append=True)
109 self.assertEqual(psID1, psID2) # doesn't hurt!
110 self.assertEqual(psID2, PlotController.GetCurrentPlotSetID())
111 psID3 = PlotController.AddPlotSet("ps")
112 self.assertEqual(psID3, PlotController.GetCurrentPlotSetID())
113 PlotController.DeletePlotSet(psID3)
114 PlotController.DeletePlotSet(psID2)
115 self.assertEqual(-1, PlotController.GetCurrentCurveID())
116 self.assertEqual(-1, PlotController.GetCurrentPlotSetID())
118 def testGetPlotSetID(self):
120 x, y = self.generateSine()
121 crvID, psID = PlotController.AddCurve(x, y, append=False)
122 self.assertEqual(psID, PlotController.GetPlotSetID(crvID))
123 self.assertEqual(-1, PlotController.GetPlotSetID(145)) # invalid ID
124 PlotController.DeletePlotSet(psID)
125 self.assertEqual(-1, PlotController.GetPlotSetID(crvID)) # invalid ID
127 def testGetPlotSetIDByName(self):
129 self.assertEqual(-1,PlotController.GetPlotSetIDByName("invalid"))
130 psID = PlotController.AddPlotSet("ps")
131 self.assertEqual(psID,PlotController.GetPlotSetIDByName("ps"))
132 PlotController.DeletePlotSet(psID)
133 self.assertEqual(-1,PlotController.GetPlotSetIDByName("ps"))
135 def testIsValidPlotSetID(self):
137 self.assertEqual(False,PlotController.IsValidPlotSetID(0))
138 psID = PlotController.AddPlotSet("ps")
139 self.assertEqual(True,PlotController.IsValidPlotSetID(psID))
140 PlotController.DeletePlotSet(psID)
141 self.assertEqual(False,PlotController.IsValidPlotSetID(psID))
146 def testAddCurve(self):
147 x, y = self.generateSine()
148 tw = self.showTabWidget()
149 PlotController.AddCurve(x, y, curve_label="My curve", x_label="Lèés X (unicode!)", y_label="Et des ŷ", append=False)
150 self.assertTrue(self.areScreenshotEqual(tw))
152 def testAddCurveAppend(self):
153 x, y = self.generateSine()
154 tw = self.showTabWidget()
155 PlotController.AddCurve(x, y, curve_label="My curve", x_label="The X-s", y_label="The Y-s", append=False)
156 PlotController.AddCurve(x, y*1.5, curve_label="My curve 2", append=True)
157 self.assertTrue(self.areScreenshotEqual(tw))
159 def testAddPlotSet(self):
160 tw = self.showTabWidget()
161 PlotController.AddPlotSet("My plotset")
162 self.assertTrue(self.areScreenshotEqual(tw))
164 def testClearPlotSet(self):
165 x, y = self.generateSine()
166 tw = self.showTabWidget()
167 PlotController.AddCurve(x, y, curve_label="My curve", x_label="The X-s", y_label="The Y-s", append=False)
168 _, psID = PlotController.AddCurve(x, y, curve_label="My curve 2", append=True)
169 clearedID = PlotController.ClearPlotSet()
170 self.assertEqual(clearedID, psID)
171 self.assertTrue(self.areScreenshotEqual(tw))
173 def testClearPlotSet2(self):
174 tw = self.showTabWidget()
175 self.assertRaises(ValueError, PlotController.ClearPlotSet, -789)
176 psID = PlotController.AddPlotSet("My plotset")
177 clearedID = PlotController.ClearPlotSet(psID)
178 self.assertEqual(psID, clearedID)
179 self.assertTrue(self.areScreenshotEqual(tw))
181 def testCopyCurve(self):
182 x, y = self.generateSine()
183 tw = self.showTabWidget()
184 crvID, _ = PlotController.AddCurve(x, y, curve_label="My curve", x_label="The X-s", y_label="The Y-s", append=False)
185 psID = PlotController.AddPlotSet("Another plotset")
186 newID = PlotController.CopyCurve(crvID, psID)
187 PlotController.SetCurrentPlotSet(psID)
188 self.assertNotEqual(crvID, newID)
189 self.assertTrue(self.areScreenshotEqual(tw))
191 def testDeleteCurrentItem_curve(self):
192 x, y = self.generateSine()
193 tw = self.showTabWidget()
194 PlotController.AddCurve(x, y, append=False)
195 crvID, _ = PlotController.AddCurve(x, y*1.5, append=True)
196 PlotController.SetCurrentCurve(crvID)
197 b, anID = PlotController.DeleteCurrentItem() # currently selected curve
199 self.assertEqual(crvID, anID)
200 self.assertTrue(self.areScreenshotEqual(tw))
202 def testDeleteCurrentItem_plotSet(self):
203 tw = self.showTabWidget()
204 PlotController.AddPlotSet("tutu")
205 psID = PlotController.AddPlotSet("tata")
206 b, anID = PlotController.DeleteCurrentItem()
208 self.assertEqual(psID, anID)
209 self.assertTrue(self.areScreenshotEqual(tw))
211 def testDeleteCurrentItem_void(self):
213 b, anID = PlotController.DeleteCurrentItem() # nothing selected
215 self.assertEqual(-1, anID)
217 def testDeleteCurve1(self):
218 tw = self.showTabWidget()
219 x, y = self.generateSine()
220 crvID, _ = PlotController.AddCurve(x, y, append=False)
221 PlotController.AddCurve(x, y*1.5, append=True)
222 cID = PlotController.DeleteCurve(crvID)
223 self.assertEqual(crvID, cID)
224 self.assertTrue(self.areScreenshotEqual(tw))
226 def testDeleteCurve2(self):
227 tw = self.showTabWidget()
228 x, y = self.generateSine()
229 crvID, _ = PlotController.AddCurve(x, y, append=False)
230 PlotController.AddCurve(x, y*1.5, append=True)
231 PlotController.SetCurrentCurve(crvID)
232 cID = PlotController.DeleteCurve() # current curve
233 self.assertEqual(crvID, cID)
234 self.assertTrue(self.areScreenshotEqual(tw))
236 def testDeleteCurve3(self):
237 """ resulting in an empty plot set, legend should be hidden """
238 tw = self.showTabWidget()
239 x, y = self.generateSine()
240 crvID, _ = PlotController.AddCurve(x, y, append=False)
241 cID = PlotController.DeleteCurve(crvID)
242 self.assertEqual(crvID, cID)
243 self.assertTrue(self.areScreenshotEqual(tw))
245 def testDeletePlotSet1(self):
246 tw = self.showTabWidget()
247 psID = PlotController.AddPlotSet("tutu")
248 PlotController.AddPlotSet("tata")
249 psID2 = PlotController.DeletePlotSet(psID)
250 self.assertEqual(psID2, psID)
251 self.assertTrue(self.areScreenshotEqual(tw))
253 def testDeletePlotSet2(self):
254 tw = self.showTabWidget()
255 psID1 = PlotController.DeletePlotSet()
256 self.assertEqual(-1, psID1) # nothing selected yet
257 psID2 = PlotController.AddPlotSet("tutu")
258 PlotController.AddPlotSet("tata")
259 PlotController.SetCurrentPlotSet(psID2)
260 psID3 = PlotController.DeletePlotSet() # current plot set
261 self.assertEqual(psID3, psID2)
262 self.assertTrue(self.areScreenshotEqual(tw))
264 def testSetCurrentCurve(self):
265 tw = self.showTabWidget()
266 self.assertRaises(ValueError, PlotController.SetCurrentCurve, 23)
267 x, y = self.generateSine()
268 crvID, psID = PlotController.AddCurve(x, y, append=False)
269 _, _ = PlotController.AddCurve(x, y, append=False) # in a new plot set
270 psID2 = PlotController.SetCurrentCurve(crvID)
271 self.assertEqual(psID, psID2)
272 self.assertTrue(self.areScreenshotEqual(tw))
274 def testSetCurrentCurve2(self):
275 tw = self.showTabWidget()
276 x, y = self.generateSine()
277 crvID, psID = PlotController.AddCurve(x, y, append=False)
278 PlotController.SetCurrentCurve(crvID)
279 _, crvID2 = PlotController.AddCurve(x, y, append=False) # in a new plot set
280 PlotController.SetCurrentCurve(crvID2)
281 # on first plot set curve should not be selected anymore
282 PlotController.SetCurrentPlotSet(psID)
283 self.assertTrue(self.areScreenshotEqual(tw))
285 def testSetCurrentCurve3(self):
286 tw = self.showTabWidget()
287 x, y = self.generateSine()
288 crvID, _ = PlotController.AddCurve(x, y, append=False)
289 # Selecting and de-selecting
290 PlotController.SetCurrentCurve(crvID)
291 PlotController.SetCurrentCurve(-1)
292 self.assertTrue(self.areScreenshotEqual(tw))
294 def testSetCurrentPlotSet(self):
295 tw = self.showTabWidget()
296 psID = PlotController.AddPlotSet("tutu")
297 PlotController.AddPlotSet("tata")
298 PlotController.SetCurrentPlotSet(psID)
299 self.assertTrue(self.areScreenshotEqual(tw))
300 self.assertRaises(ValueError, PlotController.SetCurrentPlotSet, 124) # invalid ps_id
302 def testSetLabelX(self):
303 tw = self.showTabWidget()
304 ps_id = PlotController.AddPlotSet("My plotset")
305 PlotController.SetXLabel("The X-s éà", ps_id)
306 self.assertTrue(self.areScreenshotEqual(tw))
308 def testSetLabelY(self):
309 tw = self.showTabWidget()
310 ps_id = PlotController.AddPlotSet("My plotset")
311 PlotController.SetYLabel("Tutu", ps_id)
312 PlotController.SetYLabel("The Y-s uûàç", ps_id)
313 self.assertTrue(self.areScreenshotEqual(tw))
315 def testSetPlotSetTitle(self):
316 tw = self.showTabWidget()
317 ps_id = PlotController.AddPlotSet("tutu")
318 PlotController.AddPlotSet("tata")
319 PlotController.SetPlotSetTitle("un titre àé", ps_id)
320 PlotController.SetCurrentPlotSet(ps_id)
321 self.assertTrue(self.areScreenshotEqual(tw))
323 # def testToggleCurveBrowser(self):
325 # raise NotImplementedError
327 def testPlotCurveFromTable(self):
328 tw = self.showTabWidget()
329 from curveplot.TableModel import TableModel
332 t.addColumn([1.0,2.0,3.0,4.0])
333 t.addColumn([1.0,2.0,3.0,4.0])
334 t.addColumn([1.0,4.0,9.0,16.0])
335 t.setColumnTitle(0, "X-s")
336 t.setColumnTitle(1, "Identity")
337 t.setColumnTitle(2, "Square")
338 cont = PlotController.GetInstance()
339 cont.plotCurveFromTable(t, y_col_index=1, append=False)
340 cont.plotCurveFromTable(t, y_col_index=2, append=True)
341 self.assertTrue(self.areScreenshotEqual(tw))
343 def testSettingsCurveColor(self):
344 tw = self.showTabWidget()
345 x, y = self.generateSine()
346 crvID, _ = PlotController.AddCurve(x, y, append=False)
347 PlotController.SetCurrentCurve(crvID)
348 # Emulate changing the curve color from the settings box:
349 dlg_test = PlotSettings()
351 dlg_test.setRGB(0,0,0)
352 dlg_test.showLegendCheckBox.setChecked(True)
355 t = list(PlotController.GetInstance()._curveTabsView._XYViews.items())
356 t[0][1].onSettings(dlg_test=dlg_test)
357 self.assertTrue(self.areScreenshotEqual(tw))
359 def testExtendCurve(self):
360 tw = self.showTabWidget()
361 x, y = self.generateSine()
362 crvID, _ = PlotController.AddCurve(x, y, append=False)
363 PlotController.SetCurrentCurve(crvID)
364 PlotController.ExtendCurve(crvID, x+100.0, y*2.0)
365 # Curve must remain blue, bold and with first marker:
366 self.assertTrue(self.areScreenshotEqual(tw))
368 def testResetCurve(self):
369 tw = self.showTabWidget()
370 x, y = self.generateSine()
371 crvID, _ = PlotController.AddCurve(x, y, append=False)
372 PlotController.SetCurrentCurve(crvID)
373 PlotController.ResetCurve(crvID)
374 PlotController.ExtendCurve(crvID, x+100.0, y*x)
375 # Curve must remain blue, bold and with first marker:
376 self.assertTrue(self.areScreenshotEqual(tw))
378 def testSettingsCurveMarker(self):
379 tw = self.showTabWidget()
380 x, y = self.generateSine()
381 crvID, _ = PlotController.AddCurve(x, y, append=False)
382 PlotController.SetCurrentCurve(crvID)
383 # Emulate changing the marker from the settings box:
384 dlg_test = PlotSettings()
386 dlg_test.markerCurve.setCurrentIndex(2)
387 dlg_test.showLegendCheckBox.setChecked(True)
390 t = list(PlotController.GetInstance()._curveTabsView._XYViews.items())
391 t[0][1].onSettings(dlg_test=dlg_test)
392 self.assertTrue(self.areScreenshotEqual(tw))
394 def testSetCurveMarker(self):
395 tw = self.showTabWidget()
396 x, y = self.generateSine()
397 crvID, _ = PlotController.AddCurve(x, y, append=False)
398 PlotController.SetCurveMarker(crvID, "v")
399 self.assertTrue(self.areScreenshotEqual(tw))
401 def testSetCurveLabel(self):
402 tw = self.showTabWidget()
403 x, y = self.generateSine()
404 crvID, _ = PlotController.AddCurve(x, y, curve_label="titi", append=False)
405 _, _ = PlotController.AddCurve(x, y, curve_label="toto", append=True)
406 PlotController.SetCurrentCurve(crvID)
407 PlotController.SetCurveLabel(crvID, "tata")
408 self.assertTrue(self.areScreenshotEqual(tw))
410 def testToggleXLog(self):
411 tw = self.showTabWidget()
412 x, y = self.generateExp()
413 _, psID = PlotController.AddCurve(x, y, curve_label="titi", append=False)
414 PlotController.SetXLog(psID, True)
415 PlotController.SetYSciNotation(psID, True)
416 self.assertTrue(self.areScreenshotEqual(tw))
418 def testToggleYLog(self):
419 tw = self.showTabWidget()
420 x, y = self.generateExp()
421 _, psID = PlotController.AddCurve(x, y, curve_label="titi", append=False)
422 PlotController.SetYLog(psID, True)
423 PlotController.SetYSciNotation(psID, True)
424 self.assertTrue(self.areScreenshotEqual(tw))
426 def testSetXSciNotation(self):
427 tw = self.showTabWidget()
428 x, y = self.generateSine()
429 _, psID = PlotController.AddCurve(x*1.0e6, y*1.0e6, curve_label="titi", append=False)
430 PlotController.SetXSciNotation(psID, True)
431 self.assertTrue(self.areScreenshotEqual(tw))
433 def testSetYSciNotation(self):
434 tw = self.showTabWidget()
435 x, y = self.generateSine()
436 _, psID = PlotController.AddCurve(x*1.0e6, y*1.0e6, curve_label="titi", append=False)
437 PlotController.SetYSciNotation(psID, True)
438 self.assertTrue(self.areScreenshotEqual(tw))
440 def testRegisterCallback(self):
447 x, y = self.generateExp()
448 crvId, _ = PlotController.AddCurve(x, y)
449 PlotController.RegisterCallback(fun)
450 PlotController.SetCurrentCurve(crvId)
451 self.assertEqual(crvId, a_callb)
453 def testDeleteCallback(self):
460 x, y = self.generateExp()
461 crvId, _ = PlotController.AddCurve(x, y)
462 PlotController.RegisterCallback(fun)
463 PlotController.ClearCallbacks()
464 PlotController.SetCurrentCurve(crvId)
465 _, _ = PlotController.AddCurve(x, y)
466 self.assertEqual(crvId, a_callb)
468 def testAddCurveEmptyPs(self):
469 """ Adding a curve when no ps was active was buggy """
471 x, y = self.generateSine()
472 PlotController.AddPlotSet("toto")
473 # No current plot set:
474 PlotController.SetCurrentPlotSet(-1)
475 # Should create a new plot set:
476 PlotController.AddCurve(x, y, append=True)
477 l, _ = PlotController.GetAllPlotSets()
478 self.assertEqual(2, len(l))
480 def test_onCurrentCurveChange(self):
482 x, y = self.generateSine()
483 crvID, _ = PlotController.AddCurve(x, y)
484 PlotController.SetCurrentCurve(crvID)
485 PlotController.DeleteCurve(crvID)
486 crvID2, _ = PlotController.AddCurve(x, y)
488 PlotController.SetCurrentCurve(crvID2)
490 def testSetLegendVisible(self):
491 tw = self.showTabWidget()
492 x, y = self.generateSine()
493 _, psID = PlotController.AddCurve(x, y, curve_label="titi", append=False)
494 PlotController.SetLegendVisible(psID, False) # by default legend is always visible in the tests
495 self.assertTrue(self.areScreenshotEqual(tw))
497 def testLockRepaint(self):
498 tw = self.showTabWidget()
499 x, y = self.generateSine()
500 PlotController.LockRepaint()
502 _, psID = PlotController.AddCurve(x, y*float(i+1), append=True)
503 PlotController.UnlockRepaint()
504 self.assertTrue(self.areScreenshotEqual(tw))
506 def testDelPlotSetSelectPrev(self):
507 """ When deleting a full plot set, the previous plot set should become active """
509 x, y = self.generateSine()
510 _, psID0 = PlotController.AddCurve(x, y, append=True) # creates a new plot set
511 _, psID1 = PlotController.AddCurve(x, y, append=False) # creates a new plot set
512 PlotController.DeletePlotSet(psID1)
513 PlotController.AddCurve(x, y, append=True) # should NOT create a new plot set
514 psID2 = PlotController.GetCurrentPlotSetID()
515 self.assertEqual(psID0, psID2)
516 l, _ = PlotController.GetAllPlotSets()
517 self.assertEqual(1, len(l))
519 # Even if not in main:
520 processDecorator(__name__)
522 if __name__ == "__main__":