Skip to content
Snippets Groups Projects
test_resolution_smoke_test.py 3.52 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
from PySide2.QtTest import QTest
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."""

    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.

        NOTE: This test needs to be updated when a new module is added, or when
        one is deleted. 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": 633.0, "y": 0, "page": 1, "name": "FreeTextModule"},
            {"x": 733.0, "y": 0, "page": 1, "name": "TableModule"},
        ]

        def press_enter():
            active_widget = app.activeModalWidget()
            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(),