From e0090c4e86a5efef1afafac1a8a6f784645e5064 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 11 Apr 2023 15:57:40 +0300 Subject: [PATCH 01/84] Add unittests. --- .coveragerc | 2 +- .gitignore | 3 + test/asammdf/__init__.py | 0 test/asammdf/gui/__init__.py | 60 ++ .../asammdf/gui/resources/ASAP2_Demo_V171.mf4 | Bin 0 -> 1204216 bytes .../gui/resources/invalid_EmptySection.lab | 1 + .../resources/invalid_JsonDecodeError.dspf | 168 ++++++ .../gui/resources/invalid_MissingSection.lab | 7 + .../invalid_NumericSectionKeyError.dspf | 173 ++++++ .../invalid_PlotSectionKeyError.dspf | 173 ++++++ .../invalid_TabularSectionKeyError.dspf | 168 ++++++ test/asammdf/gui/resources/saved.dspf | 162 +++++ test/asammdf/gui/resources/valid.dsp | Bin 0 -> 1483 bytes test/asammdf/gui/resources/valid.dspf | 249 ++++++++ test/asammdf/gui/resources/valid.lab | 8 + test/asammdf/gui/test_base.py | 65 ++ test/asammdf/gui/widgets/__init__.py | 0 test/asammdf/gui/widgets/test_FileWidget.py | 569 ++++++++++++++++++ test/requirements.txt | 6 + tox.ini | 3 +- 20 files changed, 1815 insertions(+), 2 deletions(-) create mode 100644 test/asammdf/__init__.py create mode 100644 test/asammdf/gui/__init__.py create mode 100644 test/asammdf/gui/resources/ASAP2_Demo_V171.mf4 create mode 100644 test/asammdf/gui/resources/invalid_EmptySection.lab create mode 100644 test/asammdf/gui/resources/invalid_JsonDecodeError.dspf create mode 100644 test/asammdf/gui/resources/invalid_MissingSection.lab create mode 100644 test/asammdf/gui/resources/invalid_NumericSectionKeyError.dspf create mode 100644 test/asammdf/gui/resources/invalid_PlotSectionKeyError.dspf create mode 100644 test/asammdf/gui/resources/invalid_TabularSectionKeyError.dspf create mode 100644 test/asammdf/gui/resources/saved.dspf create mode 100644 test/asammdf/gui/resources/valid.dsp create mode 100644 test/asammdf/gui/resources/valid.dspf create mode 100644 test/asammdf/gui/resources/valid.lab create mode 100644 test/asammdf/gui/test_base.py create mode 100644 test/asammdf/gui/widgets/__init__.py create mode 100644 test/asammdf/gui/widgets/test_FileWidget.py diff --git a/.coveragerc b/.coveragerc index 74cd09d38..c1cda34a8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,4 +2,4 @@ source = asammdf omit = - */asammdf/gui/* + */asammdf/gui/ui/* diff --git a/.gitignore b/.gitignore index 5538c7313..a4db89822 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,9 @@ pythonenv* # Rope project settings .ropeproject +# PyCharm +.idea/* + # mkdocs documentation /site diff --git a/test/asammdf/__init__.py b/test/asammdf/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/asammdf/gui/__init__.py b/test/asammdf/gui/__init__.py new file mode 100644 index 000000000..912fc6935 --- /dev/null +++ b/test/asammdf/gui/__init__.py @@ -0,0 +1,60 @@ +import os +import sys + +PYSIDE = "PySide" +PYSIDE2 = "PySide2" +PYSIDE6 = "PySide6" +PYQT4 = "PyQt4" +PYQT5 = "PyQt5" +PYQT6 = "PyQt6" + +QT_LIB = os.getenv("PYQTGRAPH_QT_LIB") + +if QT_LIB is not None: + try: + __import__(QT_LIB) + except ModuleNotFoundError: + pass + # raise ModuleNotFoundError( + # f"Environment variable PYQTGRAPH_QT_LIB is set to '{os.getenv('PYQTGRAPH_QT_LIB')}'," + # f" but no module with this name was found." + # ) + +## Automatically determine which Qt package to use (unless specified by +## environment variable). +## This is done by first checking to see whether one of the libraries +## is already imported. If not, then attempt to import in the order +## specified in libOrder. +libOrder = [PYQT6, PYSIDE6, PYQT5, PYSIDE2] +if QT_LIB is None: + for lib in libOrder: + if lib in sys.modules: + QT_LIB = lib + break + +if QT_LIB is None: + for lib in libOrder: + qt = lib + ".QtCore" + try: + __import__(qt) + QT_LIB = lib + break + except ImportError: + pass + +if QT_LIB is None: + raise Exception( + "PyQtGraph requires one of PyQt5, PyQt6, PySide2 or PySide6; none of these packages could be imported." + ) + +mandatory = ["QtCore", "QtGui", "QtTest", "QtWidgets"] +QT_LIB = __import__(f"{QT_LIB}", fromlist=mandatory) +if not QT_LIB: + raise ModuleNotFoundError(f"At least one of the following modules are not present in {QT_LIB}: {mandatory}") + +QtCore = getattr(QT_LIB, "QtCore") +QtGui = getattr(QT_LIB, "QtGui") +QtTest = getattr(QT_LIB, "QtTest") +QtWidgets = getattr(QT_LIB, "QtWidgets") + +__all__ = ["QtCore", "QtGui", "QtTest", "QtWidgets"] diff --git a/test/asammdf/gui/resources/ASAP2_Demo_V171.mf4 b/test/asammdf/gui/resources/ASAP2_Demo_V171.mf4 new file mode 100644 index 0000000000000000000000000000000000000000..7313fb13d0ba82d621596e5a68848b2c42884d83 GIT binary patch literal 1204216 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
YxEVO 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
{oxO9xH+V*!) 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�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 OrwKH2O09{lef$H{agWsi literal 0 HcmV?d00001 diff --git a/test/asammdf/gui/resources/valid.dspf b/test/asammdf/gui/resources/valid.dspf new file mode 100644 index 000000000..ff88f6b42 --- /dev/null +++ b/test/asammdf/gui/resources/valid.dspf @@ -0,0 +1,249 @@ +{ + "selected_channels": [], + "windows": [ + { + "title": "Display channels", + "configuration": { + "channels": [ + { + "type": "channel", + "name": "ASAM.M.SCALAR.FLOAT32.IDENTICAL", + "unit": "hours", + "flags": 1, + "enabled": true, + "individual_axis": false, + "common_axis": false, + "color": "#ff0000", + "computed": false, + "ranges": [ + { + "background_color": "#ffffff", + "font_color": "#00ff00", + "op1": "<=", + "op2": "<=", + "value1": 0.0, + "value2": 100.0 + }, + { + "background_color": "#ffffff", + "font_color": "#ff0000", + "op1": "<=", + "op2": "<=", + "value1": 100.0, + "value2": 200.0 + } + ], + "precision": 3, + "fmt": "{:.3f}", + "format": "phys", + "mode": "phys", + "comment": "", + "y_range": [ + -27.75, + 1026.75 + ], + "origin_uuid": "95f656e7a338" + }, + { + "type": "group", + "name": "Group01", + "enabled": true, + "pattern": null, + "ranges": [], + "origin_uuid": "000000000000", + "expanded": false, + "disabled": false, + "channels": [ + { + "type": "group", + "name": "Group0101", + "enabled": true, + "pattern": null, + "ranges": [], + "origin_uuid": "000000000000", + "expanded": false, + "disabled": false, + "channels": [ + { + "type": "channel", + "name": "ASAM.M.SCALAR.SLONG.IDENTICAL", + "unit": "hours", + "flags": 1, + "enabled": true, + "individual_axis": false, + "common_axis": false, + "color": "#a0a0a4", + "computed": false, + "ranges": [], + "precision": 3, + "fmt": "{}", + "format": "phys", + "mode": "phys", + "comment": "", + "y_range": [ + -27.75, + 1026.75 + ], + "origin_uuid": "95f656e7a338" + } + ] + }, + { + "type": "channel", + "name": "ASAM.M.SCALAR.SBYTE.IDENTICAL", + "unit": "hours", + "flags": 1, + "enabled": true, + "individual_axis": false, + "common_axis": false, + "color": "#a0a0a4", + "computed": false, + "ranges": [], + "precision": 3, + "fmt": "{}", + "format": "phys", + "mode": "phys", + "comment": "", + "y_range": [ + -135.08336345098002, + 134.08336654901996 + ], + "origin_uuid": "95f656e7a338" + } + ] + }, + { + "type": "channel", + "name": "ASAM.M.SCALAR.SBYTE.IDENTICAL.DISCRETE", + "unit": "hours", + "flags": 0, + "enabled": true, + "individual_axis": false, + "common_axis": false, + "color": "#d62728", + "computed": false, + "ranges": [], + "precision": 3, + "fmt": "{}", + "format": "phys", + "mode": "phys", + "y_range": [ + -128.0, + 124.0 + ], + "origin_uuid": "95f656e7a338" + } + ], + "pattern": {}, + "splitter": [ + 453, + 304, + 0 + ], + "y_axis_width": 48.0, + "grid": [ + false, + false + ], + "cursor_precision": 6, + "font_size": 9, + "locked": true, + "common_axis_y_range": [ + 0.0, + 1.0 + ], + "channels_header": [ + 453, + [ + 293, + 83, + 42, + 0, + 35 + ] + ], + "hide_axes": false, + "hide_selected_channel_value_panel": true, + "focused_mode": false, + "delta_mode": "value", + "hide_bookmarks": false + }, + "geometry": [ + 767, + 2, + 775, + 940 + ], + "maximized": false, + "minimized": false, + "type": "Plot" + }, + { + "title": "Numeric 0", + "configuration": { + "format": "Physical", + "mode": "offline", + "channels": [ + { + "origin_uuid": "0", + "name": "ASAM.M.SCALAR.SBYTE.IDENTICAL.DISCRETE", + "ranges": [], + "format": "phys" + } + ], + "pattern": {}, + "float_precision": -1, + "header_sections_width": [ + 323, + 106, + 118, + 112 + ], + "font_size": 9 + }, + "geometry": [ + 0, + 467, + 776, + 473 + ], + "maximized": false, + "minimized": false, + "type": "Numeric" + }, + { + "title": "Tabular 0", + "configuration": { + "sorted": true, + "channels": [ + "timestamps", + "ASAM.M.SCALAR.SBYTE.IDENTICAL.DISCRETE" + ], + "filtered": false, + "filters": [], + "time_as_date": false, + "pattern": {}, + "format": "phys", + "ranges": { + "ASAM.M.SCALAR.SBYTE.IDENTICAL.DISCRETE": [], + "timestamps": [] + }, + "header_sections_width": [ + 355, + 278 + ], + "font_size": 9 + }, + "geometry": [ + 14, + 0, + 754, + 472 + ], + "maximized": false, + "minimized": false, + "type": "Tabular" + } + ], + "functions": {} +} \ No newline at end of file diff --git a/test/asammdf/gui/resources/valid.lab b/test/asammdf/gui/resources/valid.lab new file mode 100644 index 000000000..eeb812cc3 --- /dev/null +++ b/test/asammdf/gui/resources/valid.lab @@ -0,0 +1,8 @@ +[lab] +ASAM.M.SCALAR.FLOAT64.IDENTICAL +ASAM.M.SCALAR.UBYTE.FORM_X_PLUS_4 +ASAM_[1].M.MATRIX_DIM_16.UBYTE.IDENTICAL +ASAM_[11].M.MATRIX_DIM_16.UBYTE.IDENTICAL +ASAM_[15].M.MATRIX_DIM_16.UBYTE.IDENTICAL +time +time \ No newline at end of file diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py new file mode 100644 index 000000000..466f2afd1 --- /dev/null +++ b/test/asammdf/gui/test_base.py @@ -0,0 +1,65 @@ +import os +import shutil +import sys +import time +import unittest +from unittest import mock + +import pyqtgraph + +from asammdf.gui.utils import excepthook + +app = pyqtgraph.mkQApp() +app.setOrganizationName("py-asammdf") +app.setOrganizationDomain("py-asammdf") +app.setApplicationName("py-asammdf") + + +class TestBase(unittest.TestCase): + longMessage = False + + resource = os.path.normpath(os.path.join(os.path.dirname(__file__), "resources")) + test_workspace = os.path.join( + os.path.join(os.path.dirname(__file__), "test_workspace") + ) + patchers = [] + # MockClass ErrorDialog + mc_ErrorDialog = None + + def shortDescription(self): + return self._testMethodDoc + + @staticmethod + def manual_use(w): + # Execute Widget for debug/development purpose. + w.showNormal() + app.exec() + + @staticmethod + def processEvents(timeout=0.001): + app.processEvents() + if timeout: + time.sleep(timeout) + + def setUp(self) -> None: + if os.path.exists(self.test_workspace): + shutil.rmtree(self.test_workspace) + os.makedirs(self.test_workspace) + app.processEvents() + + @classmethod + def setUpClass(cls): + sys.excepthook = excepthook + for patcher in (mock.patch("asammdf.gui.utils.ErrorDialog"),): + _ = patcher.start() + cls.patchers.append(patcher) + cls.mc_ErrorDialog = _ + + @classmethod + def tearDownClass(cls): + for patcher in cls.patchers: + patcher.stop() + + def tearDown(self): + self.processEvents() + shutil.rmtree(self.test_workspace) diff --git a/test/asammdf/gui/widgets/__init__.py b/test/asammdf/gui/widgets/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py new file mode 100644 index 000000000..bfa2b4c99 --- /dev/null +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -0,0 +1,569 @@ +import pathlib +from unittest import mock + +from PySide6 import QtCore, QtGui, QtWidgets + +assert QtGui == QtGui + +from asammdf.gui.widgets.file import FileWidget +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase + + +class TestFileWidget(TestBase): + # Note: If it's possible and make sense use self.subTests + # to avoid initialize widgets multiple times and consume time. + def setUp(self): + super().setUp() + self.widget = None + + def tearDown(self): + if self.widget: + self.widget.close() + self.widget.deleteLater() + super().tearDown() + + def test_PushButton_LoadOfflineWindows_DSP(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Press PushButton: "Load offline windows" + - Simulate that valid file was selected + Expected: + - Evaluate that Plot Window is added in "mdi_area" + """ + # Setup + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + valid_dsp = str(pathlib.Path(self.resource, "valid.dsp")) + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + + with ( + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = valid_dsp, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 1) + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertIn("Plot", widget_types) + + def test_PushButton_LoadOfflineWindows_DSPF(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Case 0: + - Press PushButton: "Load offline windows" + - Simulate that no file was selected + - Case 1: + - Press PushButton: "Load offline windows" + - Simulate that file with non-supported extension was selected + - Case 2: + - Press PushButton: "Load offline windows" + - Simulate that invalid "dspf" file was selected: json decode error + - Case 3: + - Press PushButton: "Load offline windows" + - Simulate that invalid "dspf" file was selected: Plot Section Key Error + - Case 4: + - Press PushButton: "Load offline windows" + - Simulate that invalid "dspf" file was selected: Numeric Section Key Error + - Case 5: + - Press PushButton: "Load offline windows" + - Simulate that invalid "dspf" file was selected: Tabular Section Key Error + - Case 6: + - Press PushButton: "Load offline windows" + - Simulate that valid "dspf" file was selected + Expected: + - Case 0: No dpsf file was selected + - Evaluate that method "load_window" is not called + - Case 1: File with non-supported extension was selected + - Evaluate that method "load_window" is not called + - Case 2: Json Decode Error + - Evaluate that method "load_window" is not called + - Evaluate that "ErrorDialog" widget is called + - Case 3: Plot Section Key Error + - Evaluate that there is no Plot window in "mdi_area" + - Evaluate that "ErrorDialog" widget is called + - Case 4: Numeric Section Key Error + - Evaluate that there is no Numeric window in "mdi_area" + - Evaluate that "ErrorDialog" widget is called + - Case 5: Tabular Section Key Error + - Evaluate that there is no Tabuler window in "mdi_area" + - Evaluate that "ErrorDialog" widget is called + - Case 6: + - Evaluate that there 3 sub-windows in "mdi_area" when measurement file is loaded + - Numeric, Plot, Tabular + """ + # Setup + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + valid_dspf = str(pathlib.Path(self.resource, "valid.dspf")) + invalid_json_decode_error_dspf = str( + pathlib.Path(self.resource, "invalid_JsonDecodeError.dspf") + ) + invalid_numeric_section_key_error_dspf = str( + pathlib.Path(self.resource, "invalid_NumericSectionKeyError.dspf") + ) + invalid_plot_section_key_error_dspf = str( + pathlib.Path(self.resource, "invalid_PlotSectionKeyError.dspf") + ) + invalid_tabular_section_key_error_dspf = str( + pathlib.Path(self.resource, "invalid_TabularSectionKeyError.dspf") + ) + + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + # Case 0 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = None, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + mo_load_window.assert_not_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + # Case 1 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = valid_dspf[:-2], None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + mo_load_window.assert_not_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + # Case 2 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = invalid_json_decode_error_dspf, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + mo_load_window.assert_not_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + self.mc_ErrorDialog.assert_called() + self.mc_ErrorDialog.reset_mock() + + # Case 3 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): + with ( + # Magic. Trust me. + mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = ( + invalid_plot_section_key_error_dspf, + None, + ) + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 2) + mc_ErrorDialog.assert_called() + mc_ErrorDialog.reset_mock() + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertNotIn("Plot", widget_types) + + # Case 4 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): + with ( + # Magic. Trust me. + mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = ( + invalid_numeric_section_key_error_dspf, + None, + ) + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 2) + mc_ErrorDialog.assert_called() + mc_ErrorDialog.reset_mock() + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertNotIn("Numeric", widget_types) + + # Case 5 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): + with ( + # Magic. Trust me. + mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = ( + invalid_tabular_section_key_error_dspf, + None, + ) + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 2) + mc_ErrorDialog.assert_called() + mc_ErrorDialog.reset_mock() + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertNotIn("Tabular", widget_types) + + # Case 6 + with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = valid_dspf, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + mo_load_window.assert_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 3) + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertListEqual(["Numeric", "Plot", "Tabular"], widget_types) + + def test_PushButton_LoadOfflineWindows_LAB(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Case 0: + - Press PushButton: "Load offline windows" + - Simulate that "lab" file with empty section was selected + - Case 1: + - Press PushButton: "Load offline windows" + - Simulate that "lab" with no sections was provided + - Case 2: + - Press PushButton: "Load offline windows" + - Simulate that valid "lab" file was selected + Expected: + - Case 0 & 1: + - Evaluate that no channel is checked + - Case 2: + - Evaluate that 7 channels are checked + """ + # Setup + valid_lab = str(pathlib.Path(self.resource, "valid.lab")) + invalid_missing_section_lab = str(pathlib.Path(self.resource, "invalid_MissingSection.lab")) + invalid_empty_section_lab = str(pathlib.Path(self.resource, "invalid_EmptySection.lab")) + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + # Case 0: + with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): + with ( + mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = invalid_empty_section_lab, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + checked_items = [] + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + if item.parent() is None: + iterator += 1 + continue + if item.checkState(0) == QtCore.Qt.Checked: + checked_items.append(item.text(0)) + iterator += 1 + self.assertEqual(0, len(checked_items)) + self.assertNotRegex( + str(self.mc_ErrorDialog.mock_calls), r"local variable .* referenced before assignment" + ) + + # Case 1: + with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): + with ( + mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = invalid_missing_section_lab, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + checked_items = [] + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + if item.parent() is None: + iterator += 1 + continue + if item.checkState(0) == QtCore.Qt.Checked: + checked_items.append(item.text(0)) + iterator += 1 + self.assertEqual(0, len(checked_items)) + self.assertNotRegex( + str(self.mc_ErrorDialog.mock_calls), r"local variable .* referenced before assignment" + ) + + # Case 2: + with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): + with ( + mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, + mock.patch("asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem") as mo_getItem + ): + mo_getOpenFileName.return_value = valid_lab, None + mo_getItem.return_value = "lab", True + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + checked_items = [] + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + if item.parent() is None: + iterator += 1 + continue + if item.checkState(0) == QtCore.Qt.Checked: + checked_items.append(item.text(0)) + iterator += 1 + self.assertEqual(7, len(checked_items)) + self.assertSetEqual( + {"ASAM.M.SCALAR.FLOAT64.IDENTICAL", + "ASAM.M.SCALAR.UBYTE.FORM_X_PLUS_4", + "ASAM_[1].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "ASAM_[11].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "ASAM_[15].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "time"}, + set(checked_items) + ) + + def test_PushButton_SaveOfflineWindows(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Press PushButton: "Load offline windows" + - Simulate that valid "dspf" file was selected + - Close all Numeric and Tabular windows + - Add new Plot window + - Drag and drop signal from channels tree to Plot + - Press PushButton: "Save offline windows" + - Close all windows. + - Press PushButton: "Load offline windows" + - Simulate that saved valid "dspf" file was selected + Evaluate: + - Evaluate that new dspf file was saved. + - Evaluate that two Plot Windows are loaded. + """ + # Setup + valid_dspf = str(pathlib.Path(self.resource, "valid.dspf")) + saved_dspf = pathlib.Path(self.test_workspace, f"{self.id()}.dspf") + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + self.widget.showMaximized() + self.widget.activateWindow() + + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = valid_dspf, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Pre-Evaluate + mo_load_window.assert_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 3) + for window in self.widget.mdi_area.subWindowList(): + if window.widget().__class__.__name__ in ("Numeric", "Tabular"): + window.close() + + # Drag Part + channels_tree = self.widget.channels_tree + mdi_area = self.widget.mdi_area + + iterator = QtWidgets.QTreeWidgetItemIterator(channels_tree) + while iterator.value(): + item = iterator.value() + # Expand Parent: Channel group 2 (Engine_1) + if item.parent() is None and item.text(0) == "Channel group 2 (Engine_1)": + item.setExpanded(True) + iterator += 1 + continue + # Select item: ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE + if item.text(0) == 'ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE': + item.setSelected(True) + + # item_rect = channels_tree.visualItemRect(item) + # drag_position = item_rect.center() + drop_position = mdi_area.viewport().rect().center() + + # Press on item + # Don't know how to trigger startDrag for now. + # QtTest.QTest.mousePress( + # channels_tree, + # QtCore.Qt.LeftButton, + # QtCore.Qt.NoModifier, + # item_center + # ) + with mock.patch("asammdf.gui.widgets.mdi_area.WindowSelectionDialog") as mc_WindowSelectionDialog: + # Setup + mc_WindowSelectionDialog.return_value.result.return_value = True + mc_WindowSelectionDialog.return_value.disable_new_channels.return_value = False + mc_WindowSelectionDialog.return_value.selected_type.return_value = "Plot" + + channels_tree.startDrag(QtCore.Qt.MoveAction) + # Move item + QtTest.QTest.mouseMove(mdi_area, drop_position) + # Release item + QtTest.QTest.mouseRelease(mdi_area, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, drop_position) + break + iterator += 1 + + # Press PushButton: "Save offline windows" + with mock.patch("asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName") as mo_getSaveFileName: + mo_getSaveFileName.return_value = str(saved_dspf), None + QtTest.QTest.mouseClick( + self.widget.save_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Evaluate + self.assertTrue(saved_dspf.exists()) + + # Event + with ( + mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + ): + mo_getOpenFileName.return_value = saved_dspf, None + QtTest.QTest.mouseClick( + self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton + ) + # Pre-Evaluate + mo_load_window.assert_called() + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 2) + widget_types = set( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertSetEqual({"Plot"}, widget_types) + diff --git a/test/requirements.txt b/test/requirements.txt index d89bbd65a..a1c067132 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -1,10 +1,16 @@ +natsort numexpr numpy>=1.23.0 pandas +psutil pytest pytest-cov canmatrix[arxml,dbc]>=0.8 lz4 typing_extensions +PySide6==6.2.2 +pyqtgraph>=0.12.4; sys_platform=="win32" +pyqtgraph>=0.12.4; sys_platform=="darwin" +pyqtgraph==0.12.4; sys_platform=="linux" python-dateutil isal; platform_machine == "x86_64" or platform_machine == "AMD64" diff --git a/tox.ini b/tox.ini index 68021fff6..109aa50f7 100644 --- a/tox.ini +++ b/tox.ini @@ -39,4 +39,5 @@ python = [pytest] python_classes = testpaths = test -addopts = -vv --color=yes --code-highlight=yes \ No newline at end of file +addopts = -vv --color=yes --code-highlight=yes +timeout = 100 \ No newline at end of file From 9f7d4c7a5324803dbc4d09dc6b3ace92383d3bf3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 11 Apr 2023 16:24:45 +0300 Subject: [PATCH 02/84] Reformat files. --- test/asammdf/gui/__init__.py | 4 +- test/asammdf/gui/widgets/test_FileWidget.py | 80 ++++++++++++++------- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/test/asammdf/gui/__init__.py b/test/asammdf/gui/__init__.py index 912fc6935..61669348c 100644 --- a/test/asammdf/gui/__init__.py +++ b/test/asammdf/gui/__init__.py @@ -50,7 +50,9 @@ mandatory = ["QtCore", "QtGui", "QtTest", "QtWidgets"] QT_LIB = __import__(f"{QT_LIB}", fromlist=mandatory) if not QT_LIB: - raise ModuleNotFoundError(f"At least one of the following modules are not present in {QT_LIB}: {mandatory}") + raise ModuleNotFoundError( + f"At least one of the following modules are not present in {QT_LIB}: {mandatory}" + ) QtCore = getattr(QT_LIB, "QtCore") QtGui = getattr(QT_LIB, "QtGui") diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index bfa2b4c99..9c2c13057 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,13 +1,11 @@ import pathlib +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase from unittest import mock -from PySide6 import QtCore, QtGui, QtWidgets - -assert QtGui == QtGui +from PySide6 import QtCore, QtWidgets from asammdf.gui.widgets.file import FileWidget -from test.asammdf.gui import QtCore, QtTest, QtWidgets -from test.asammdf.gui.test_base import TestBase class TestFileWidget(TestBase): @@ -329,8 +327,12 @@ def test_PushButton_LoadOfflineWindows_LAB(self): """ # Setup valid_lab = str(pathlib.Path(self.resource, "valid.lab")) - invalid_missing_section_lab = str(pathlib.Path(self.resource, "invalid_MissingSection.lab")) - invalid_empty_section_lab = str(pathlib.Path(self.resource, "invalid_EmptySection.lab")) + invalid_missing_section_lab = str( + pathlib.Path(self.resource, "invalid_MissingSection.lab") + ) + invalid_empty_section_lab = str( + pathlib.Path(self.resource, "invalid_EmptySection.lab") + ) measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) # Event @@ -349,7 +351,9 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with ( - mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( @@ -370,13 +374,16 @@ def test_PushButton_LoadOfflineWindows_LAB(self): iterator += 1 self.assertEqual(0, len(checked_items)) self.assertNotRegex( - str(self.mc_ErrorDialog.mock_calls), r"local variable .* referenced before assignment" + str(self.mc_ErrorDialog.mock_calls), + r"local variable .* referenced before assignment", ) # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with ( - mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( @@ -397,14 +404,19 @@ def test_PushButton_LoadOfflineWindows_LAB(self): iterator += 1 self.assertEqual(0, len(checked_items)) self.assertNotRegex( - str(self.mc_ErrorDialog.mock_calls), r"local variable .* referenced before assignment" + str(self.mc_ErrorDialog.mock_calls), + r"local variable .* referenced before assignment", ) # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with ( - mock.patch("src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName") as mo_getOpenFileName, - mock.patch("asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem") as mo_getItem + mock.patch( + "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, + mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" + ) as mo_getItem, ): mo_getOpenFileName.return_value = valid_lab, None mo_getItem.return_value = "lab", True @@ -426,13 +438,15 @@ def test_PushButton_LoadOfflineWindows_LAB(self): iterator += 1 self.assertEqual(7, len(checked_items)) self.assertSetEqual( - {"ASAM.M.SCALAR.FLOAT64.IDENTICAL", - "ASAM.M.SCALAR.UBYTE.FORM_X_PLUS_4", - "ASAM_[1].M.MATRIX_DIM_16.UBYTE.IDENTICAL", - "ASAM_[11].M.MATRIX_DIM_16.UBYTE.IDENTICAL", - "ASAM_[15].M.MATRIX_DIM_16.UBYTE.IDENTICAL", - "time"}, - set(checked_items) + { + "ASAM.M.SCALAR.FLOAT64.IDENTICAL", + "ASAM.M.SCALAR.UBYTE.FORM_X_PLUS_4", + "ASAM_[1].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "ASAM_[11].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "ASAM_[15].M.MATRIX_DIM_16.UBYTE.IDENTICAL", + "time", + }, + set(checked_items), ) def test_PushButton_SaveOfflineWindows(self): @@ -505,7 +519,7 @@ def test_PushButton_SaveOfflineWindows(self): iterator += 1 continue # Select item: ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE - if item.text(0) == 'ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE': + if item.text(0) == "ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE": item.setSelected(True) # item_rect = channels_tree.visualItemRect(item) @@ -520,22 +534,35 @@ def test_PushButton_SaveOfflineWindows(self): # QtCore.Qt.NoModifier, # item_center # ) - with mock.patch("asammdf.gui.widgets.mdi_area.WindowSelectionDialog") as mc_WindowSelectionDialog: + with mock.patch( + "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" + ) as mc_WindowSelectionDialog: # Setup mc_WindowSelectionDialog.return_value.result.return_value = True - mc_WindowSelectionDialog.return_value.disable_new_channels.return_value = False - mc_WindowSelectionDialog.return_value.selected_type.return_value = "Plot" + mc_WindowSelectionDialog.return_value.disable_new_channels.return_value = ( + False + ) + mc_WindowSelectionDialog.return_value.selected_type.return_value = ( + "Plot" + ) channels_tree.startDrag(QtCore.Qt.MoveAction) # Move item QtTest.QTest.mouseMove(mdi_area, drop_position) # Release item - QtTest.QTest.mouseRelease(mdi_area, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, drop_position) + QtTest.QTest.mouseRelease( + mdi_area, + QtCore.Qt.LeftButton, + QtCore.Qt.NoModifier, + drop_position, + ) break iterator += 1 # Press PushButton: "Save offline windows" - with mock.patch("asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName") as mo_getSaveFileName: + with mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" + ) as mo_getSaveFileName: mo_getSaveFileName.return_value = str(saved_dspf), None QtTest.QTest.mouseClick( self.widget.save_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -566,4 +593,3 @@ def test_PushButton_SaveOfflineWindows(self): ) ) self.assertSetEqual({"Plot"}, widget_types) - From fea51b2b16af80baeb70271363f55b38bb1c49f2 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 12 Apr 2023 07:51:27 +0300 Subject: [PATCH 03/84] Add pytest-timeout deps --- test/asammdf/gui/widgets/test_FileWidget.py | 3 ++- tox.ini | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 9c2c13057..cd50f23bc 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -524,7 +524,7 @@ def test_PushButton_SaveOfflineWindows(self): # item_rect = channels_tree.visualItemRect(item) # drag_position = item_rect.center() - drop_position = mdi_area.viewport().rect().center() + drop_position = mdi_area.viewport().rect().center() - QtCore.QPoint(200, 200) # Press on item # Don't know how to trigger startDrag for now. @@ -559,6 +559,7 @@ def test_PushButton_SaveOfflineWindows(self): break iterator += 1 + QtTest.QTest.qWait(10) # Press PushButton: "Save offline windows" with mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" diff --git a/tox.ini b/tox.ini index 109aa50f7..7ebda5c03 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ envlist = py38, py39, py310, py311, style, doc deps = -rtest/requirements.txt coverage + pytest-timeout commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc From 433f8aaf48ce2b4f6768b073a90ad537882b8359 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 12 Apr 2023 08:14:44 +0300 Subject: [PATCH 04/84] Fix path --- test/asammdf/gui/widgets/test_FileWidget.py | 30 +++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index cd50f23bc..3f2e638e0 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -49,7 +49,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): with ( mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = valid_dsp, None @@ -148,7 +148,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = None, None @@ -166,7 +166,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = valid_dspf[:-2], None @@ -184,7 +184,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = invalid_json_decode_error_dspf, None @@ -203,7 +203,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Magic. Trust me. mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = ( @@ -231,7 +231,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Magic. Trust me. mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = ( @@ -259,7 +259,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Magic. Trust me. mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = ( @@ -288,7 +288,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = valid_dspf, None @@ -352,7 +352,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with ( mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = invalid_empty_section_lab, None @@ -382,7 +382,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with ( mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = invalid_missing_section_lab, None @@ -412,7 +412,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with ( mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" @@ -492,7 +492,7 @@ def test_PushButton_SaveOfflineWindows(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = valid_dspf, None @@ -524,7 +524,9 @@ def test_PushButton_SaveOfflineWindows(self): # item_rect = channels_tree.visualItemRect(item) # drag_position = item_rect.center() - drop_position = mdi_area.viewport().rect().center() - QtCore.QPoint(200, 200) + drop_position = mdi_area.viewport().rect().center() - QtCore.QPoint( + 200, 200 + ) # Press on item # Don't know how to trigger startDrag for now. @@ -577,7 +579,7 @@ def test_PushButton_SaveOfflineWindows(self): self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( - "src.asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, ): mo_getOpenFileName.return_value = saved_dspf, None From dbaa4ef12342ffcda6210b3b07b472d0edf68bf7 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 12:35:49 +0300 Subject: [PATCH 05/84] Increase timeout. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 7ebda5c03..df12e14a0 100644 --- a/tox.ini +++ b/tox.ini @@ -41,4 +41,4 @@ python = python_classes = testpaths = test addopts = -vv --color=yes --code-highlight=yes -timeout = 100 \ No newline at end of file +timeout = 300 \ No newline at end of file From 25c57d3a4137b90207e0f9ea6f4e5359a8e6193f Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 12:43:22 +0300 Subject: [PATCH 06/84] Add shebang.. --- test/asammdf/gui/test_base.py | 1 + test/asammdf/gui/widgets/test_FileWidget.py | 1 + 2 files changed, 2 insertions(+) diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py index 466f2afd1..db2faf8dc 100644 --- a/test/asammdf/gui/test_base.py +++ b/test/asammdf/gui/test_base.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import os import shutil import sys diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 3f2e638e0..6a4bda8a3 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import pathlib from test.asammdf.gui import QtCore, QtTest, QtWidgets from test.asammdf.gui.test_base import TestBase From 5116d958b00966b1d869cab94b78981904554b66 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 12:49:47 +0300 Subject: [PATCH 07/84] Add shebang --- test/asammdf/gui/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/asammdf/gui/__init__.py b/test/asammdf/gui/__init__.py index 61669348c..9f0d0f78c 100644 --- a/test/asammdf/gui/__init__.py +++ b/test/asammdf/gui/__init__.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import os import sys From f43d2342c7fe8dfe2f71370adcf26fdaef7d2a31 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 14:44:16 +0300 Subject: [PATCH 08/84] Reformat in order to support 3.8 --- pyproject.toml | 1 + test/asammdf/gui/widgets/test_FileWidget.py | 143 ++++++++------------ 2 files changed, 57 insertions(+), 87 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9bb79239a..6392442dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,6 +3,7 @@ requires = ["numpy", "setuptools", "wheel"] build-backend = "setuptools.build_meta" [tool.black] +target-version = ['py38'] extend-exclude = ''' ^/src/asammdf/gui/ui ''' diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 6a4bda8a3..70458f500 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -144,14 +144,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): ) # Case 0 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = None, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -162,14 +159,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 1 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dspf[:-2], None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -180,14 +174,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 2 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_json_decode_error_dspf, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -200,13 +191,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 3 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): - with ( - # Magic. Trust me. - mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.ErrorDialog" + ) as mc_ErrorDialog, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = ( invalid_plot_section_key_error_dspf, None, @@ -228,13 +217,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 4 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): - with ( - # Magic. Trust me. - mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.ErrorDialog" + ) as mc_ErrorDialog, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = ( invalid_numeric_section_key_error_dspf, None, @@ -256,13 +243,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 5 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): - with ( - # Magic. Trust me. - mock.patch("asammdf.gui.widgets.file.ErrorDialog") as mc_ErrorDialog, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.ErrorDialog" + ) as mc_ErrorDialog, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = ( invalid_tabular_section_key_error_dspf, None, @@ -284,14 +269,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 6 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dspf, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -351,11 +333,9 @@ def test_PushButton_LoadOfflineWindows_LAB(self): ) # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): - with ( - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -381,11 +361,9 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): - with ( - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -411,14 +389,11 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): - with ( - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" - ) as mo_getItem, - ): + with mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" + ) as mo_getItem: mo_getOpenFileName.return_value = valid_lab, None mo_getItem.return_value = "lab", True QtTest.QTest.mouseClick( @@ -488,14 +463,11 @@ def test_PushButton_SaveOfflineWindows(self): self.widget.showMaximized() self.widget.activateWindow() - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dspf, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton @@ -575,14 +547,11 @@ def test_PushButton_SaveOfflineWindows(self): self.assertTrue(saved_dspf.exists()) # Event - with ( - mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window - ) as mo_load_window, - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch.object( + self.widget, "load_window", wraps=self.widget.load_window + ) as mo_load_window, mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = saved_dspf, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton From 38cfc1b6c5fc42664e3ca937e5fa363f393ad713 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 14:46:21 +0300 Subject: [PATCH 09/84] Increase timeout. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index df12e14a0..a51d4dd3c 100644 --- a/tox.ini +++ b/tox.ini @@ -41,4 +41,4 @@ python = python_classes = testpaths = test addopts = -vv --color=yes --code-highlight=yes -timeout = 300 \ No newline at end of file +timeout = 600 \ No newline at end of file From 274fc329e9f30c5d4f0e013e2de6a96e4dc8d938 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 14:54:59 +0300 Subject: [PATCH 10/84] .. --- .github/workflows/main.yml | 4 ++++ test/asammdf/gui/widgets/test_FileWidget.py | 8 +++----- tox.ini | 4 +--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3aef4c8b4..b6dbc766a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,6 +23,10 @@ jobs: - name: Install packages run: | pip install tox tox-gh-actions + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt update + sudo apt install libegl1 libopengl0 libgl1 + fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 70458f500..16b8ae363 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -48,11 +48,9 @@ def test_PushButton_LoadOfflineWindows_DSP(self): None, # hide_disabled_channels ) - with ( - mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" - ) as mo_getOpenFileName, - ): + with mock.patch( + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dsp, None QtTest.QTest.mouseClick( self.widget.load_channel_list_btn, QtCore.Qt.MouseButton.LeftButton diff --git a/tox.ini b/tox.ini index a51d4dd3c..68021fff6 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,6 @@ envlist = py38, py39, py310, py311, style, doc deps = -rtest/requirements.txt coverage - pytest-timeout commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc @@ -40,5 +39,4 @@ python = [pytest] python_classes = testpaths = test -addopts = -vv --color=yes --code-highlight=yes -timeout = 600 \ No newline at end of file +addopts = -vv --color=yes --code-highlight=yes \ No newline at end of file From 10b688f007563974092e3c344bebd8b66ff11b15 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 14:59:58 +0300 Subject: [PATCH 11/84] ... --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b6dbc766a..532c8b874 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,11 +21,12 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install packages + shell: bash run: | pip install tox tox-gh-actions if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update - sudo apt install libegl1 libopengl0 libgl1 + sudo apt install libegl1 libopengl0 fi # see: https://github.com/ymyzk/tox-gh-actions From 5c64e210ee961bc3debda442b3068577c11e299f Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:10:17 +0300 Subject: [PATCH 12/84] Add DISPLAY and XAUTHORITY --- .github/workflows/main.yml | 5 ----- tox.ini | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 532c8b874..3aef4c8b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,13 +21,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install packages - shell: bash run: | pip install tox tox-gh-actions - if [ "$RUNNER_OS" == "Linux" ]; then - sudo apt update - sudo apt install libegl1 libopengl0 - fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests diff --git a/tox.ini b/tox.ini index 68021fff6..79f78aeb1 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ envlist = py38, py39, py310, py311, style, doc deps = -rtest/requirements.txt coverage +passenv = DISPLAY,XAUTHORITY commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc From 8dd1b66f7e700e09a4d09071f82b565df2933bb7 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:14:11 +0300 Subject: [PATCH 13/84] .. --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3aef4c8b4..532c8b874 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,8 +21,13 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install packages + shell: bash run: | pip install tox tox-gh-actions + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt update + sudo apt install libegl1 libopengl0 + fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests From 59b81e9dbffd4c14440019dadac582216dc320da Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:20:03 +0300 Subject: [PATCH 14/84] Debug.. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 79f78aeb1..b11fba0df 100644 --- a/tox.ini +++ b/tox.ini @@ -13,7 +13,7 @@ deps = coverage passenv = DISPLAY,XAUTHORITY commands = - coverage run --rcfile=.coveragerc --module pytest + coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc [testenv:style] From 93601912858aa1049e2d987247acf42574549fa8 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:26:39 +0300 Subject: [PATCH 15/84] retry --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3dd92f565..8b9d4a8fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,6 +38,7 @@ jobs: if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update sudo apt install libegl1 libopengl0 + sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev fi pyinstaller asammdf.spec --distpath dist/${RUNNER_OS} --noconfirm --clean From df0e7f11656b4f2bbe5e0a0891f6b39559b9966c Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:29:02 +0300 Subject: [PATCH 16/84] one more.. --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b9d4a8fe..35eafadce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,7 @@ jobs: sudo apt update sudo apt install libegl1 libopengl0 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev + sudo apt-get install libxcb-xinerama0 fi pyinstaller asammdf.spec --distpath dist/${RUNNER_OS} --noconfirm --clean From 86845c563dbbe6e703a5e61c37546eff52a6b997 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:34:02 +0300 Subject: [PATCH 17/84] .. --- tox.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tox.ini b/tox.ini index b11fba0df..70c3598a0 100644 --- a/tox.ini +++ b/tox.ini @@ -12,6 +12,8 @@ deps = -rtest/requirements.txt coverage passenv = DISPLAY,XAUTHORITY +setenv = + QT_DEBUG_PLUGINS = 1 commands = coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From da30f5f5aa19cc9eb28508444ee5ef612ac21c16 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 13 Apr 2023 16:41:32 +0300 Subject: [PATCH 18/84] Add missing lib. --- .github/workflows/build.yml | 1 + tox.ini | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35eafadce..d40fbcefa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,6 +40,7 @@ jobs: sudo apt install libegl1 libopengl0 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 + sudo apt-get install libxkbcommon-x11-0 fi pyinstaller asammdf.spec --distpath dist/${RUNNER_OS} --noconfirm --clean diff --git a/tox.ini b/tox.ini index 70c3598a0..89436f4e8 100644 --- a/tox.ini +++ b/tox.ini @@ -14,6 +14,7 @@ deps = passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 + QT_QPA_PLATFORM = offscreen commands = coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From bc6123cdec246a8887e728c5f3b6c5e8993e9982 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 10:12:50 +0300 Subject: [PATCH 19/84] Skip some tests. --- .github/workflows/build.yml | 2 -- .github/workflows/main.yml | 5 ----- test/asammdf/gui/widgets/test_FileWidget.py | 4 ++++ tox.ini | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d40fbcefa..fb761081f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,8 +38,6 @@ jobs: if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update sudo apt install libegl1 libopengl0 - sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev - sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 fi pyinstaller asammdf.spec --distpath dist/${RUNNER_OS} --noconfirm --clean diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 532c8b874..3aef4c8b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,13 +21,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install packages - shell: bash run: | pip install tox tox-gh-actions - if [ "$RUNNER_OS" == "Linux" ]; then - sudo apt update - sudo apt install libegl1 libopengl0 - fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 16b8ae363..be44b4a74 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,5 +1,7 @@ #!/usr/bin/env python import pathlib +import unittest + from test.asammdf.gui import QtCore, QtTest, QtWidgets from test.asammdf.gui.test_base import TestBase from unittest import mock @@ -65,6 +67,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) self.assertIn("Plot", widget_types) + @unittest.skip def test_PushButton_LoadOfflineWindows_DSPF(self): """ Events: @@ -423,6 +426,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): set(checked_items), ) + @unittest.skip def test_PushButton_SaveOfflineWindows(self): """ Events: diff --git a/tox.ini b/tox.ini index 89436f4e8..4c7614291 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,7 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = offscreen commands = - coverage run --rcfile=.coveragerc --module pytest -s + coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc [testenv:style] From ece114acd6bbddd964f0ef39e95848be64556567 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 10:16:13 +0300 Subject: [PATCH 20/84] Add qt dependencies back. --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fb761081f..d40fbcefa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,6 +38,8 @@ jobs: if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update sudo apt install libegl1 libopengl0 + sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev + sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 fi pyinstaller asammdf.spec --distpath dist/${RUNNER_OS} --noconfirm --clean From a84f81c9a515e1be1f4b768f1f6fdfa8de164b01 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 10:19:04 +0300 Subject: [PATCH 21/84] .. --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3aef4c8b4..532c8b874 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,8 +21,13 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install packages + shell: bash run: | pip install tox tox-gh-actions + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt update + sudo apt install libegl1 libopengl0 + fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests From 57d2ffbd91dcb041b006fbae7a30e7255e487f51 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 11:02:07 +0300 Subject: [PATCH 22/84] Remove skip decorator. --- test/asammdf/gui/widgets/test_FileWidget.py | 35 ++++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index be44b4a74..84b2ae50b 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,9 +1,8 @@ #!/usr/bin/env python import pathlib -import unittest - from test.asammdf.gui import QtCore, QtTest, QtWidgets from test.asammdf.gui.test_base import TestBase +import unittest from unittest import mock from PySide6 import QtCore, QtWidgets @@ -426,7 +425,6 @@ def test_PushButton_LoadOfflineWindows_LAB(self): set(checked_items), ) - @unittest.skip def test_PushButton_SaveOfflineWindows(self): """ Events: @@ -444,6 +442,18 @@ def test_PushButton_SaveOfflineWindows(self): - Evaluate that new dspf file was saved. - Evaluate that two Plot Windows are loaded. """ + + def dropAction(): + # Move item + QtTest.QTest.mouseMove(mdi_area, drop_position) + # Release item + QtTest.QTest.mouseRelease( + mdi_area, + QtCore.Qt.LeftButton, + QtCore.Qt.NoModifier, + drop_position, + ) + # Setup valid_dspf = str(pathlib.Path(self.resource, "valid.dspf")) saved_dspf = pathlib.Path(self.test_workspace, f"{self.id()}.dspf") @@ -523,16 +533,17 @@ def test_PushButton_SaveOfflineWindows(self): "Plot" ) + QtCore.QTimer.singleShot(100, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) - # Move item - QtTest.QTest.mouseMove(mdi_area, drop_position) - # Release item - QtTest.QTest.mouseRelease( - mdi_area, - QtCore.Qt.LeftButton, - QtCore.Qt.NoModifier, - drop_position, - ) + # # Move item + # QtTest.QTest.mouseMove(mdi_area, drop_position) + # # Release item + # QtTest.QTest.mouseRelease( + # mdi_area, + # QtCore.Qt.LeftButton, + # QtCore.Qt.NoModifier, + # drop_position, + # ) break iterator += 1 From cf5915bacf08062191f1dbcfc3409a737827e109 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 12:42:27 +0300 Subject: [PATCH 23/84] Freeze pyqtgraph for now. --- test/asammdf/gui/__init__.py | 15 +++++---- test/asammdf/gui/test_base.py | 5 +++ test/asammdf/gui/widgets/test_FileWidget.py | 37 +++++++++++---------- test/requirements.txt | 4 +-- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/test/asammdf/gui/__init__.py b/test/asammdf/gui/__init__.py index 9f0d0f78c..3cb2e4ba8 100644 --- a/test/asammdf/gui/__init__.py +++ b/test/asammdf/gui/__init__.py @@ -48,16 +48,19 @@ "PyQtGraph requires one of PyQt5, PyQt6, PySide2 or PySide6; none of these packages could be imported." ) -mandatory = ["QtCore", "QtGui", "QtTest", "QtWidgets"] +mandatory = ["QtCore", "QtGui", "QtQuick", "QtTest", "QtWidgets"] QT_LIB = __import__(f"{QT_LIB}", fromlist=mandatory) if not QT_LIB: raise ModuleNotFoundError( f"At least one of the following modules are not present in {QT_LIB}: {mandatory}" ) -QtCore = getattr(QT_LIB, "QtCore") -QtGui = getattr(QT_LIB, "QtGui") -QtTest = getattr(QT_LIB, "QtTest") -QtWidgets = getattr(QT_LIB, "QtWidgets") +for m in mandatory: + globals()[m] = getattr(QT_LIB, m) -__all__ = ["QtCore", "QtGui", "QtTest", "QtWidgets"] +# QtCore = getattr(QT_LIB, "QtCore") +# QtGui = getattr(QT_LIB, "QtGui") +# QtTest = getattr(QT_LIB, "QtTest") +# QtWidgets = getattr(QT_LIB, "QtWidgets") + +__all__ = mandatory diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py index db2faf8dc..3871a454f 100644 --- a/test/asammdf/gui/test_base.py +++ b/test/asammdf/gui/test_base.py @@ -2,6 +2,7 @@ import os import shutil import sys +from test.asammdf.gui import QtCore, QtQuick import time import unittest from unittest import mock @@ -10,6 +11,10 @@ from asammdf.gui.utils import excepthook +if sys.platform == "linux": + QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts) + QtQuick.QQuickWindow.setGraphicsApi(QtQuick.QSRendererInterface.OpenGLRhi) + app = pyqtgraph.mkQApp() app.setOrganizationName("py-asammdf") app.setOrganizationDomain("py-asammdf") diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 84b2ae50b..c8bd2b5f0 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,13 +1,14 @@ #!/usr/bin/env python import pathlib -from test.asammdf.gui import QtCore, QtTest, QtWidgets -from test.asammdf.gui.test_base import TestBase +import sys import unittest from unittest import mock from PySide6 import QtCore, QtWidgets from asammdf.gui.widgets.file import FileWidget +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase class TestFileWidget(TestBase): @@ -50,7 +51,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dsp, None QtTest.QTest.mouseClick( @@ -66,7 +67,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) self.assertIn("Plot", widget_types) - @unittest.skip + @unittest.skipIf(sys.platform == 'linux', "Test is failing due to Segmentation Fault on Linux platform.") def test_PushButton_LoadOfflineWindows_DSPF(self): """ Events: @@ -145,7 +146,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 0 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -160,7 +161,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 1 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -175,7 +176,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 2 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -192,7 +193,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 3 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -218,7 +219,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 4 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -244,7 +245,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 5 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -270,7 +271,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 6 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -334,7 +335,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( @@ -362,7 +363,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( @@ -390,7 +391,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" ) as mo_getItem: @@ -476,7 +477,7 @@ def dropAction(): self.widget.activateWindow() with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -522,7 +523,7 @@ def dropAction(): # item_center # ) with mock.patch( - "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" + "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" ) as mc_WindowSelectionDialog: # Setup mc_WindowSelectionDialog.return_value.result.return_value = True @@ -550,7 +551,7 @@ def dropAction(): QtTest.QTest.qWait(10) # Press PushButton: "Save offline windows" with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" ) as mo_getSaveFileName: mo_getSaveFileName.return_value = str(saved_dspf), None QtTest.QTest.mouseClick( @@ -561,7 +562,7 @@ def dropAction(): # Event with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: diff --git a/test/requirements.txt b/test/requirements.txt index a1c067132..2cd483a85 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -9,8 +9,8 @@ canmatrix[arxml,dbc]>=0.8 lz4 typing_extensions PySide6==6.2.2 -pyqtgraph>=0.12.4; sys_platform=="win32" -pyqtgraph>=0.12.4; sys_platform=="darwin" +pyqtgraph==0.12.4; sys_platform=="win32" +pyqtgraph==0.12.4; sys_platform=="darwin" pyqtgraph==0.12.4; sys_platform=="linux" python-dateutil isal; platform_machine == "x86_64" or platform_machine == "AMD64" From 07a6a4e80bf3d22bcd0bb4fa44bc392a831d237a Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 12:59:48 +0300 Subject: [PATCH 24/84] Remove unnecessary parts. --- requirements_exe_build.txt | 4 +-- test/asammdf/gui/test_base.py | 5 --- test/asammdf/gui/widgets/test_FileWidget.py | 39 +++++++++++---------- tox.ini | 2 +- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/requirements_exe_build.txt b/requirements_exe_build.txt index cfae96855..79711617b 100644 --- a/requirements_exe_build.txt +++ b/requirements_exe_build.txt @@ -9,8 +9,8 @@ lxml natsort psutil PySide6==6.2.2 -pyqtgraph>=0.12.4; sys_platform=="win32" -pyqtgraph>=0.12.4; sys_platform=="darwin" +pyqtgraph==0.12.4; sys_platform=="win32" +pyqtgraph==0.12.4; sys_platform=="darwin" pyqtgraph==0.12.4; sys_platform=="linux" pyqtlet2 pyopengl diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py index 3871a454f..db2faf8dc 100644 --- a/test/asammdf/gui/test_base.py +++ b/test/asammdf/gui/test_base.py @@ -2,7 +2,6 @@ import os import shutil import sys -from test.asammdf.gui import QtCore, QtQuick import time import unittest from unittest import mock @@ -11,10 +10,6 @@ from asammdf.gui.utils import excepthook -if sys.platform == "linux": - QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts) - QtQuick.QQuickWindow.setGraphicsApi(QtQuick.QSRendererInterface.OpenGLRhi) - app = pyqtgraph.mkQApp() app.setOrganizationName("py-asammdf") app.setOrganizationDomain("py-asammdf") diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index c8bd2b5f0..e5c3a7cf4 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,14 +1,14 @@ #!/usr/bin/env python import pathlib import sys +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase import unittest from unittest import mock from PySide6 import QtCore, QtWidgets from asammdf.gui.widgets.file import FileWidget -from test.asammdf.gui import QtCore, QtTest, QtWidgets -from test.asammdf.gui.test_base import TestBase class TestFileWidget(TestBase): @@ -51,7 +51,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dsp, None QtTest.QTest.mouseClick( @@ -67,7 +67,10 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) self.assertIn("Plot", widget_types) - @unittest.skipIf(sys.platform == 'linux', "Test is failing due to Segmentation Fault on Linux platform.") + @unittest.skipIf( + sys.platform == "linux", + "Test is failing due to Segmentation Fault on Linux platform.", + ) def test_PushButton_LoadOfflineWindows_DSPF(self): """ Events: @@ -146,7 +149,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 0 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -161,7 +164,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 1 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -176,7 +179,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 2 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -193,7 +196,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 3 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -219,7 +222,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 4 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -245,7 +248,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 5 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -271,7 +274,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): # Case 6 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -335,7 +338,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( @@ -363,7 +366,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( @@ -391,7 +394,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" ) as mo_getItem: @@ -477,7 +480,7 @@ def dropAction(): self.widget.activateWindow() with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -523,7 +526,7 @@ def dropAction(): # item_center # ) with mock.patch( - "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" + "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" ) as mc_WindowSelectionDialog: # Setup mc_WindowSelectionDialog.return_value.result.return_value = True @@ -551,7 +554,7 @@ def dropAction(): QtTest.QTest.qWait(10) # Press PushButton: "Save offline windows" with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" ) as mo_getSaveFileName: mo_getSaveFileName.return_value = str(saved_dspf), None QtTest.QTest.mouseClick( @@ -562,7 +565,7 @@ def dropAction(): # Event with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: diff --git a/tox.ini b/tox.ini index 4c7614291..862530267 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,7 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = offscreen commands = - coverage run --rcfile=.coveragerc --module pytest + coverage run --rcfile=.coveragerc --module pytest -vv coverage report --rcfile=.coveragerc [testenv:style] From 56750bf82ccf37dee2f6385f3263e25551a22b04 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 13:28:37 +0300 Subject: [PATCH 25/84] Increase timer. --- test/asammdf/gui/widgets/test_FileWidget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index e5c3a7cf4..e9bb990a5 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -537,7 +537,7 @@ def dropAction(): "Plot" ) - QtCore.QTimer.singleShot(100, dropAction) + QtCore.QTimer.singleShot(1000, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) # # Move item # QtTest.QTest.mouseMove(mdi_area, drop_position) From 28758f05c6131a4e49021331818b9573cc7607d0 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 14:36:15 +0300 Subject: [PATCH 26/84] Debug tests. --- test/asammdf/gui/widgets/test_FileWidget.py | 5 ++++- tox.ini | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index e9bb990a5..f4fc1b111 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -537,8 +537,11 @@ def dropAction(): "Plot" ) - QtCore.QTimer.singleShot(1000, dropAction) + QtCore.QTimer.singleShot(100, dropAction) + QtCore.QTimer.singleShot(100, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) + QtCore.QTimer.singleShot(100, dropAction) + print('Debug..') # # Move item # QtTest.QTest.mouseMove(mdi_area, drop_position) # # Release item diff --git a/tox.ini b/tox.ini index 862530267..a01e6bba2 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ envlist = py38, py39, py310, py311, style, doc deps = -rtest/requirements.txt coverage + pytest-timeout passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 @@ -43,4 +44,5 @@ python = [pytest] python_classes = testpaths = test -addopts = -vv --color=yes --code-highlight=yes \ No newline at end of file +addopts = -vv --color=yes --code-highlight=yes +timeout = 500 \ No newline at end of file From e57c0b13eebe4c008fea96cb9957bc55e63d6c2c Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 15:05:04 +0300 Subject: [PATCH 27/84] .. --- src/asammdf/gui/widgets/file.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/asammdf/gui/widgets/file.py b/src/asammdf/gui/widgets/file.py index 7fcd607dc..e0b92b887 100644 --- a/src/asammdf/gui/widgets/file.py +++ b/src/asammdf/gui/widgets/file.py @@ -1175,6 +1175,7 @@ def load_channel_list(self, event=None, file_name=None): self.display_file_modified.emit(Path(self.loaded_display_file[0]).name) if errors: + print(ErrorDialog) ErrorDialog( title="Errors while loading display file", message=f"There were errors while loading the following windows : {list(errors)}", From 7f37fe6378e65e95db68394f8eec9ce5c384719f Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 15:51:09 +0300 Subject: [PATCH 28/84] retry.. --- src/asammdf/gui/widgets/file.py | 1 - test/asammdf/gui/widgets/test_FileWidget.py | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/asammdf/gui/widgets/file.py b/src/asammdf/gui/widgets/file.py index e0b92b887..7fcd607dc 100644 --- a/src/asammdf/gui/widgets/file.py +++ b/src/asammdf/gui/widgets/file.py @@ -1175,7 +1175,6 @@ def load_channel_list(self, event=None, file_name=None): self.display_file_modified.emit(Path(self.loaded_display_file[0]).name) if errors: - print(ErrorDialog) ErrorDialog( title="Errors while loading display file", message=f"There were errors while loading the following windows : {list(errors)}", diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index f4fc1b111..2cb1d0c5d 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -71,7 +71,8 @@ def test_PushButton_LoadOfflineWindows_DSP(self): sys.platform == "linux", "Test is failing due to Segmentation Fault on Linux platform.", ) - def test_PushButton_LoadOfflineWindows_DSPF(self): + @mock.patch("asammdf.gui.widgets.file.ErrorDialog") + def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): """ Events: - Open 'FileWidget' with valid measurement. @@ -293,6 +294,8 @@ def test_PushButton_LoadOfflineWindows_DSPF(self): ) self.assertListEqual(["Numeric", "Plot", "Tabular"], widget_types) + mc_file_ErrorDialog.assert_not_called() + def test_PushButton_LoadOfflineWindows_LAB(self): """ Events: @@ -450,6 +453,7 @@ def test_PushButton_SaveOfflineWindows(self): def dropAction(): # Move item QtTest.QTest.mouseMove(mdi_area, drop_position) + QtTest.QTest.qWait(50) # Release item QtTest.QTest.mouseRelease( mdi_area, @@ -541,7 +545,7 @@ def dropAction(): QtCore.QTimer.singleShot(100, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) QtCore.QTimer.singleShot(100, dropAction) - print('Debug..') + print("Debug..") # # Move item # QtTest.QTest.mouseMove(mdi_area, drop_position) # # Release item From 8ec95548a75402c8b46cd4f0bd27aa17925c417d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 15:56:04 +0300 Subject: [PATCH 29/84] .. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index a01e6bba2..ad733fd24 100644 --- a/tox.ini +++ b/tox.ini @@ -17,7 +17,7 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = offscreen commands = - coverage run --rcfile=.coveragerc --module pytest -vv + coverage run --rcfile=.coveragerc --module pytest -s -vv coverage report --rcfile=.coveragerc [testenv:style] From ca6415657c1d40e8e023ad3e93f9d6ff02292f0d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 16:10:42 +0300 Subject: [PATCH 30/84] Handle UnboundLocalError --- src/asammdf/gui/widgets/plot.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/asammdf/gui/widgets/plot.py b/src/asammdf/gui/widgets/plot.py index 9e3c0d195..1342f9a99 100644 --- a/src/asammdf/gui/widgets/plot.py +++ b/src/asammdf/gui/widgets/plot.py @@ -3881,7 +3881,7 @@ def __init__( if x_axis == "time": fmt = self._settings.value("plot_xaxis") - if fmt == "seconds": + if fmt == "seconds" or not fmt: fmt = "phys" else: fmt = "phys" @@ -6177,12 +6177,13 @@ def open_menu(self, point): QtCore.QSettings().setValue("plot_cursor_precision", precision) def update_value(self): + cursor_info_text = "" if not self.plot.region: if self.plot.cursor1 is not None: position = self.plot.cursor1.value() fmt = self.plot.x_axis.format - if fmt == "phys": + if fmt == "phys" or not fmt: if self.precision == -1: cursor_info_text = f"{self.name} = {position}{self.unit}" else: @@ -6195,7 +6196,9 @@ def update_value(self): seconds=position ) cursor_info_text = f"{self.name} = {position_date}" - self.setText(cursor_info_text) + + if cursor_info_text: + self.setText(cursor_info_text) else: self.setText("") From 1fa289c6ebbcc8d9a5d47d37244de368afc6a8d7 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 16:33:56 +0300 Subject: [PATCH 31/84] Fix bugs. --- src/asammdf/blocks/utils.py | 3 ++- src/asammdf/gui/widgets/file.py | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/asammdf/blocks/utils.py b/src/asammdf/blocks/utils.py index ccd41391c..155b20c38 100644 --- a/src/asammdf/blocks/utils.py +++ b/src/asammdf/blocks/utils.py @@ -2450,7 +2450,8 @@ def load_lab(file): sections[section_name] = s else: - s.append(line) + if 's' in locals(): + s.append(line) return {name: channels for name, channels in sections.items() if channels} diff --git a/src/asammdf/gui/widgets/file.py b/src/asammdf/gui/widgets/file.py index 7fcd607dc..a54f52513 100644 --- a/src/asammdf/gui/widgets/file.py +++ b/src/asammdf/gui/widgets/file.py @@ -1039,19 +1039,19 @@ def load_channel_list(self, event=None, file_name=None): elif extension == ".lab": info = load_lab(file_name) - if info: - section, ok = QtWidgets.QInputDialog.getItem( - None, - "Select section", - "Available sections:", - list(info), - 0, - False, - ) - if ok: - channels = info[section] - else: - return + if not info: + return + section, ok = QtWidgets.QInputDialog.getItem( + None, + "Select section", + "Available sections:", + list(info), + 0, + False, + ) + if not ok: + return + channels = info[section] elif extension in (".cfg", ".txt", ".dspf"): with open(file_name, "r") as infile: From f7758eefb1e949a98b6ef82540511ceb99913b96 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 16:40:51 +0300 Subject: [PATCH 32/84] Increase time for drag and drop test. --- test/asammdf/gui/widgets/test_FileWidget.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 2cb1d0c5d..32e23337b 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -541,11 +541,8 @@ def dropAction(): "Plot" ) - QtCore.QTimer.singleShot(100, dropAction) - QtCore.QTimer.singleShot(100, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) - QtCore.QTimer.singleShot(100, dropAction) - print("Debug..") + QtCore.QTimer.singleShot(1000, dropAction) # # Move item # QtTest.QTest.mouseMove(mdi_area, drop_position) # # Release item From 743affcac95717a25a00efc7302ec10630cf4ab6 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 18:30:16 +0300 Subject: [PATCH 33/84] Try to use QThread for MouseMove action. --- test/asammdf/gui/widgets/test_FileWidget.py | 78 +++++++++++++-------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 32e23337b..439bdc408 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,14 +1,29 @@ #!/usr/bin/env python import pathlib import sys -from test.asammdf.gui import QtCore, QtTest, QtWidgets -from test.asammdf.gui.test_base import TestBase +import time import unittest from unittest import mock from PySide6 import QtCore, QtWidgets from asammdf.gui.widgets.file import FileWidget +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase + + +class DragThread(QtCore.QThread): + def __init__(self, widget, position): + super().__init__() + self.widget = widget + self.position = position + + def run(self): + # Wait for a short delay to ensure that QDrag.exec_() is running. + time.sleep(0.1) + + # Simulate a mouse move event on the destination widget to move the drag feedback to the correct position. + QtTest.QTest.mouseMove(self.widget, self.position) class TestFileWidget(TestBase): @@ -51,7 +66,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dsp, None QtTest.QTest.mouseClick( @@ -150,7 +165,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 0 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -165,7 +180,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 1 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -180,7 +195,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 2 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -197,7 +212,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 3 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -223,7 +238,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 4 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -249,7 +264,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 5 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -275,7 +290,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 6 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -341,7 +356,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( @@ -369,7 +384,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( @@ -397,7 +412,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" ) as mo_getItem: @@ -452,15 +467,16 @@ def test_PushButton_SaveOfflineWindows(self): def dropAction(): # Move item - QtTest.QTest.mouseMove(mdi_area, drop_position) + QtTest.QTest.mouseMove(mdi_area.viewport(), drop_position) QtTest.QTest.qWait(50) # Release item QtTest.QTest.mouseRelease( - mdi_area, + mdi_area.viewport(), QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, drop_position, ) + QtTest.QTest.qWait(50) # Setup valid_dspf = str(pathlib.Path(self.resource, "valid.dspf")) @@ -480,11 +496,11 @@ def dropAction(): None, # hide_missing_channels None, # hide_disabled_channels ) - self.widget.showMaximized() + self.widget.showNormal() self.widget.activateWindow() with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -515,22 +531,22 @@ def dropAction(): if item.text(0) == "ASAM.M.SCALAR.UBYTE.VTAB_RANGE_NO_DEFAULT_VALUE": item.setSelected(True) - # item_rect = channels_tree.visualItemRect(item) - # drag_position = item_rect.center() + item_rect = channels_tree.visualItemRect(item) + drag_position = item_rect.center() drop_position = mdi_area.viewport().rect().center() - QtCore.QPoint( 200, 200 ) # Press on item # Don't know how to trigger startDrag for now. - # QtTest.QTest.mousePress( - # channels_tree, - # QtCore.Qt.LeftButton, - # QtCore.Qt.NoModifier, - # item_center - # ) + QtTest.QTest.mousePress( + channels_tree.viewport(), + QtCore.Qt.LeftButton, + QtCore.Qt.NoModifier, + drag_position + ) with mock.patch( - "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" + "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" ) as mc_WindowSelectionDialog: # Setup mc_WindowSelectionDialog.return_value.result.return_value = True @@ -541,8 +557,10 @@ def dropAction(): "Plot" ) + thread = DragThread(mdi_area, drop_position) + thread.start() + QtCore.QTimer.singleShot(10, dropAction) channels_tree.startDrag(QtCore.Qt.MoveAction) - QtCore.QTimer.singleShot(1000, dropAction) # # Move item # QtTest.QTest.mouseMove(mdi_area, drop_position) # # Release item @@ -555,10 +573,10 @@ def dropAction(): break iterator += 1 - QtTest.QTest.qWait(10) + thread.wait() # Press PushButton: "Save offline windows" with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" ) as mo_getSaveFileName: mo_getSaveFileName.return_value = str(saved_dspf), None QtTest.QTest.mouseClick( @@ -569,7 +587,7 @@ def dropAction(): # Event with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: From 8148cb042f69b89b455bfe8f91c51955103d7639 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 22:44:03 +0300 Subject: [PATCH 34/84] Remove QT_QPA_PLATFORM --- src/asammdf/blocks/utils.py | 2 +- test/asammdf/gui/widgets/test_FileWidget.py | 130 ++++++++++---------- tox.ini | 3 +- 3 files changed, 69 insertions(+), 66 deletions(-) diff --git a/src/asammdf/blocks/utils.py b/src/asammdf/blocks/utils.py index 155b20c38..8322aabab 100644 --- a/src/asammdf/blocks/utils.py +++ b/src/asammdf/blocks/utils.py @@ -2450,7 +2450,7 @@ def load_lab(file): sections[section_name] = s else: - if 's' in locals(): + if "s" in locals(): s.append(line) return {name: channels for name, channels in sections.items() if channels} diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 439bdc408..dc6840136 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -1,6 +1,8 @@ #!/usr/bin/env python import pathlib import sys +from test.asammdf.gui import QtCore, QtTest, QtWidgets +from test.asammdf.gui.test_base import TestBase import time import unittest from unittest import mock @@ -8,22 +10,54 @@ from PySide6 import QtCore, QtWidgets from asammdf.gui.widgets.file import FileWidget -from test.asammdf.gui import QtCore, QtTest, QtWidgets -from test.asammdf.gui.test_base import TestBase -class DragThread(QtCore.QThread): - def __init__(self, widget, position): - super().__init__() - self.widget = widget - self.position = position +class DragAndDrop: + class MoveThread(QtCore.QThread): + def __init__(self, widget, position=None, step=None): + super().__init__() + self.widget = widget + self.position = position + self.step = step + + def run(self): + time.sleep(0.1) + if not self.step: + QtTest.QTest.mouseMove(self.widget, self.position) + else: + for step in range(self.step): + QtTest.QTest.mouseMove( + self.widget, self.position + QtCore.QPoint(step, step) + ) + QtTest.QTest.qWait(2) + QtTest.QTest.qWait(10) - def run(self): - # Wait for a short delay to ensure that QDrag.exec_() is running. - time.sleep(0.1) + def __init__(self, source_widget, destination_widget, source_pos, destination_pos): + # Press on Source Widget + QtTest.QTest.mousePress( + source_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, source_pos + ) + QtTest.QTest.qWait(50) + # Drag few pixels in order to detect startDrag event + # drag_thread = DragAndDrop.MoveThread(widget=source_widget, position=source_pos, step=50) + # drag_thread.start() + # Move to Destination Widget + move_thread = DragAndDrop.MoveThread( + widget=destination_widget, position=destination_pos + ) + move_thread.start() + source_widget.startDrag(QtCore.Qt.MoveAction) + # Release + QtTest.QTest.mouseRelease( + destination_widget, + QtCore.Qt.LeftButton, + QtCore.Qt.NoModifier, + destination_pos, + ) + QtTest.QTest.qWait(100) - # Simulate a mouse move event on the destination widget to move the drag feedback to the correct position. - QtTest.QTest.mouseMove(self.widget, self.position) + # drag_thread.wait() + move_thread.wait() class TestFileWidget(TestBase): @@ -66,7 +100,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): ) with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = valid_dsp, None QtTest.QTest.mouseClick( @@ -165,7 +199,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 0 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_0"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -180,7 +214,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 1 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_1"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -195,7 +229,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 2 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_2"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -212,7 +246,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 3 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_3"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -238,7 +272,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 4 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_4"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -264,7 +298,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 5 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_5"): with mock.patch( - "asammdf.gui.widgets.file.ErrorDialog" + "asammdf.gui.widgets.file.ErrorDialog" ) as mc_ErrorDialog, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -290,7 +324,7 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): # Case 6 with self.subTest("test_PushButton_LoadOfflineWindows_DSPF_6"): with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -356,7 +390,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_empty_section_lab, None QtTest.QTest.mouseClick( @@ -384,7 +418,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 1: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_1"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: mo_getOpenFileName.return_value = invalid_missing_section_lab, None QtTest.QTest.mouseClick( @@ -412,7 +446,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): # Case 2: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_2"): with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QInputDialog.getItem" ) as mo_getItem: @@ -464,20 +498,6 @@ def test_PushButton_SaveOfflineWindows(self): - Evaluate that new dspf file was saved. - Evaluate that two Plot Windows are loaded. """ - - def dropAction(): - # Move item - QtTest.QTest.mouseMove(mdi_area.viewport(), drop_position) - QtTest.QTest.qWait(50) - # Release item - QtTest.QTest.mouseRelease( - mdi_area.viewport(), - QtCore.Qt.LeftButton, - QtCore.Qt.NoModifier, - drop_position, - ) - QtTest.QTest.qWait(50) - # Setup valid_dspf = str(pathlib.Path(self.resource, "valid.dspf")) saved_dspf = pathlib.Path(self.test_workspace, f"{self.id()}.dspf") @@ -500,7 +520,7 @@ def dropAction(): self.widget.activateWindow() with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: @@ -537,16 +557,8 @@ def dropAction(): 200, 200 ) - # Press on item - # Don't know how to trigger startDrag for now. - QtTest.QTest.mousePress( - channels_tree.viewport(), - QtCore.Qt.LeftButton, - QtCore.Qt.NoModifier, - drag_position - ) with mock.patch( - "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" + "asammdf.gui.widgets.mdi_area.WindowSelectionDialog" ) as mc_WindowSelectionDialog: # Setup mc_WindowSelectionDialog.return_value.result.return_value = True @@ -557,26 +569,18 @@ def dropAction(): "Plot" ) - thread = DragThread(mdi_area, drop_position) - thread.start() - QtCore.QTimer.singleShot(10, dropAction) - channels_tree.startDrag(QtCore.Qt.MoveAction) - # # Move item - # QtTest.QTest.mouseMove(mdi_area, drop_position) - # # Release item - # QtTest.QTest.mouseRelease( - # mdi_area, - # QtCore.Qt.LeftButton, - # QtCore.Qt.NoModifier, - # drop_position, - # ) + DragAndDrop( + source_widget=channels_tree, + destination_widget=mdi_area.viewport(), + source_pos=drag_position, + destination_pos=drop_position, + ) break iterator += 1 - thread.wait() # Press PushButton: "Save offline windows" with mock.patch( - "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" + "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getSaveFileName" ) as mo_getSaveFileName: mo_getSaveFileName.return_value = str(saved_dspf), None QtTest.QTest.mouseClick( @@ -587,7 +591,7 @@ def dropAction(): # Event with mock.patch.object( - self.widget, "load_window", wraps=self.widget.load_window + self.widget, "load_window", wraps=self.widget.load_window ) as mo_load_window, mock.patch( "asammdf.gui.widgets.file.QtWidgets.QFileDialog.getOpenFileName" ) as mo_getOpenFileName: diff --git a/tox.ini b/tox.ini index ad733fd24..bdd46d2f5 100644 --- a/tox.ini +++ b/tox.ini @@ -15,9 +15,8 @@ deps = passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 - QT_QPA_PLATFORM = offscreen commands = - coverage run --rcfile=.coveragerc --module pytest -s -vv + coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc [testenv:style] From cfea3dcc1d225c28b7f2c7bb86c57d79b9bf1580 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Tue, 18 Apr 2023 23:02:39 +0300 Subject: [PATCH 35/84] Try to set QT_QPA_PLATFORM dynamically --- tox.ini | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index bdd46d2f5..db5d96cec 100644 --- a/tox.ini +++ b/tox.ini @@ -12,13 +12,22 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY +passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM setenv = QT_DEBUG_PLUGINS = 1 + LINUX=linux + MACOS=macos + WINDOWS=windows + QT_QPA_PLATFORM={env:QT_QPA_PLATFORM:{[testenv:get_platform]commands}} commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc +[testenv:get_platform] +commands = + # Determine the platform and set the value of QT_QPA_PLATFORM accordingly + sh -c 'if [ "$(uname)" == "$LINUX" ]; then echo "wayland"; elif [ "$(uname)" == "$MACOS" ]; then echo "cocoa"; elif [ "$(uname)" == "$WINDOWS" ]; then echo "windows"; fi' + [testenv:style] deps = black From 9b6d5f6725c9d524f218dc7abd6ddfe917151664 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 08:22:28 +0300 Subject: [PATCH 36/84] Move Release operation in QThread. --- test/asammdf/gui/widgets/test_FileWidget.py | 29 ++++++++++++--------- tox.ini | 11 +------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index dc6840136..116e05538 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -14,11 +14,12 @@ class DragAndDrop: class MoveThread(QtCore.QThread): - def __init__(self, widget, position=None, step=None): + def __init__(self, widget, position=None, step=None, drop=False): super().__init__() self.widget = widget self.position = position self.step = step + self.drop = drop def run(self): time.sleep(0.1) @@ -30,31 +31,32 @@ def run(self): self.widget, self.position + QtCore.QPoint(step, step) ) QtTest.QTest.qWait(2) - QtTest.QTest.qWait(10) + QtTest.QTest.qWait(50) + if self.drop: + QtTest.QTest.mouseRelease( + self.widget, + QtCore.Qt.LeftButton, + QtCore.Qt.NoModifier, + self.position, + ) + QtTest.QTest.qWait(10) def __init__(self, source_widget, destination_widget, source_pos, destination_pos): # Press on Source Widget QtTest.QTest.mousePress( source_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, source_pos ) - QtTest.QTest.qWait(50) # Drag few pixels in order to detect startDrag event # drag_thread = DragAndDrop.MoveThread(widget=source_widget, position=source_pos, step=50) # drag_thread.start() # Move to Destination Widget move_thread = DragAndDrop.MoveThread( - widget=destination_widget, position=destination_pos + widget=destination_widget, position=destination_pos, drop=True ) move_thread.start() + source_widget.startDrag(QtCore.Qt.MoveAction) - # Release - QtTest.QTest.mouseRelease( - destination_widget, - QtCore.Qt.LeftButton, - QtCore.Qt.NoModifier, - destination_pos, - ) - QtTest.QTest.qWait(100) + QtTest.QTest.qWait(50) # drag_thread.wait() move_thread.wait() @@ -483,6 +485,7 @@ def test_PushButton_LoadOfflineWindows_LAB(self): def test_PushButton_SaveOfflineWindows(self): """ + Events: - Open 'FileWidget' with valid measurement. - Press PushButton: "Load offline windows" @@ -571,7 +574,7 @@ def test_PushButton_SaveOfflineWindows(self): DragAndDrop( source_widget=channels_tree, - destination_widget=mdi_area.viewport(), + destination_widget=mdi_area, source_pos=drag_position, destination_pos=drop_position, ) diff --git a/tox.ini b/tox.ini index db5d96cec..bdd46d2f5 100644 --- a/tox.ini +++ b/tox.ini @@ -12,22 +12,13 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM +passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 - LINUX=linux - MACOS=macos - WINDOWS=windows - QT_QPA_PLATFORM={env:QT_QPA_PLATFORM:{[testenv:get_platform]commands}} commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc -[testenv:get_platform] -commands = - # Determine the platform and set the value of QT_QPA_PLATFORM accordingly - sh -c 'if [ "$(uname)" == "$LINUX" ]; then echo "wayland"; elif [ "$(uname)" == "$MACOS" ]; then echo "cocoa"; elif [ "$(uname)" == "$WINDOWS" ]; then echo "windows"; fi' - [testenv:style] deps = black From 2e408da0d49ea0403e30e24fe6500a7939ef646d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 08:30:21 +0300 Subject: [PATCH 37/84] Debug --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index bdd46d2f5..a1707c19d 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,7 @@ passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 commands = - coverage run --rcfile=.coveragerc --module pytest + coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc [testenv:style] From 8dfd556e708f0dd15af97e5c9b8ea1a43244d628 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 09:13:54 +0300 Subject: [PATCH 38/84] Set env variable: QT_QPA_PLATFORM --- .github/workflows/main.yml | 6 +++++- tox.ini | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 532c8b874..abdddd691 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,5 +31,9 @@ jobs: # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests - run: tox + run: | + if [ "$RUNNER_OS" == "Linux" ]; then + export QT_QPA_PLATFORM=xcb + fi + tox diff --git a/tox.ini b/tox.ini index a1707c19d..e62102b16 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY +passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM setenv = QT_DEBUG_PLUGINS = 1 commands = From 2af47eb511b50b5455c89983a0134df542332933 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 09:22:44 +0300 Subject: [PATCH 39/84] .. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index abdddd691..a7d8c3d58 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,6 +31,7 @@ jobs: # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests + shell: bash run: | if [ "$RUNNER_OS" == "Linux" ]; then export QT_QPA_PLATFORM=xcb From 1dc79ee47ad415088143dae75a167b25e86a261d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 09:29:56 +0300 Subject: [PATCH 40/84] Just test it for linux --- .github/workflows/main.yml | 4 ---- tox.ini | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a7d8c3d58..680933175 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,10 +31,6 @@ jobs: # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests - shell: bash run: | - if [ "$RUNNER_OS" == "Linux" ]; then - export QT_QPA_PLATFORM=xcb - fi tox diff --git a/tox.ini b/tox.ini index e62102b16..aed6debff 100644 --- a/tox.ini +++ b/tox.ini @@ -12,9 +12,10 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM +passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 + QT_QPA_PLATFORM = xcb commands = coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From cfd8229a9cc0e53ae7003f535acd2a1ff20ade8e Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 09:39:09 +0300 Subject: [PATCH 41/84] .. --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 680933175..596b34620 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,6 +27,11 @@ jobs: if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update sudo apt install libegl1 libopengl0 + sudo apt update + sudo apt install libegl1 libopengl0 + sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev + sudo apt-get install libxcb-xinerama0 + sudo apt-get install libxkbcommon-x11-0 fi # see: https://github.com/ymyzk/tox-gh-actions From be95cf66f1a211fb90f590fc24e8ec1a8e85962d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 09:43:37 +0300 Subject: [PATCH 42/84] retry.. --- .github/workflows/main.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 596b34620..eb52e05c1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,9 +26,7 @@ jobs: pip install tox tox-gh-actions if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update - sudo apt install libegl1 libopengl0 - sudo apt update - sudo apt install libegl1 libopengl0 + sudo apt-get install libegl1 libopengl0 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 From c88c17dc865e683314727fd5b48a68f61aa57ca5 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:20:09 +0300 Subject: [PATCH 43/84] Retry.. --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index aed6debff..46e2acf4e 100644 --- a/tox.ini +++ b/tox.ini @@ -16,6 +16,7 @@ passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb + DISPLAY = :1.0 commands = coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From 836caa8b18d14d2466eaf26779c79b4950189d68 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:28:03 +0300 Subject: [PATCH 44/84] .. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eb52e05c1..71b2d75dd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,6 +30,7 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 + xhost +local:* fi # see: https://github.com/ymyzk/tox-gh-actions From 2baf8f2563f0ce0dac2188a13328fbcb0f1abca2 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:31:46 +0300 Subject: [PATCH 45/84] Retry... --- .github/workflows/main.yml | 2 +- tox.ini | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 71b2d75dd..e6dbe8093 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,7 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 - xhost +local:* + startx fi # see: https://github.com/ymyzk/tox-gh-actions diff --git a/tox.ini b/tox.ini index 46e2acf4e..aed6debff 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,6 @@ passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb - DISPLAY = :1.0 commands = coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From 3f4c2dc766cad4b28de2489c92a0151051479db6 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:36:57 +0300 Subject: [PATCH 46/84] .. --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e6dbe8093..60f3fc705 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,6 +30,8 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 + sudo apt-get install x11-xserver-utils + xhost +local:* startx fi From 47815f95266e5803c956f0cd0268e343f22d5f0e Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:41:39 +0300 Subject: [PATCH 47/84] Start X Server before. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 60f3fc705..c53dd7f26 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,8 +31,8 @@ jobs: sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 sudo apt-get install x11-xserver-utils - xhost +local:* startx + xhost +local:* fi # see: https://github.com/ymyzk/tox-gh-actions From a80e5adb8fb4e12aae24495a2190fe825d5bc7c4 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:46:11 +0300 Subject: [PATCH 48/84] Add Xinit --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c53dd7f26..246aedd41 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,6 +31,7 @@ jobs: sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 sudo apt-get install x11-xserver-utils + sudo apt-get install xinit startx xhost +local:* fi From 6e57c83a4dbd12bde2383e454c839d7057b3556f Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 10:56:17 +0300 Subject: [PATCH 49/84] Start X Server with sudo --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 246aedd41..383d0f3ac 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: sudo apt-get install libxkbcommon-x11-0 sudo apt-get install x11-xserver-utils sudo apt-get install xinit - startx + sudo startx xhost +local:* fi From 50c833f125f6b67866c940340c519e2ee861ef01 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 11:42:19 +0300 Subject: [PATCH 50/84] Install zorg. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 383d0f3ac..bd10bc6a4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,6 +32,7 @@ jobs: sudo apt-get install libxkbcommon-x11-0 sudo apt-get install x11-xserver-utils sudo apt-get install xinit + sudo apt-get install xorg sudo startx xhost +local:* fi From 3545a00693afbd6892696ee5a2938b11ff36a7d5 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 12:33:05 +0300 Subject: [PATCH 51/84] Debug. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bd10bc6a4..5e46a8ed5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,6 +25,7 @@ jobs: run: | pip install tox tox-gh-actions if [ "$RUNNER_OS" == "Linux" ]; then + echo $SSH_TTY sudo apt update sudo apt-get install libegl1 libopengl0 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev From 366e5e4ab9108bdb5e5c942c9d9f0168c9ca98d3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 12:36:00 +0300 Subject: [PATCH 52/84] .. --- .github/workflows/main.yml | 5 ----- tox.ini | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5e46a8ed5..9c8364353 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,11 +31,6 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 - sudo apt-get install x11-xserver-utils - sudo apt-get install xinit - sudo apt-get install xorg - sudo startx - xhost +local:* fi # see: https://github.com/ymyzk/tox-gh-actions diff --git a/tox.ini b/tox.ini index aed6debff..525c039d9 100644 --- a/tox.ini +++ b/tox.ini @@ -14,6 +14,7 @@ deps = pytest-timeout passenv = DISPLAY,XAUTHORITY setenv = + DISPLAY = :0 QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = From bc23cf8e7882d5de05db5e4ac437645cd358b6c3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 12:43:53 +0300 Subject: [PATCH 53/84] Debug.. --- .github/workflows/main.yml | 2 +- tox.ini | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9c8364353..04c3e8d40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,12 +25,12 @@ jobs: run: | pip install tox tox-gh-actions if [ "$RUNNER_OS" == "Linux" ]; then - echo $SSH_TTY sudo apt update sudo apt-get install libegl1 libopengl0 sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 + sudo apt-get install xorg fi # see: https://github.com/ymyzk/tox-gh-actions diff --git a/tox.ini b/tox.ini index 525c039d9..de02a8d13 100644 --- a/tox.ini +++ b/tox.ini @@ -18,6 +18,8 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = + echo $SSH_TTY + ps aux | grep Xorg coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From 454b156506d20a0bb8787c359ef3ec3e7a47530c Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 12:53:57 +0300 Subject: [PATCH 54/84] debug.. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index de02a8d13..f672db239 100644 --- a/tox.ini +++ b/tox.ini @@ -18,7 +18,7 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = - echo $SSH_TTY + sh -c 'echo $SSH_TTY' ps aux | grep Xorg coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc From 10e2e34313857a0aeb13d98eac263587d70fde14 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 12:56:59 +0300 Subject: [PATCH 55/84] ...... --- tox.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tox.ini b/tox.ini index f672db239..f250a7b28 100644 --- a/tox.ini +++ b/tox.ini @@ -22,6 +22,9 @@ commands = ps aux | grep Xorg coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc +allowlist_externals = + sh + echo [testenv:style] deps = From eb6d25ab3ba150f2320da4710300bec4e3899e37 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:01:13 +0300 Subject: [PATCH 56/84] ... --- tox.ini | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tox.ini b/tox.ini index f250a7b28..5ce62d9d2 100644 --- a/tox.ini +++ b/tox.ini @@ -18,13 +18,11 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = - sh -c 'echo $SSH_TTY' ps aux | grep Xorg coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc allowlist_externals = - sh - echo + ps [testenv:style] deps = From 4540a277a7245524d8e2b4dca91270eed1d481a3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:15:51 +0300 Subject: [PATCH 57/84] retrieve info.. --- tox.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index 5ce62d9d2..d51cec9d4 100644 --- a/tox.ini +++ b/tox.ini @@ -18,11 +18,11 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = - ps aux | grep Xorg + echo $XDG_SESSION_TYPE coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc allowlist_externals = - ps + echo [testenv:style] deps = From 3aaaf412704344ef0765f02af481ab2d4b0ee295 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:18:49 +0300 Subject: [PATCH 58/84] .... --- tox.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index d51cec9d4..c9292733b 100644 --- a/tox.ini +++ b/tox.ini @@ -18,11 +18,11 @@ setenv = QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = - echo $XDG_SESSION_TYPE + sh -c 'echo $XDG_SESSION_TYPE' coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc allowlist_externals = - echo + sh [testenv:style] deps = From 3f5b427093c00c7bf25217ba8b0f9d694eecbf36 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:38:53 +0300 Subject: [PATCH 59/84] Magic.. --- .github/workflows/main.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 04c3e8d40..8eb31206e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,10 +31,24 @@ jobs: sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 sudo apt-get install xorg + sudo apt-get install -y xvfb fi + + - name: Start Xvfb + run: | + if [ "$RUNNER_OS" == "Linux" ]; then + Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & + export DISPLAY=:0 + fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests run: | tox + + - name: Stop Xvfb + run: | + if [ "$RUNNER_OS" == "Linux" ]; then + killall Xvfb + fi From e0e2b011a439655688d1b87c7c961ae0606f9d6a Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:43:53 +0300 Subject: [PATCH 60/84] May be this one gold commit?! --- .github/workflows/main.yml | 2 +- tox.ini | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8eb31206e..e24453ce4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,6 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 - sudo apt-get install xorg sudo apt-get install -y xvfb fi @@ -39,6 +38,7 @@ jobs: if [ "$RUNNER_OS" == "Linux" ]; then Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & export DISPLAY=:0 + export QT_QPA_PLATFORM=xcb fi # see: https://github.com/ymyzk/tox-gh-actions diff --git a/tox.ini b/tox.ini index c9292733b..bdd46d2f5 100644 --- a/tox.ini +++ b/tox.ini @@ -14,15 +14,10 @@ deps = pytest-timeout passenv = DISPLAY,XAUTHORITY setenv = - DISPLAY = :0 QT_DEBUG_PLUGINS = 1 - QT_QPA_PLATFORM = xcb commands = - sh -c 'echo $XDG_SESSION_TYPE' - coverage run --rcfile=.coveragerc --module pytest -s + coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc -allowlist_externals = - sh [testenv:style] deps = From a35e30800891b8ca7abfe78c11d8b448658fb121 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:48:47 +0300 Subject: [PATCH 61/84] Add conditions. --- .github/workflows/main.yml | 9 +++------ tox.ini | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e24453ce4..6947e02d6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,12 +34,11 @@ jobs: fi - name: Start Xvfb + if: matrix.os == 'ubuntu-22.04' run: | - if [ "$RUNNER_OS" == "Linux" ]; then Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & export DISPLAY=:0 export QT_QPA_PLATFORM=xcb - fi # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests @@ -47,8 +46,6 @@ jobs: tox - name: Stop Xvfb - run: | - if [ "$RUNNER_OS" == "Linux" ]; then - killall Xvfb - fi + if: matrix.os == 'ubuntu-22.04' + run: killall Xvfb diff --git a/tox.ini b/tox.ini index bdd46d2f5..f8d8d45b4 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY +passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM setenv = QT_DEBUG_PLUGINS = 1 commands = From ed52bb595f1944800f8bb76a87dcdeb0646c7adf Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:51:59 +0300 Subject: [PATCH 62/84] Retry.. --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index f8d8d45b4..8450dd19a 100644 --- a/tox.ini +++ b/tox.ini @@ -15,6 +15,7 @@ deps = passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM setenv = QT_DEBUG_PLUGINS = 1 + QT_QPA_PLATFORM = xcb commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc From 51835afc30e5c17496c251a46e84b9cce7619e61 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:55:12 +0300 Subject: [PATCH 63/84] Retry.. --- .github/workflows/main.yml | 1 + tox.ini | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6947e02d6..dcabec7a9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,6 +30,7 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 + sudo apt-get install xorg sudo apt-get install -y xvfb fi diff --git a/tox.ini b/tox.ini index 8450dd19a..f8d8d45b4 100644 --- a/tox.ini +++ b/tox.ini @@ -15,7 +15,6 @@ deps = passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM setenv = QT_DEBUG_PLUGINS = 1 - QT_QPA_PLATFORM = xcb commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc From cf79363e1c9d5bb829958fe06a3e38a826c473c4 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 13:58:07 +0300 Subject: [PATCH 64/84] .. --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dcabec7a9..ab618c09e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,7 +30,6 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 - sudo apt-get install xorg sudo apt-get install -y xvfb fi @@ -38,7 +37,7 @@ jobs: if: matrix.os == 'ubuntu-22.04' run: | Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & - export DISPLAY=:0 + export DISPLAY=:0 & export QT_QPA_PLATFORM=xcb # see: https://github.com/ymyzk/tox-gh-actions From 371aea852e0a14f6dfd7efee506a5c26c6cd5cbe Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 14:02:26 +0300 Subject: [PATCH 65/84] Revert ?! --- .github/workflows/main.yml | 4 ++-- tox.ini | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ab618c09e..5f291c82f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,6 +30,7 @@ jobs: sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev sudo apt-get install libxcb-xinerama0 sudo apt-get install libxkbcommon-x11-0 + sudo apt-get install xorg sudo apt-get install -y xvfb fi @@ -37,8 +38,7 @@ jobs: if: matrix.os == 'ubuntu-22.04' run: | Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & - export DISPLAY=:0 & - export QT_QPA_PLATFORM=xcb + export DISPLAY=:0 # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests diff --git a/tox.ini b/tox.ini index f8d8d45b4..7a591c90c 100644 --- a/tox.ini +++ b/tox.ini @@ -12,9 +12,10 @@ deps = -rtest/requirements.txt coverage pytest-timeout -passenv = DISPLAY,XAUTHORITY,QT_QPA_PLATFORM +passenv = DISPLAY,XAUTHORITY setenv = QT_DEBUG_PLUGINS = 1 + QT_QPA_PLATFORM = xcb commands = coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc From fcfd8a5201b48cbb0a55bc24639b9285630cb4ef Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 14:26:00 +0300 Subject: [PATCH 66/84] Se variables manually. --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 7a591c90c..525c039d9 100644 --- a/tox.ini +++ b/tox.ini @@ -14,10 +14,11 @@ deps = pytest-timeout passenv = DISPLAY,XAUTHORITY setenv = + DISPLAY = :0 QT_DEBUG_PLUGINS = 1 QT_QPA_PLATFORM = xcb commands = - coverage run --rcfile=.coveragerc --module pytest + coverage run --rcfile=.coveragerc --module pytest -s coverage report --rcfile=.coveragerc [testenv:style] From aef8b726c095e1c212a363d5da0ea116e92acae2 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 14:41:55 +0300 Subject: [PATCH 67/84] Try to set it in python file. --- test/asammdf/gui/test_base.py | 9 +++++++++ tox.ini | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py index db2faf8dc..d46568ef4 100644 --- a/test/asammdf/gui/test_base.py +++ b/test/asammdf/gui/test_base.py @@ -10,6 +10,15 @@ from asammdf.gui.utils import excepthook +if sys.platform == 'win32': + os.environ['QT_QPA_PLATFORM'] = 'windows' +elif sys.platform == 'linux': + os.environ['QT_QPA_PLATFORM'] = 'xcb' +elif sys.platform == 'darwin': + os.environ['QT_QPA_PLATFORM'] = 'cocoa' +else: + os.environ['QT_QPA_PLATFORM'] = 'windows' + app = pyqtgraph.mkQApp() app.setOrganizationName("py-asammdf") app.setOrganizationDomain("py-asammdf") diff --git a/tox.ini b/tox.ini index 525c039d9..fe6ec4888 100644 --- a/tox.ini +++ b/tox.ini @@ -16,9 +16,8 @@ passenv = DISPLAY,XAUTHORITY setenv = DISPLAY = :0 QT_DEBUG_PLUGINS = 1 - QT_QPA_PLATFORM = xcb commands = - coverage run --rcfile=.coveragerc --module pytest -s + coverage run --rcfile=.coveragerc --module pytest coverage report --rcfile=.coveragerc [testenv:style] From ac2b402b1dea12923f8bfd50564c36a36cf8e625 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:01:47 +0300 Subject: [PATCH 68/84] Try to exclude gui tests in wheel build. --- .github/workflows/wheels.yml | 5 ++++- test/asammdf/gui/test_base.py | 14 +++++++------- test/asammdf/gui/widgets/test_FileWidget.py | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index cabc1be1f..2b25f802b 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -23,7 +23,10 @@ jobs: run: python -m pip install cibuildwheel - name: Build wheels - run: python -m cibuildwheel --output-dir wheelhouse + env: + CIBW_TEST_COMMAND: "pytest {project}/test -k \"not gui\"" + run: | + python -m cibuildwheel --output-dir wheelhouse - uses: actions/upload-artifact@v3 with: diff --git a/test/asammdf/gui/test_base.py b/test/asammdf/gui/test_base.py index d46568ef4..0947181b6 100644 --- a/test/asammdf/gui/test_base.py +++ b/test/asammdf/gui/test_base.py @@ -10,14 +10,14 @@ from asammdf.gui.utils import excepthook -if sys.platform == 'win32': - os.environ['QT_QPA_PLATFORM'] = 'windows' -elif sys.platform == 'linux': - os.environ['QT_QPA_PLATFORM'] = 'xcb' -elif sys.platform == 'darwin': - os.environ['QT_QPA_PLATFORM'] = 'cocoa' +if sys.platform == "win32": + os.environ["QT_QPA_PLATFORM"] = "windows" +elif sys.platform == "linux": + os.environ["QT_QPA_PLATFORM"] = "xcb" +elif sys.platform == "darwin": + os.environ["QT_QPA_PLATFORM"] = "cocoa" else: - os.environ['QT_QPA_PLATFORM'] = 'windows' + os.environ["QT_QPA_PLATFORM"] = "windows" app = pyqtgraph.mkQApp() app.setOrganizationName("py-asammdf") diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 116e05538..acbbed4f8 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -119,7 +119,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): self.assertIn("Plot", widget_types) @unittest.skipIf( - sys.platform == "linux", + sys.platform in ("darwin", "linux"), "Test is failing due to Segmentation Fault on Linux platform.", ) @mock.patch("asammdf.gui.widgets.file.ErrorDialog") From b6d0888d6af4e00186963d5556b04a50de718f63 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:29:11 +0300 Subject: [PATCH 69/84] Try to ignore gui tests in wheel build --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 2b25f802b..92a21872d 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -24,7 +24,7 @@ jobs: - name: Build wheels env: - CIBW_TEST_COMMAND: "pytest {project}/test -k \"not gui\"" + CIBW_TEST_COMMAND: "pytest {project}/test --ignore=test/asammdf/gui/*" run: | python -m cibuildwheel --output-dir wheelhouse From 85f012cc318bc0273b0302ec6f917e5ec2ff2d6b Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:38:32 +0300 Subject: [PATCH 70/84] add test dependency --- .github/workflows/wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 92a21872d..fb3a1c3c8 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,6 +25,7 @@ jobs: - name: Build wheels env: CIBW_TEST_COMMAND: "pytest {project}/test --ignore=test/asammdf/gui/*" + CIBW_TEST_REQUIRES: "pytest PySide6" run: | python -m cibuildwheel --output-dir wheelhouse From 4a09a30fd70b289b2df17d11993eec70943618e1 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:44:48 +0300 Subject: [PATCH 71/84] Try to fix dependencies. --- .github/workflows/wheels.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index fb3a1c3c8..5422700e5 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,8 +25,12 @@ jobs: - name: Build wheels env: CIBW_TEST_COMMAND: "pytest {project}/test --ignore=test/asammdf/gui/*" - CIBW_TEST_REQUIRES: "pytest PySide6" + CIBW_TEST_REQUIRES: "pytest pyqtgraph PySide6" run: | + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt update + sudo apt-get install libegl1 libopengl0 + fi python -m cibuildwheel --output-dir wheelhouse - uses: actions/upload-artifact@v3 From 4003a840df4cd5eef7dfbae7fd046cc6378d4b70 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:49:03 +0300 Subject: [PATCH 72/84] retry.. --- .github/workflows/wheels.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 5422700e5..0be83659f 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -23,9 +23,10 @@ jobs: run: python -m pip install cibuildwheel - name: Build wheels + shell: bash env: - CIBW_TEST_COMMAND: "pytest {project}/test --ignore=test/asammdf/gui/*" - CIBW_TEST_REQUIRES: "pytest pyqtgraph PySide6" + CIBW_TEST_COMMAND: 'pytest {project}/test -k not "test/asammdf/gui/*' + CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update From 445d4e15314d822c8036b3f9f405381efe7a54a4 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:51:59 +0300 Subject: [PATCH 73/84] Fix sintax. --- .github/workflows/wheels.yml | 2 +- test/asammdf/gui/widgets/test_FileWidget.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 0be83659f..ff3b9cfba 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,7 +25,7 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: 'pytest {project}/test -k not "test/asammdf/gui/*' + CIBW_TEST_COMMAND: 'pytest {project}/test -k not "test/asammdf/gui"' CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | if [ "$RUNNER_OS" == "Linux" ]; then diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index acbbed4f8..1fe16ab22 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -62,6 +62,9 @@ def __init__(self, source_widget, destination_widget, source_pos, destination_po move_thread.wait() +@unittest.skipIf( + sys.platform == "darwin", "Test Development on MacOS was not done yet." +) class TestFileWidget(TestBase): # Note: If it's possible and make sense use self.subTests # to avoid initialize widgets multiple times and consume time. From 00ec13e6b4f4a0a3589290a68c73843027ef174d Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 15:56:52 +0300 Subject: [PATCH 74/84] .. --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index ff3b9cfba..787247fb8 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,7 +25,7 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: 'pytest {project}/test -k not "test/asammdf/gui"' + CIBW_TEST_COMMAND: "pytest {project}/test -ignore=*/gui/*" CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | if [ "$RUNNER_OS" == "Linux" ]; then From 56c75e52719741757e0ad19ce7b81d903766b6ec Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 16:00:15 +0300 Subject: [PATCH 75/84] Fix arg --- .github/workflows/wheels.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 787247fb8..4ffca789d 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,7 +25,8 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: "pytest {project}/test -ignore=*/gui/*" + CIBW_TEST_COMMAND: "pytest {project}/test --ignore=*/gui/*" + # Install packages only to pass over imports. GUI Tests must be skipped. CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | if [ "$RUNNER_OS" == "Linux" ]; then From b52197fe1175e00bbda8b8ec4b17b4a2b745ecd3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 16:34:46 +0300 Subject: [PATCH 76/84] Change command --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 4ffca789d..887b22b97 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,7 +25,7 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: "pytest {project}/test --ignore=*/gui/*" + CIBW_TEST_COMMAND: 'pytest {project}/test -k "not gui/*"' # Install packages only to pass over imports. GUI Tests must be skipped. CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | From bde05ac9fa13e705d8073147b0bd8caa66f7adc7 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 16:41:32 +0300 Subject: [PATCH 77/84] .. --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 887b22b97..bcf237cb3 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,7 +25,7 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: 'pytest {project}/test -k "not gui/*"' + CIBW_TEST_COMMAND: 'pytest {project}/test --continue-on-collection-errors -k "not gui/*"' # Install packages only to pass over imports. GUI Tests must be skipped. CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | From cc94799a85f26e7f7f50cffc7803f04695248bcc Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 16:50:05 +0300 Subject: [PATCH 78/84] ... --- .github/workflows/wheels.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index bcf237cb3..ece405b0a 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -25,9 +25,8 @@ jobs: - name: Build wheels shell: bash env: - CIBW_TEST_COMMAND: 'pytest {project}/test --continue-on-collection-errors -k "not gui/*"' + CIBW_TEST_COMMAND: "pytest {project}/test --ignore={project}/test/asammdf/gui" # Install packages only to pass over imports. GUI Tests must be skipped. - CIBW_TEST_REQUIRES: "pytest pyqtgraph==0.12.4 PySide6==6.2.2" run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update From 1830b93f92c65a3647ae578337397acd95ad569a Mon Sep 17 00:00:00 2001 From: uids6535 Date: Wed, 19 Apr 2023 16:59:16 +0300 Subject: [PATCH 79/84] Fix Builds. --- .github/workflows/main.yml | 3 +-- .github/workflows/wheels.yml | 1 - tox.ini | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5f291c82f..298d1307e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -42,8 +42,7 @@ jobs: # see: https://github.com/ymyzk/tox-gh-actions - name: Run tests - run: | - tox + run: tox - name: Stop Xvfb if: matrix.os == 'ubuntu-22.04' diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index ece405b0a..a2a3efd9d 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -26,7 +26,6 @@ jobs: shell: bash env: CIBW_TEST_COMMAND: "pytest {project}/test --ignore={project}/test/asammdf/gui" - # Install packages only to pass over imports. GUI Tests must be skipped. run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo apt update diff --git a/tox.ini b/tox.ini index fe6ec4888..051f43a67 100644 --- a/tox.ini +++ b/tox.ini @@ -45,4 +45,4 @@ python = python_classes = testpaths = test addopts = -vv --color=yes --code-highlight=yes -timeout = 500 \ No newline at end of file +timeout = 600 \ No newline at end of file From bdf2aa867fe70eb8edf4beafbde351e0753b15b2 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 20 Apr 2023 08:24:18 +0300 Subject: [PATCH 80/84] Quit Thread. --- src/asammdf/gui/widgets/tree.py | 2 +- test/asammdf/gui/widgets/test_FileWidget.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/asammdf/gui/widgets/tree.py b/src/asammdf/gui/widgets/tree.py index f4010cf65..c3f94bb14 100644 --- a/src/asammdf/gui/widgets/tree.py +++ b/src/asammdf/gui/widgets/tree.py @@ -303,7 +303,7 @@ def get_data(item): drag = QtGui.QDrag(self) drag.setMimeData(mimeData) - drag.exec_(QtCore.Qt.MoveAction) + drag.exec(QtCore.Qt.MoveAction) class FileTreeItem(QtWidgets.QTreeWidgetItem): diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 1fe16ab22..1effdff98 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -60,6 +60,7 @@ def __init__(self, source_widget, destination_widget, source_pos, destination_po # drag_thread.wait() move_thread.wait() + move_thread.quit() @unittest.skipIf( From 0385229c3f6fd08c90802e19eb1919b51ff4551f Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 20 Apr 2023 16:20:27 +0300 Subject: [PATCH 81/84] Try to fix coveralls.yml --- .github/workflows/coveralls.yml | 21 ++- test/asammdf/gui/widgets/test_FileWidget.py | 172 +++++++++++++++++++- 2 files changed, 188 insertions(+), 5 deletions(-) diff --git a/.github/workflows/coveralls.yml b/.github/workflows/coveralls.yml index f2852299a..08405b026 100644 --- a/.github/workflows/coveralls.yml +++ b/.github/workflows/coveralls.yml @@ -19,11 +19,30 @@ jobs: python-version: "3.8" - name: Install packages - run: pip install tox coveralls + shell: bash + run: | + pip install tox coveralls + if [ "$RUNNER_OS" == "Linux" ]; then + sudo apt update + sudo apt-get install libegl1 libopengl0 + sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev + sudo apt-get install libxcb-xinerama0 + sudo apt-get install libxkbcommon-x11-0 + sudo apt-get install xorg + sudo apt-get install -y xvfb + fi + + - name: Start Xvfb + run: | + Xvfb :0 -screen 0 1024x768x24 > /dev/null 2>&1 & + export DISPLAY=:0 - name: Run coverage run: tox -e py38 + - name: Stop Xvfb + run: killall Xvfb + # see: https://coveralls-python.readthedocs.io/en/latest/usage/configuration.html#github-actions-support - name: Upload coverage data to coveralls.io run: coveralls --service=github diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 1effdff98..ec574f1f9 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -79,7 +79,7 @@ def tearDown(self): self.widget.deleteLater() super().tearDown() - def test_PushButton_LoadOfflineWindows_DSP(self): + def test_Tab_Channels_PushButton_LoadOfflineWindows_DSP(self): """ Events: - Open 'FileWidget' with valid measurement. @@ -127,7 +127,7 @@ def test_PushButton_LoadOfflineWindows_DSP(self): "Test is failing due to Segmentation Fault on Linux platform.", ) @mock.patch("asammdf.gui.widgets.file.ErrorDialog") - def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): + def test_Tab_Channels_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): """ Events: - Open 'FileWidget' with valid measurement. @@ -351,10 +351,11 @@ def test_PushButton_LoadOfflineWindows_DSPF(self, mc_file_ErrorDialog): mc_file_ErrorDialog.assert_not_called() - def test_PushButton_LoadOfflineWindows_LAB(self): + def test_Tab_Channels_PushButton_LoadOfflineWindows_LAB(self): """ Events: - Open 'FileWidget' with valid measurement. + - Ensure that Channels View is set to "Internal file structure" - Case 0: - Press PushButton: "Load offline windows" - Simulate that "lab" file with empty section was selected @@ -393,6 +394,8 @@ def test_PushButton_LoadOfflineWindows_LAB(self): None, # hide_missing_channels None, # hide_disabled_channels ) + # Switch ComboBox to "Internal file structure" + self.widget.channel_view.setCurrentText("Internal file structure") # Case 0: with self.subTest("test_PushButton_LoadOfflineWindows_LAB_0"): with mock.patch( @@ -487,11 +490,12 @@ def test_PushButton_LoadOfflineWindows_LAB(self): set(checked_items), ) - def test_PushButton_SaveOfflineWindows(self): + def test_Tab_Channels_PushButton_SaveOfflineWindows(self): """ Events: - Open 'FileWidget' with valid measurement. + - Ensure that Channels View is set to "Internal file structure" - Press PushButton: "Load offline windows" - Simulate that valid "dspf" file was selected - Close all Numeric and Tabular windows @@ -525,6 +529,8 @@ def test_PushButton_SaveOfflineWindows(self): ) self.widget.showNormal() self.widget.activateWindow() + # Switch ComboBox to "Internal file structure" + self.widget.channel_view.setCurrentText("Internal file structure") with mock.patch.object( self.widget, "load_window", wraps=self.widget.load_window @@ -616,3 +622,161 @@ def test_PushButton_SaveOfflineWindows(self): ) ) self.assertSetEqual({"Plot"}, widget_types) + + def test_Tab_Channels_PushButton_SelectAll(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Switch ComboBox to "Natural sort" + - Press PushButton: "Select all the channels" + - Clear selection + - Switch ComboBox to "Internal file structure" + - Press PushButton: "Select all the channels" + - Switch ComboBox to "Selected channels only" + Evaluate: + - Evaluate that all channels from "channels_tree" are checked. + """ + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + self.widget.showNormal() + + # Switch ComboBox to "Natural sort" + self.widget.channel_view.setCurrentText("Natural Sort") + # Press PushButton: "Select all the channels" + QtTest.QTest.mouseClick( + self.widget.select_all_btn, QtCore.Qt.MouseButton.LeftButton + ) + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertTrue(item.checkState(0)) + iterator += 1 + + # Clear all + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + item.setCheckState(0, QtCore.Qt.Unchecked) + self.assertFalse(item.checkState(0)) + iterator += 1 + + # Switch ComboBox to "Internal file structure" + self.widget.channel_view.setCurrentText("Internal file structure") + # Press PushButton: "Select all the channels" + QtTest.QTest.mouseClick( + self.widget.select_all_btn, QtCore.Qt.MouseButton.LeftButton + ) + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertTrue(item.checkState(0)) + iterator += 1 + + # Switch ComboBox to "Selected channels only" + self.widget.channel_view.setCurrentText("Selected channels only") + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertTrue(item.checkState(0)) + iterator += 1 + + def test_Tab_Channels_PushButton_ClearAll(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Switch ComboBox to "Natural sort" + - Select all channels + - Press PushButton: "Clear all selected channels" + - Switch ComboBox to "Internal file structure" + - Select all channels + - Press PushButton: "Clear all selected channels" + - Switch ComboBox to "Selected channels only" + Evaluate: + - Evaluate that all channels from "channels_tree" are unchecked. + """ + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + self.widget.showNormal() + + # Switch ComboBox to "Natural sort" + self.widget.channel_view.setCurrentText("Natural Sort") + # Select all + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + item.setCheckState(0, QtCore.Qt.Checked) + self.assertTrue(item.checkState(0)) + iterator += 1 + # Press PushButton: "Clear all selected channels" + QtTest.QTest.mouseClick( + self.widget.clear_channels_btn, QtCore.Qt.MouseButton.LeftButton + ) + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertFalse(item.checkState(0)) + iterator += 1 + + # Switch ComboBox to "Internal file structure" + self.widget.channel_view.setCurrentText("Internal file structure") + while iterator.value(): + item = iterator.value() + item.setCheckState(0, QtCore.Qt.Checked) + self.assertTrue(item.checkState(0)) + iterator += 1 + # Press PushButton: "Clear all selected channels" + QtTest.QTest.mouseClick( + self.widget.clear_channels_btn, QtCore.Qt.MouseButton.LeftButton + ) + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertFalse(item.checkState(0)) + iterator += 1 + + # Switch ComboBox to "Selected channels only" + self.widget.channel_view.setCurrentText("Selected channels only") + + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertFalse(item.checkState(0)) + iterator += 1 + From 2f8f40bea415cc8a2903e06e702107bdbe13b80a Mon Sep 17 00:00:00 2001 From: uids6535 Date: Thu, 20 Apr 2023 16:37:36 +0300 Subject: [PATCH 82/84] Run Black and iSort --- test/asammdf/gui/widgets/test_FileWidget.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index ec574f1f9..2620fa4a3 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -779,4 +779,3 @@ def test_Tab_Channels_PushButton_ClearAll(self): item = iterator.value() self.assertFalse(item.checkState(0)) iterator += 1 - From e3184b58c4ee1ac50b7e8f582a73c5f22aaff08e Mon Sep 17 00:00:00 2001 From: uids6535 Date: Fri, 21 Apr 2023 08:54:21 +0300 Subject: [PATCH 83/84] Add test for Search Button. --- test/asammdf/gui/widgets/test_FileWidget.py | 139 ++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 2620fa4a3..3c3d3abd1 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -77,6 +77,7 @@ def tearDown(self): if self.widget: self.widget.close() self.widget.deleteLater() + self.mc_ErrorDialog.reset_mock() super().tearDown() def test_Tab_Channels_PushButton_LoadOfflineWindows_DSP(self): @@ -779,3 +780,141 @@ def test_Tab_Channels_PushButton_ClearAll(self): item = iterator.value() self.assertFalse(item.checkState(0)) iterator += 1 + + def test_Tab_Channels_PushButton_Search(self): + """ + Events: + - Open 'FileWidget' with valid measurement. + - Case 0: + - Press PushButton: "Search and select channels" + - Simulate that "AdvancedSearch" was closed/cancelled (no signal was selected) + - Case 1: + - Press PushButton: "Search and select channels" + - Simulate that 2 channels were selected and PushButton "Check channels" was pressed. + - Case 2: + - Clear 'channel_tree' selection + - Press PushButton: "Search and select channels" + - Simulate that 2 channels were selected and PushButton "Add Window" was pressed. + Evaluate: + - Case 0: + - Evaluate that no channel is selected in "channel_tree" + - Case 1: + - Evaluate that 2 channels are selected in "channel_tree" + - Case 2: + - Evaluate that 2 channels are selected in "channel_tree" + - Plot Window is added. + """ + # Setup + measurement_file = str(pathlib.Path(self.resource, "ASAP2_Demo_V171.mf4")) + # Event + self.widget = FileWidget( + measurement_file, + True, # with_dots + True, # subplots + True, # subplots_link + False, # ignore_value2text_conversions + False, # display_cg_name + "line", # line_interconnect + 1, # password + None, # hide_missing_channels + None, # hide_disabled_channels + ) + self.widget.showNormal() + # Case 0: + with self.subTest("test_Tab_Channels_PushButton_Search_0"): + with mock.patch( + "asammdf.gui.widgets.file.AdvancedSearch" + ) as mc_AdvancedSearch: + mc_AdvancedSearch.return_value.result = {} + mc_AdvancedSearch.return_value.pattern_window = False + mc_AdvancedSearch.return_value.add_window_request = False + + # - Press PushButton: "Search and select channels" + QtTest.QTest.mouseClick( + self.widget.advanced_search_btn, QtCore.Qt.LeftButton + ) + # Evaluate + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + self.assertFalse(item.checkState(0)) + iterator += 1 + + # Case 1: + with self.subTest("test_Tab_Channels_PushButton_Search_1"): + with mock.patch( + "asammdf.gui.widgets.file.AdvancedSearch" + ) as mc_AdvancedSearch: + mc_AdvancedSearch.return_value.result = { + (4, 3): "ASAM.M.SCALAR.FLOAT64.IDENTICAL", + (2, 10): "ASAM.M.SCALAR.FLOAT32.IDENTICAL", + } + mc_AdvancedSearch.return_value.pattern_window = False + mc_AdvancedSearch.return_value.add_window_request = False + + # - Press PushButton: "Search and select channels" + QtTest.QTest.mouseClick( + self.widget.advanced_search_btn, QtCore.Qt.LeftButton + ) + # Evaluate + checked_channels = 0 + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + if item.checkState(0) == QtCore.Qt.Checked: + checked_channels += 1 + iterator += 1 + self.assertEqual(2, checked_channels) + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 0) + + # Case 2: + with self.subTest("test_Tab_Channels_PushButton_Search_2"): + # - Clear 'channel_tree' selection + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + item.setCheckState(0, QtCore.Qt.Unchecked) + iterator += 1 + with ( + mock.patch( + "asammdf.gui.widgets.file.AdvancedSearch" + ) as mc_AdvancedSearch, + mock.patch( + "asammdf.gui.widgets.file.WindowSelectionDialog" + ) as mc_WindowSelectionDialog, + ): + mc_AdvancedSearch.return_value.result = { + (4, 3): "ASAM.M.SCALAR.FLOAT64.IDENTICAL", + (2, 10): "ASAM.M.SCALAR.FLOAT32.IDENTICAL", + } + mc_AdvancedSearch.return_value.pattern_window = False + mc_AdvancedSearch.return_value.add_window_request = True + mc_WindowSelectionDialog.return_value.result.return_value = True + mc_WindowSelectionDialog.return_value.selected_type.return_value = ( + "New plot window" + ) + mc_WindowSelectionDialog.return_value.disable_new_channels.return_value = ( + False + ) + + # - Press PushButton: "Search and select channels" + QtTest.QTest.mouseClick( + self.widget.advanced_search_btn, QtCore.Qt.LeftButton + ) + # Evaluate + checked_channels = 0 + iterator = QtWidgets.QTreeWidgetItemIterator(self.widget.channels_tree) + while iterator.value(): + item = iterator.value() + if item.checkState(0) == QtCore.Qt.Checked: + checked_channels += 1 + iterator += 1 + self.assertEqual(2, checked_channels) + self.assertEqual(len(self.widget.mdi_area.subWindowList()), 1) + widget_types = sorted( + map( + lambda w: w.widget().__class__.__name__, + self.widget.mdi_area.subWindowList(), + ) + ) + self.assertIn("Plot", widget_types) From 232e992fab47140ecf12f7e9a0c35c57e85772a3 Mon Sep 17 00:00:00 2001 From: uids6535 Date: Fri, 21 Apr 2023 09:09:39 +0300 Subject: [PATCH 84/84] Fix syntax error for py38 --- test/asammdf/gui/widgets/test_FileWidget.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/test/asammdf/gui/widgets/test_FileWidget.py b/test/asammdf/gui/widgets/test_FileWidget.py index 3c3d3abd1..4f1165235 100644 --- a/test/asammdf/gui/widgets/test_FileWidget.py +++ b/test/asammdf/gui/widgets/test_FileWidget.py @@ -875,14 +875,11 @@ def test_Tab_Channels_PushButton_Search(self): item = iterator.value() item.setCheckState(0, QtCore.Qt.Unchecked) iterator += 1 - with ( - mock.patch( - "asammdf.gui.widgets.file.AdvancedSearch" - ) as mc_AdvancedSearch, - mock.patch( - "asammdf.gui.widgets.file.WindowSelectionDialog" - ) as mc_WindowSelectionDialog, - ): + with mock.patch( + "asammdf.gui.widgets.file.AdvancedSearch" + ) as mc_AdvancedSearch, mock.patch( + "asammdf.gui.widgets.file.WindowSelectionDialog" + ) as mc_WindowSelectionDialog: mc_AdvancedSearch.return_value.result = { (4, 3): "ASAM.M.SCALAR.FLOAT64.IDENTICAL", (2, 10): "ASAM.M.SCALAR.FLOAT32.IDENTICAL",