123 lines
4.5 KiB
Python
123 lines
4.5 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
import pytest
|
|
from PySide6.QtCore import QPoint, Qt
|
|
from PySide6.QtTest import QTest
|
|
from PySide6.QtWidgets import QApplication, QHBoxLayout, QPushButton, QWidget
|
|
|
|
from doctor_workstation.ui.pages.reception import RECEPTION_QSS, _ReceptionCompleteButton
|
|
from doctor_workstation.ui.theme import apply_theme
|
|
|
|
|
|
@pytest.fixture
|
|
def controls():
|
|
app = QApplication.instance() or QApplication([])
|
|
old_stylesheet, old_font, old_palette = app.styleSheet(), app.font(), app.palette()
|
|
old_style = app.style().objectName()
|
|
apply_theme(app)
|
|
host = QWidget()
|
|
host.setObjectName("ReceptionPage")
|
|
host.setStyleSheet(RECEPTION_QSS)
|
|
layout = QHBoxLayout(host)
|
|
layout.setContentsMargins(20, 20, 20, 20)
|
|
layout.setSpacing(12)
|
|
button = _ReceptionCompleteButton(host)
|
|
neighbor = QPushButton("通知医助", host)
|
|
neighbor.setObjectName("ReceptionNotifyButton")
|
|
layout.addWidget(button)
|
|
layout.addWidget(neighbor)
|
|
host.show()
|
|
host.activateWindow()
|
|
button.clearFocus()
|
|
neighbor.clearFocus()
|
|
QTest.mouseMove(host, QPoint(1, 1))
|
|
app.processEvents()
|
|
yield app, host, button, neighbor
|
|
host.close()
|
|
host.deleteLater()
|
|
app.processEvents()
|
|
app.setStyle(old_style)
|
|
app.setFont(old_font)
|
|
app.setPalette(old_palette)
|
|
app.setStyleSheet(old_stylesheet)
|
|
|
|
|
|
def surface_color(button: QPushButton, *, border: bool = False) -> str:
|
|
image = button.grab().toImage()
|
|
scale = image.devicePixelRatio()
|
|
return image.pixelColor(
|
|
round((0 if border else 7) * scale), round(button.height() / 2 * scale)
|
|
).name()
|
|
|
|
|
|
def test_completion_hover_press_and_leave_have_feedback_without_layout_shift(controls):
|
|
app, host, button, neighbor = controls
|
|
geometry, neighbor_geometry = button.geometry(), neighbor.geometry()
|
|
clicked: list[bool] = []
|
|
button.clicked.connect(lambda: clicked.append(True))
|
|
assert surface_color(button) == "#ffffff"
|
|
assert button.cursor().shape() == Qt.CursorShape.PointingHandCursor
|
|
|
|
QTest.mouseMove(button, button.rect().center())
|
|
app.processEvents()
|
|
assert button.underMouse()
|
|
assert surface_color(button) == "#fff0f2"
|
|
assert button.geometry() == geometry
|
|
assert neighbor.geometry() == neighbor_geometry
|
|
|
|
QTest.mousePress(button, Qt.MouseButton.LeftButton, pos=button.rect().center())
|
|
app.processEvents()
|
|
assert surface_color(button) == "#ffe4e8"
|
|
assert button.geometry() == geometry
|
|
assert neighbor.geometry() == neighbor_geometry
|
|
# Dragging outside and releasing must not activate the completion action.
|
|
QTest.mouseMove(button, QPoint(-5, -5))
|
|
QTest.mouseRelease(button, Qt.MouseButton.LeftButton, pos=QPoint(-5, -5))
|
|
QTest.mouseMove(host, QPoint(1, 1))
|
|
button.clearFocus()
|
|
app.processEvents()
|
|
assert clicked == []
|
|
assert surface_color(button) == "#ffffff"
|
|
assert button.geometry() == geometry
|
|
assert neighbor.geometry() == neighbor_geometry
|
|
|
|
|
|
def test_completion_disabled_hover_does_not_look_or_act_enabled(controls):
|
|
app, _host, button, _neighbor = controls
|
|
clicked: list[bool] = []
|
|
button.clicked.connect(lambda: clicked.append(True))
|
|
button.setEnabled(False)
|
|
QTest.mouseMove(button, button.rect().center())
|
|
app.processEvents()
|
|
assert surface_color(button) == "#f7fafe"
|
|
assert button.cursor().shape() == Qt.CursorShape.ArrowCursor
|
|
QTest.mouseClick(button, Qt.MouseButton.LeftButton)
|
|
assert clicked == []
|
|
button.setEnabled(True)
|
|
app.processEvents()
|
|
assert button.cursor().shape() == Qt.CursorShape.PointingHandCursor
|
|
assert surface_color(button) != "#f7f7f7"
|
|
|
|
|
|
def test_completion_keyboard_focus_is_visible_without_resizing(controls):
|
|
app, _host, button, neighbor = controls
|
|
geometry, neighbor_geometry = button.geometry(), neighbor.geometry()
|
|
neighbor.setFocus(Qt.FocusReason.TabFocusReason)
|
|
app.processEvents()
|
|
border_before = surface_color(button, border=True)
|
|
button.setFocus(Qt.FocusReason.TabFocusReason)
|
|
app.processEvents()
|
|
assert button.hasFocus()
|
|
assert surface_color(button, border=True) == "#be4b58"
|
|
assert surface_color(button, border=True) != border_before
|
|
assert button.geometry() == geometry
|
|
assert neighbor.geometry() == neighbor_geometry
|
|
QTest.mouseMove(button, button.rect().center())
|
|
app.processEvents()
|
|
assert surface_color(button) == "#fff0f2"
|
|
assert surface_color(button, border=True) == "#be4b58"
|