| """Regression tests for preview-image rendering.""" |
|
|
| from __future__ import annotations |
|
|
| from io import BytesIO |
| import json |
| from pathlib import Path |
| from types import SimpleNamespace |
| import unittest |
| from unittest.mock import patch |
|
|
| from PIL import Image |
|
|
| from ui import PREVIEW_MAX_SIZE, PreviewWindow, render_preview_image |
|
|
|
|
| class PreviewRenderTests(unittest.TestCase): |
| def test_preview_size_leaves_room_for_music_controls(self) -> None: |
| self.assertEqual(PREVIEW_MAX_SIZE, (300, 300)) |
|
|
| def test_manifest_uses_face_tracking_application_identity(self) -> None: |
| manifest_path = Path(__file__).resolve().parents[1] / "app.json" |
| manifest = json.loads(manifest_path.read_text(encoding="utf-8")) |
|
|
| self.assertEqual(manifest["id"], "local.face_tracking_application") |
| self.assertEqual(manifest["name"], "人脸跟随应用") |
| self.assertEqual(manifest["supported_host_platforms"], ["windows", "macos"]) |
| self.assertEqual( |
| manifest["description"], |
| "An SDK-powered face-tracking and music playback application.", |
| ) |
| self.assertIn("av>=16,<17", manifest["dependencies"]) |
|
|
| def test_renders_sdk_jpeg_and_face_box_within_preview_bounds(self) -> None: |
| source = Image.new("RGB", (300, 300), "white") |
| encoded = BytesIO() |
| source.save(encoded, format="JPEG") |
| face = SimpleNamespace(x=150, y=150, width=100, height=80, score=88) |
|
|
| rendered = render_preview_image(encoded.getvalue(), (face,)) |
|
|
| self.assertLessEqual(rendered.width, PREVIEW_MAX_SIZE[0]) |
| self.assertLessEqual(rendered.height, PREVIEW_MAX_SIZE[1]) |
| self.assertNotEqual(rendered.getpixel((100, 110)), (255, 255, 255)) |
| self.assertEqual(rendered.getpixel((150, 150)), (255, 255, 255)) |
|
|
| def test_closed_window_skips_widget_updates_during_shutdown(self) -> None: |
| window = PreviewWindow.__new__(PreviewWindow) |
| window._is_open = False |
|
|
| window._set_pairing_enabled(True) |
| window._set_preview_buttons(online=True, running=False) |
|
|
| def test_music_stop_needs_explicit_confirmation(self) -> None: |
| window = PreviewWindow.__new__(PreviewWindow) |
| window._root = object() |
| window._music_action = None |
|
|
| with patch("ui.messagebox.askyesno", return_value=False): |
| window._request_stop_music() |
|
|
| self.assertIsNone(window._music_action) |
|
|
| def test_confirmed_music_stop_queues_the_stop_action(self) -> None: |
| window = PreviewWindow.__new__(PreviewWindow) |
| window._root = object() |
| window._music_action = None |
|
|
| with patch("ui.messagebox.askyesno", return_value=True): |
| window._request_stop_music() |
|
|
| self.assertEqual(window._music_action, "stop") |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|