Skip to content
Snippets Groups Projects
test_resolution_smoke_test.py 4.21 KiB
Newer Older
"""Test module that looks for differences in SOI modules across resolutions.

This was written as a regression test for #125. Ideally it should also test the
header of the SOI, but this is much more complicated to test for..

## Important

This test can not test across different resolutions by itself, this is up to
the user. Our pipeline will test across a couple of different resolutions.
"""
import unittest
from PySide2.QtWidgets import QApplication
from PySide2 import QtGui
from PySide2.QtCore import QTimer, Qt, QSysInfo
from PySide2.QtGui import QGuiApplication
from soitool.soi import SOI
from soitool.modules.module_authentication_board import (
    AuthenticationBoardModule,
)
from soitool.modules.module_subtractorcodes import SubtractorcodesModule
from soitool.new_module_dialog import MODULE_CHOICES

if isinstance(QtGui.qApp, type(None)):
    app = QApplication([])
else:
    app = QtGui.qApp


def screen_information():
    """Get string with information about the screen.

    Returns
    -------
    str
        String with screen information.
    """
    screen_string = ""
    screen = QGuiApplication.primaryScreen()
    screen_string += "screen.size() -> " + str(screen.size()) + "\n"
    screen_string += (
        "screen.physicalDotsPerInchX() -> "
        + str(screen.physicalDotsPerInchX())
        + "\n"
    )
    screen_string += (
        "screen.physicalDotsPerInchY() -> "
        + str(screen.physicalDotsPerInchY())
        + "\n"
    )
    screen_string += (
        "screen.logicalDotsPerInchX() -> "
        + str(screen.logicalDotsPerInchX())
        + "\n"
    )
    screen_string += (
        "screen.logicalDotsPerInchY() -> "
        + str(screen.logicalDotsPerInchY())
        + "\n"
    )
    screen_string += (
        "screen.devicePixelRatio() -> " + str(screen.devicePixelRatio()) + "\n"
    )
    return screen_string


class TestModulesAcrossResolutions(unittest.TestCase):
    """TestCase for modules across resolutions."""

    @unittest.skipUnless(
        QSysInfo.productType() == "windows",
        "Test currently only able to target Windows",
    )
    def test_add_all_modules(self):
        """Add all modules, reorganize, and assert result.

        Expected result was gotten by simply running reorganize and noting down
        the results. We should get the same result across different
        resolutions.

        Modules added to SOI must be the same every time the program is ran.

        Test only works on Windows, as the expected result is based on the
        Windows look-and-feel.

        NOTE: This test needs to be updated when a new module is added,
        deleted, or changed. It will fail until it is updated.
        """
        expected_result = [
            {"x": 0, "y": 0, "page": 1, "name": "AuthenticationBoardModule"},
            {"x": 407.5, "y": 0, "page": 1, "name": "SubtractorcodesModule"},
            {"x": 602.0, "y": 0, "page": 1, "name": "FreeTextModule"},
            {"x": 702.0, "y": 0, "page": 1, "name": "TableModule"},
        ]

        def press_enter():
            active_widget = app.activeModalWidget()
            # triple click to select existing text for overwrite
            QTest.mouseDClick(active_widget.edit_headline, Qt.LeftButton)
            QTest.mouseClick(active_widget.edit_headline, Qt.LeftButton)
            # need to overwrite text because title otherwise contains
            # unpredictable text
            QTest.keyClicks(active_widget.edit_headline, "TestTitle")
            QTest.keyClick(active_widget, Qt.Key_Enter)

        soi = SOI()

        for module in MODULE_CHOICES:
            # If we're adding one of the modules with a popup as part of it's
            # constructor we need to singleShot pressing enter to close it
            if module in (AuthenticationBoardModule, SubtractorcodesModule):
                QTimer.singleShot(0, press_enter)
            soi.add_module(module.__name__, module())

        soi.reorganize()

        self.assertEqual(
            expected_result,
            [module["meta"] for module in soi.modules],
            "All modules added to SOI and calling reorganize should result in "
            "expected 'meta' information. Screen is: \n"
            + screen_information(),