Files
grum/tests/test_mainwin.py

238 lines
7.3 KiB
Python

# import pytest
import sys
# from parameterized import parameterized
from unittest import mock
from PyQt5.QtTest import QSignalSpy
from PyQt5.QtWidgets import QApplication, QAction, QListWidget
from grum.cli import main
from grum.dictlist.dictlistitem import DictListItem
from grum.dictlist import DictList
from grum import ctrl_c, theme, assets
from grum.mainwin import MainWindow
from grum.mdi import MDIArea, MDISubMultiPlot, MDISubPlot
from grum.menus import BarMenu
from grum.menus.rclickmenu import RClickMenu
from grum.plotdesc import PlotDescription
from grum.rpc import RPCServerThread
class TestMainWin:
def setup_method(self):
print("setup")
self.app = QApplication(sys.argv)
theme.apply(self.app)
# ctrl_c.setup(self.app)
self.mw = MainWindow(add_examples=True)
self.mw.show()
def teardown_method(self):
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.plots["sine"].setData = mock.MagicMock()
mw.append_data("sine", point)
sub.plots["sine"].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": sine_item.value, "cosine": 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)