Files
grum/tests/test_mainwin.py
2023-01-24 08:36:55 +00:00

232 lines
7.3 KiB
Python

import unittest
import sys
# import pytest
from PyQt5.QtWidgets import QApplication, QAction, QListWidget
from grum.mainwin import MainWindow
from grum.dictlist import DictList
from unittest import mock
from grum import ctrl_c, theme, assets
from grum.dictlist.dictlistitem import DictListItem
from grum.plotdesc import PlotDescription
from grum.menus.rclickmenu import RClickMenu
from grum.menus import BarMenu
from grum.mdi import MDIArea, MDISubMultiPlot, MDISubPlot
from grum.rpc import RPCServerThread
from PyQt5.QtTest import QSignalSpy
from grum.cli import main
from math import isclose
# from parameterized import parameterized
class TestViewUnit(unittest.TestCase):
def setUp(self) -> None:
print("setup")
self.app = QApplication(sys.argv)
theme.apply(self.app)
# ctrl_c.setup(self.app)
self.mw = MainWindow()
self.mw.show()
def tearDown(self) -> None:
print("teardown")
self.mw.rst.wait_for_stop()
self.app.quit()
print("app quit called")
del self.mw
del self.app
def test_defaults(self):
mw = self.mw
assert mw.windowTitle() == "grum"
# assert mw.windowIcon() == assets.icon()
assert isinstance(mw.lst, DictList)
for key in mw.lst.lst.items:
assert isinstance(mw.lst.lst.get(key), DictListItem)
assert isinstance(mw.lst.lst.get(key).value, PlotDescription)
assert isinstance(mw.lst.menu, RClickMenu)
assert isinstance(mw.menu_settings, BarMenu)
assert isinstance(mw.menu_settings.checkboxes["Open new plots"], QAction)
assert isinstance(mw.mdi, MDIArea)
# @parameterized.expand([["Dotted line", "r"], ["Line", "r"], ["Dots", None]])
def test_new_plot(self):
mw = self.mw
name = "plot_name"
title = "plot_title"
xlabel = "xlabel"
ylabel = "ylabel"
cfg = {"title": title, "xlabel": xlabel, "ylabel": ylabel}
spy_sig_make_new_plot = QSignalSpy(mw.sig_make_new_plot)
mw.new_plot(name, cfg=cfg)
assert name in mw.lst.lst.items.keys()
assert isinstance(mw.lst.lst.get(name).value, PlotDescription)
assert mw.lst.lst.get(name).value.title == title
assert mw.lst.lst.get(name).value.xlabel == xlabel
assert mw.lst.lst.get(name).value.ylabel == ylabel
assert mw.menu_settings.checkboxes["Open new plots"].isChecked()
assert len(spy_sig_make_new_plot) == 1 # assert called once
assert spy_sig_make_new_plot[0][0] == name # assert called with name
assert isinstance(spy_sig_make_new_plot[0][1], PlotDescription)
mw.menu_settings.checkboxes["Open new plots"].setChecked(False)
assert mw.menu_settings.checkboxes["Open new plots"].isChecked() == False
spy_sig_make_new_plot = QSignalSpy(mw.sig_make_new_plot)
mw.new_plot("new_name", cfg)
assert len(spy_sig_make_new_plot) == 0 # assert not called
mw.menu_settings.checkboxes["Open new plots"].setChecked(True)
assert mw.menu_settings.checkboxes["Open new plots"].isChecked() == True
spy_sig_make_new_plot = QSignalSpy(mw.sig_make_new_plot)
new_name_item = mw.lst.lst.get("new_name")
sub = MDISubPlot("new_name", new_name_item.value)
mw.mdi.add(sub)
mw.new_plot("new_name", cfg)
assert len(spy_sig_make_new_plot) == 0 # assert not called
def test_append_data(self):
mw = self.mw
sine_item = mw.lst.lst.get("sine")
sine_item.set_alarm = mock.MagicMock()
sine_item.value.append = mock.MagicMock()
point = (1, 2)
mw.append_data("sine", point)
sine_item.value.append.assert_called_once_with(point)
sine_item.set_alarm.assert_called_once_with(True)
sub = MDISubPlot("sine", sine_item.value)
mw.mdi.add(sub)
sub.plot.setData = mock.MagicMock()
mw.append_data("sine", point)
sub.plot.setData.assert_called_once_with(*sine_item.value.data)
print(sine_item.set_alarm.call_args)
assert sine_item.set_alarm.call_args[0][0] == False
def test_on_make_new_plot(self):
mw = self.mw
mw.make_subwin = mock.MagicMock()
args = (1, 2, "name")
kwargs = {"title": "plot_title"}
mw.on_make_new_plot(args, kwargs)
mw.make_subwin.assert_called_once_with(MDISubPlot, args, kwargs)
def test_on_dclick_list_item(self):
mw = self.mw
mw.plot_single_item = mock.MagicMock()
item = mw.lst.lst.get("sine")
mw.on_dclick_list_item(item)
mw.plot_single_item.assert_called_once_with(item)
def test_on_plot_selected(self):
mw = self.mw
sine_item = mw.lst.lst.get("sine")
cosine_item = mw.lst.lst.get("cosine")
mw.lst.setCurrentItem(sine_item)
assert mw.lst.selectedItems()
mw.plot_single_item = mock.MagicMock()
mw.on_plot_selected()
mw.plot_single_item.assert_called_once_with(sine_item)
mw.lst.setSelectionMode(QListWidget.MultiSelection)
sine_item.setSelected(True)
cosine_item.setSelected(True)
assert len(mw.lst.selectedItems()) == 2
mw.plot_multiple_items = mock.MagicMock()
mw.on_plot_selected()
mw.plot_multiple_items.assert_called_once_with([sine_item, cosine_item])
def test_plot_single_item(self):
mw = self.mw
sine_item = mw.lst.lst.get("sine")
sine_item.set_alarm = mock.MagicMock()
mw.activate_or_make_subwin = mock.MagicMock()
mw.plot_single_item(sine_item)
sine_item.set_alarm.assert_called_once_with(False)
mw.activate_or_make_subwin.assert_called_once_with(
MDISubPlot, sine_item.key, sine_item.value
)
def test_plot_multiple_items(self):
mw = self.mw
sine_item = mw.lst.lst.get("sine")
cosine_item = mw.lst.lst.get("cosine")
names = ["sine", "cosine"]
name = " | ".join(names)
items = [sine_item, cosine_item]
descs = (sine_item.value, cosine_item.value)
mw.activate_or_make_subwin = mock.MagicMock()
mw.plot_multiple_items(items)
mw.activate_or_make_subwin.assert_called_once_with(MDISubMultiPlot, name, descs)
def test_activate_or_make_subwin(self):
mw = self.mw
sine_item = mw.lst.lst.get("sine")
sub = MDISubPlot("sine", sine_item.value)
mw.mdi.add(sub)
cosine_item = mw.lst.get("cosine")
mw.mdi.setActiveSubWindow = mock.MagicMock()
assert mw.mdi.findSubWindow("sine")
mw.activate_or_make_subwin(MDISubPlot, sine_item.key, sine_item.value)
mw.mdi.setActiveSubWindow.assert_called_once_with(sub)
mw.make_subwin = mock.MagicMock()
mw.activate_or_make_subwin(MDISubPlot, cosine_item.key, cosine_item.value)
mw.make_subwin.assert_called_once_with(
MDISubPlot, cosine_item.key, cosine_item.value
)
def test_make_subwin(self):
mw = self.mw
cosine_item = mw.lst.get("cosine")
mw.mdi.add = mock.MagicMock()
# sub = MDISubPlot(cosine_item.key, cosine_item.value)
mw.make_subwin(MDISubPlot, cosine_item.key, cosine_item.value)
assert isinstance(mw.mdi.add.call_args[0][0], MDISubPlot)
# mw.mdi.add.assert_called_once_with(sub)