LCOV - code coverage report
Current view: top level - tests - test_gui.py (source / functions) Hit Total Coverage
Test: coverage.info Lines: 91 91 100.0 %
Date: 2025-06-06 09:09:03 Functions: 4 8 50.0 %

          Line data    Source code
       1             : # SPDX-FileCopyrightText: 2024 Pairinteraction Developers
       2             : # SPDX-License-Identifier: LGPL-3.0-or-later
       3             : 
       4           1 : from typing import TYPE_CHECKING
       5             : 
       6           1 : import numpy as np
       7           1 : import pytest
       8           1 : from pairinteraction_gui.calculate.calculate_two_atoms import ParametersTwoAtoms, _calculate_two_atoms
       9           1 : from pairinteraction_gui.main_window import MainWindow
      10             : 
      11           1 : from .test_pair_potential import compare_pair_potential_to_reference
      12           1 : from .test_starkmap import compare_starkmap_to_reference
      13             : 
      14             : if TYPE_CHECKING:
      15             :     from pairinteraction_gui.page import OneAtomPage
      16             :     from pairinteraction_gui.page.two_atoms_page import TwoAtomsPage
      17             :     from pytestqt.qtbot import QtBot
      18             : 
      19             : 
      20           1 : @pytest.fixture
      21           1 : def window_starkmap(qtbot: "QtBot") -> MainWindow:
      22           1 :     window = MainWindow()
      23           1 :     window.show()
      24           1 :     qtbot.addWidget(window)
      25             : 
      26           1 :     one_atom_page: OneAtomPage = window.stacked_pages.getNamedWidget("OneAtomPage")  # type: ignore [assignment]
      27           1 :     one_atom_page.ket_config.species_combo[0].setCurrentText("Rb")
      28           1 :     ket_qn = one_atom_page.ket_config.stacked_qn[0].currentWidget()
      29           1 :     ket_qn.items["n"].setValue(60)
      30           1 :     ket_qn.items["l"].setValue(0)
      31           1 :     ket_qn.items["m"].setValue(0.5)
      32             : 
      33           1 :     basis_qn = one_atom_page.basis_config.stacked_basis[0].currentWidget()
      34           1 :     basis_qn.items["n"].setValue(2)
      35           1 :     basis_qn.items["l"].setValue(2)
      36           1 :     basis_qn.items["m"].setChecked(False)
      37             : 
      38           1 :     calculation_config = one_atom_page.calculation_config
      39           1 :     calculation_config.steps.setValue(11)
      40           1 :     system_config = one_atom_page.system_config
      41           1 :     system_config.Ez.spinboxes[1].setValue(10)
      42             : 
      43           1 :     return window
      44             : 
      45             : 
      46           1 : def test_main_window_basic(qtbot: "QtBot", window_starkmap: "MainWindow") -> None:
      47             :     """Test basic main window functionality."""
      48           1 :     one_atom_page: OneAtomPage = window_starkmap.stacked_pages.getNamedWidget("OneAtomPage")  # type: ignore [assignment]
      49           1 :     qn_item = one_atom_page.ket_config.stacked_qn[0].currentWidget().items["n"]
      50           1 :     qn_item.setValue(60)
      51             : 
      52           1 :     ket_label = one_atom_page.ket_config.ket_label[0].text()
      53           1 :     assert all(x in ket_label for x in ["Rb", "60", "S", "1/2"])
      54           1 :     assert qn_item.label.text() == "n"
      55           1 :     assert qn_item.value() == 60
      56             : 
      57           1 :     qn_item.setValue(61)
      58           1 :     ket_label = one_atom_page.ket_config.ket_label[0].text()
      59           1 :     assert qn_item.value() == 61
      60           1 :     assert all(x in ket_label for x in ["Rb", "61", "S", "1/2"])
      61             : 
      62             :     # make the basis smaller for faster test
      63           1 :     basis_qn = one_atom_page.basis_config.stacked_basis[0].currentWidget()
      64           1 :     basis_qn.items["n"].setValue(1)
      65           1 :     basis_qn.items["l"].setValue(1)
      66           1 :     basis_qn.items["m"].setValue(0)
      67             : 
      68           1 :     one_atom_page.calculate_and_abort.getNamedWidget("Calculate").click()
      69           1 :     qtbot.waitUntil(lambda: one_atom_page._calculation_finished, timeout=20_000)  # ci macOS-13 is very slow
      70           1 :     qtbot.waitUntil(lambda: one_atom_page._plot_finished, timeout=5_000)
      71           1 :     window_starkmap.close()
      72             : 
      73             : 
      74           1 : def test_calculate_one_atom(window_starkmap: "MainWindow") -> None:
      75           1 :     one_atom_page: OneAtomPage = window_starkmap.stacked_pages.getNamedWidget("OneAtomPage")  # type: ignore [assignment]
      76           1 :     ket = one_atom_page.ket_config.get_ket_atom(0)
      77             : 
      78           1 :     one_atom_page.calculation_config.fast_mode.setChecked(False)
      79           1 :     _parameters, results = one_atom_page.calculate()
      80           1 :     energies = np.array(results.energies) + ket.get_energy("GHz")
      81           1 :     compare_starkmap_to_reference(energies, np.array(results.ket_overlaps))
      82             : 
      83           1 :     one_atom_page.calculation_config.fast_mode.setChecked(True)
      84           1 :     _parameters, results = one_atom_page.calculate()
      85           1 :     energies = np.array(results.energies) + ket.get_energy("GHz")
      86           1 :     compare_starkmap_to_reference(energies)  # with fast mode, the overlaps are different, so we don't compare them
      87             : 
      88             : 
      89           1 : def test_calculate_two_atoms(qtbot: "QtBot") -> None:
      90           1 :     window = MainWindow()
      91           1 :     window.show()
      92           1 :     qtbot.addWidget(window)
      93             : 
      94           1 :     two_atoms_page: TwoAtomsPage = window.stacked_pages.getNamedWidget("TwoAtomsPage")  # type: ignore [assignment]
      95           1 :     two_atoms_page.ket_config.species_combo[0].setCurrentText("Rb")
      96           1 :     for ket_qn_stacked in two_atoms_page.ket_config.stacked_qn:
      97           1 :         ket_qn = ket_qn_stacked.currentWidget()
      98           1 :         ket_qn.items["n"].setValue(60)
      99           1 :         ket_qn.items["l"].setValue(0)
     100           1 :         ket_qn.items["m"].setValue(0.5)
     101             : 
     102           1 :     for basis_qn_stacked in two_atoms_page.basis_config.stacked_basis:
     103           1 :         basis_qn = basis_qn_stacked.currentWidget()
     104           1 :         basis_qn.items["n"].setValue(2)
     105           1 :         basis_qn.items["l"].setValue(2)
     106           1 :         basis_qn.items["m"].setChecked(False)
     107             : 
     108           1 :     two_atoms_page.basis_config.pair_delta_energy.setValue(3)
     109           1 :     two_atoms_page.basis_config.pair_m_range.setValues(1, 1)
     110             : 
     111           1 :     calculation_config = two_atoms_page.calculation_config
     112           1 :     calculation_config.steps.setValue(5)
     113           1 :     system_config = two_atoms_page.system_config
     114           1 :     system_config.distance.setValues(1, 5)
     115             : 
     116             :     # since no fields are applied the energy offset is simply given by the energies of the kets
     117           1 :     ket_pair_energy_0 = sum(two_atoms_page.ket_config.get_ket_atom(i).get_energy("GHz") for i in range(2))
     118             : 
     119           1 :     two_atoms_page.calculation_config.fast_mode.setChecked(False)
     120           1 :     parameters = ParametersTwoAtoms.from_page(two_atoms_page)
     121           1 :     results = _calculate_two_atoms(parameters)
     122           1 :     energies = np.array(results.energies) + ket_pair_energy_0
     123           1 :     compare_pair_potential_to_reference(energies, np.array(results.ket_overlaps))
     124             : 
     125           1 :     two_atoms_page.calculation_config.fast_mode.setChecked(True)
     126           1 :     parameters = ParametersTwoAtoms.from_page(two_atoms_page)
     127           1 :     results = _calculate_two_atoms(parameters)
     128           1 :     energies = np.array(results.energies) + ket_pair_energy_0
     129           1 :     compare_pair_potential_to_reference(
     130             :         energies
     131             :     )  # with fast mode, the overlaps are different, so we don't compare them

Generated by: LCOV version 1.16