Source code for pyspread.test.test_workflows

# -*- coding: utf-8 -*-

# Copyright Martin Manns
# Distributed under the terms of the GNU General Public License

# --------------------------------------------------------------------
# pyspread is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyspread is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyspread.  If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------------------


"""
test_workflows
==============

Unit tests for workflows.py

"""

from contextlib import contextmanager
from os.path import abspath, dirname, join
from pathlib import Path
import sys

import pytest

from PyQt6.QtCore import Qt, QItemSelectionModel
from PyQt6.QtWidgets import QApplication

try:
    from pyspread.dialogs import GridShapeDialog
except ImportError:
    from dialogs import GridShapeDialog


PYSPREADPATH = abspath(join(dirname(__file__) + "/.."))
LIBPATH = abspath(PYSPREADPATH + "/lib")


[docs] @contextmanager def insert_path(path): sys.path.insert(0, path) yield sys.path.pop(0)
with insert_path(PYSPREADPATH): from ..pyspread import MainWindow app = QApplication.instance() if app is None: app = QApplication([]) main_window = MainWindow()
[docs] class TestWorkflows: """Unit tests for Workflows in workflows.py""" workflows = main_window.workflows
[docs] def test_busy_cursor(self): """Unit test for busy_cursor""" assert QApplication.overrideCursor() != Qt.CursorShape.WaitCursor with self.workflows.busy_cursor(): assert QApplication.overrideCursor() == Qt.CursorShape.WaitCursor assert QApplication.overrideCursor() != Qt.CursorShape.WaitCursor
[docs] def test_prevent_updates(self): """Unit test for prevent_updates""" assert not main_window.prevent_updates with self.workflows.prevent_updates(): assert main_window.prevent_updates assert not main_window.prevent_updates
[docs] def test_reset_changed_since_save(self): """Unit test for reset_changed_since_save""" main_window.settings.changed_since_save = True self.workflows.reset_changed_since_save() assert not main_window.settings.changed_since_save
param_update_main_window_title = [ (Path.home(), "pyspread"), (Path("/test.pys"), "test.pys - pyspread"), ]
[docs] @pytest.mark.parametrize("path, title", param_update_main_window_title) def test_update_main_window_title(self, path, title): """Unit test for update_main_window_title""" main_window.settings.last_file_input_path = path self.workflows.update_main_window_title() assert main_window.windowTitle() == title
param_file_new = [ ((1000, 100, 3), (1000, 100, 3), None), ((100, 100, 3), (100, 100, 3), None), ((10000000, 100, 3), (1000, 100, 3), "Error: Grid shape (10000000, 100, 3) exceeds (1000000, 100000, 100)." ), (None, (1000, 100, 3), None), ]
[docs] @pytest.mark.parametrize("shape, res, msg", param_file_new) def test_file_new(self, shape, res, msg, monkeypatch): """Unit test for file_new""" monkeypatch.setattr(GridShapeDialog, "shape", shape) self.workflows.file_new() assert main_window.grid.model.shape == res assert main_window.grid.current == (0, 0, 0) assert main_window.settings.last_file_input_path == Path.home() assert main_window.settings.changed_since_save is False assert main_window.safe_mode is False if msg: assert main_window.statusBar().currentMessage() == msg monkeypatch.setattr(GridShapeDialog, "shape", main_window.settings.shape) self.workflows.file_new()
param_count_file_lines = [ ("", 0, "counttest.txt", None), ("\n"*100, 100, "counttest.txt", None), ("Test"*100, 0, "counttest.txt", None), ("Test\n"*10, 10, "counttest.txt", None), ("Test\n"*10, None, "false_filename.txt", "Error"), ]
[docs] @pytest.mark.parametrize("txt, res, filename, msg", param_count_file_lines) def test_count_file_lines(self, txt, res, filename, msg, tmpdir): """Unit test for count_file_lines""" tmpfile = tmpdir / "counttest.txt" tmpfile.write_text(txt, "utf-8") testfile = tmpdir / filename assert self.workflows.count_file_lines(testfile) == res if msg: assert str(testfile) in main_window.statusBar().currentMessage() tmpfile.remove()
[docs] def test_edit_sort_ascending(self): """Unit test for test_edit_sort_ascending""" main_window.grid.model.code_array[0, 0, 0] = "1" main_window.grid.model.code_array[1, 0, 0] = "3" main_window.grid.model.code_array[2, 0, 0] = "2" main_window.grid.model.code_array[0, 1, 0] = "12" main_window.grid.model.code_array[1, 1, 0] = "33" main_window.grid.model.code_array[2, 1, 0] = "24" for row in range(3): for column in range(2): index = main_window.grid.model.index(row, column) main_window.grid.selectionModel().select( index, QItemSelectionModel.SelectionFlag.Select) self.workflows.edit_sort_ascending() assert main_window.grid.model.code_array((0, 0, 0)) == "1" assert main_window.grid.model.code_array((1, 0, 0)) == "2" assert main_window.grid.model.code_array((2, 1, 0)) == "33"
[docs] def test_edit_sort_descending(self): """Unit test for test_edit_sort_descending""" main_window.grid.model.code_array[0, 0, 0] = "1" main_window.grid.model.code_array[1, 0, 0] = "3" main_window.grid.model.code_array[2, 0, 0] = "2" main_window.grid.model.code_array[0, 1, 0] = "12" main_window.grid.model.code_array[1, 1, 0] = "33" main_window.grid.model.code_array[2, 1, 0] = "24" for row in range(3): for column in range(2): index = main_window.grid.model.index(row, column) main_window.grid.selectionModel().select( index, QItemSelectionModel.SelectionFlag.Select) self.workflows.edit_sort_descending() assert main_window.grid.model.code_array((0, 0, 0)) == "3" assert main_window.grid.model.code_array((1, 0, 0)) == "2" assert main_window.grid.model.code_array((2, 1, 0)) == "12"