89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
"""Window controls remain usable after removing the native desktop frame."""
|
|
|
|
import os
|
|
from unittest import TestCase, main, mock
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
from PySide6.QtCore import QPoint, Qt
|
|
from PySide6.QtTest import QTest
|
|
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
|
|
|
|
from desktop_window import DesktopWindowBar
|
|
|
|
|
|
class DesktopWindowTest(TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.app = QApplication.instance() or QApplication([])
|
|
|
|
def setUp(self):
|
|
self.window = QMainWindow()
|
|
self.window.resize(1000, 700)
|
|
self.bar = DesktopWindowBar(self.window)
|
|
self.window.setMenuBar(self.bar)
|
|
self.window.setCentralWidget(QWidget())
|
|
self.account = self.bar.addMenu("账号 · admin")
|
|
self.account.addAction("退出登录")
|
|
self.window.show()
|
|
self.app.processEvents()
|
|
|
|
def tearDown(self):
|
|
self.window.close()
|
|
self.window.deleteLater()
|
|
self.app.processEvents()
|
|
|
|
def test_buttons_minimize_restore_maximize_and_close(self):
|
|
self.assertTrue(self.window.windowFlags() & Qt.FramelessWindowHint)
|
|
self.bar.minimize_button.click()
|
|
self.assertTrue(self.window.isMinimized())
|
|
self.window.showNormal()
|
|
self.bar.maximize_button.click()
|
|
self.assertTrue(self.window.isMaximized())
|
|
self.assertEqual(self.bar.maximize_button.accessibleName(), "还原")
|
|
self.bar.maximize_button.click()
|
|
self.assertFalse(self.window.isMaximized())
|
|
self.assertEqual(self.bar.maximize_button.accessibleName(), "最大化")
|
|
self.bar.close_button.click()
|
|
self.assertFalse(self.window.isVisible())
|
|
|
|
def test_blank_header_moves_and_double_click_maximizes(self):
|
|
handle = mock.Mock()
|
|
with mock.patch.object(self.window, "windowHandle", return_value=handle):
|
|
QTest.mouseClick(self.bar, Qt.LeftButton, pos=QPoint(400, 16))
|
|
handle.startSystemMove.assert_called_once_with()
|
|
QTest.mouseDClick(self.bar, Qt.LeftButton, pos=QPoint(400, 16))
|
|
self.assertTrue(self.window.isMaximized())
|
|
QTest.mouseDClick(self.bar, Qt.LeftButton, pos=QPoint(400, 16))
|
|
self.assertFalse(self.window.isMaximized())
|
|
|
|
def test_account_menu_stays_available(self):
|
|
handle = mock.Mock()
|
|
point = self.bar.actionGeometry(self.account.menuAction()).center()
|
|
with mock.patch.object(self.window, "windowHandle", return_value=handle):
|
|
QTest.mouseClick(self.bar, Qt.LeftButton, pos=point)
|
|
handle.startSystemMove.assert_not_called()
|
|
self.assertTrue(self.account.isVisible())
|
|
self.assertEqual(self.account.actions()[0].text(), "退出登录")
|
|
self.account.hide()
|
|
|
|
def test_edges_resize_without_visible_frame_and_hide_when_maximized(self):
|
|
for edges, grip in self.bar._resize_handles.items():
|
|
with self.subTest(edges=edges):
|
|
self.assertTrue(self.window.rect().contains(grip.geometry()))
|
|
self.assertTrue(grip.isVisible())
|
|
handle = mock.Mock()
|
|
with mock.patch.object(self.window, "windowHandle", return_value=handle):
|
|
QTest.mouseClick(grip, Qt.LeftButton)
|
|
handle.startSystemResize.assert_called_once_with(edges)
|
|
self.window.showMaximized()
|
|
self.app.processEvents()
|
|
self.assertTrue(all(grip.isHidden() for grip in self.bar._resize_handles.values()))
|
|
self.window.showNormal()
|
|
self.app.processEvents()
|
|
self.assertTrue(all(grip.isVisible() for grip in self.bar._resize_handles.values()))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|