170 lines
5.8 KiB
Python
170 lines
5.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Gezielte Tests: Diktat idle-open + Mini-Diktat Start/Stop-Zyklus."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import inspect
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
ROOT = Path(__file__).resolve().parent
|
|
|
|
|
|
def _func_body(src: str, name: str) -> str:
|
|
marker = f"def {name}"
|
|
idx = src.find(marker)
|
|
if idx < 0:
|
|
return ""
|
|
rest = src[idx + len(marker) :]
|
|
nxt = rest.find("\n def ")
|
|
if nxt < 0:
|
|
nxt = rest.find("\n def ")
|
|
return rest[:nxt] if nxt >= 0 else rest
|
|
|
|
|
|
class DiktatIdleOpenTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
import aza_diktat_mixin as dm
|
|
|
|
cls.dm_src = inspect.getsource(dm.AzaDiktatMixin.open_diktat_window)
|
|
|
|
def test_no_auto_start_after_open(self):
|
|
self.assertNotIn("win.after(350, toggle_diktat)", self.dm_src)
|
|
self.assertNotIn("diktat_auto_start", self.dm_src)
|
|
|
|
def test_initial_status_bereit(self):
|
|
self.assertIn('status_var = tk.StringVar(value="Bereit.")', self.dm_src)
|
|
|
|
def test_central_phase_function(self):
|
|
self.assertIn("def _diktat_recorder_phase", self.dm_src)
|
|
self.assertIn('win._aza_diktat_phase = _diktat_recorder_phase', self.dm_src)
|
|
|
|
def test_refresh_updates_command(self):
|
|
body = _func_body(self.dm_src, "_refresh_diktat_controls")
|
|
self.assertIn("command=toggle_diktat", body)
|
|
self.assertIn("command=lambda: None", body)
|
|
|
|
def test_start_button_idle_label(self):
|
|
self.assertIn('"Diktat starten"', self.dm_src)
|
|
self.assertIn('"Diktat stoppen"', self.dm_src)
|
|
|
|
|
|
class MiniDiktatCommandSwitchTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
import aza_mini_diktat_window as md
|
|
import aza_diktat_mixin as dm
|
|
|
|
cls.md_open = inspect.getsource(md.open_mini_diktat_window)
|
|
cls.md_sync = inspect.getsource(md.sync_mini_diktat_window)
|
|
cls.md_close = inspect.getsource(md.close_mini_diktat_window)
|
|
cls.dm_src = inspect.getsource(dm.AzaDiktatMixin.open_diktat_window)
|
|
|
|
def test_separate_stop_and_weiter_handlers(self):
|
|
self.assertIn("def _on_mini_stop", self.md_open)
|
|
self.assertIn("def _on_mini_weiterfahren", self.md_open)
|
|
self.assertIn("_mini_diktat_on_stop", self.md_open)
|
|
self.assertIn("_mini_diktat_on_weiterfahren", self.md_open)
|
|
|
|
def test_sync_sets_command_not_only_text(self):
|
|
self.assertIn('command=stop_cmd', self.md_sync)
|
|
self.assertIn('command=weiter_cmd', self.md_sync)
|
|
self.assertIn('"Stoppen"', self.md_sync)
|
|
self.assertIn('"Weiterfahren"', self.md_sync)
|
|
|
|
def test_stop_handler_calls_toggle(self):
|
|
body = _func_body(self.md_open, "_on_mini_stop")
|
|
self.assertIn("_aza_diktat_toggle", body)
|
|
self.assertIn("_diktat_neu_busy", body)
|
|
|
|
def test_weiterfahren_does_not_call_weiter_during_recording(self):
|
|
body = _func_body(self.md_open, "_on_mini_weiterfahren")
|
|
self.assertIn('_diktat_phase(diktat_win) == "recording"', body)
|
|
self.assertIn("_on_mini_stop", body)
|
|
|
|
def test_logo_blocked_or_stops_during_recording(self):
|
|
body = _func_body(self.md_open, "_on_logo_click")
|
|
self.assertIn("_mini_diktat_logo_active", body)
|
|
self.assertIn("_on_mini_stop", body)
|
|
|
|
def test_close_waits_for_stop(self):
|
|
self.assertIn("_skip_stop", self.md_close)
|
|
self.assertIn("_wait_recording_stopped", self.md_close)
|
|
self.assertIn("_aza_diktat_toggle", self.md_close)
|
|
|
|
def test_weiterfahren_mixin_stops_if_recording(self):
|
|
body = _func_body(self.dm_src, "_diktat_weiterfahren")
|
|
self.assertIn("_diktat_recorder_phase()", body)
|
|
self.assertIn("toggle_diktat()", body)
|
|
|
|
def test_busy_guard_and_finally_reset(self):
|
|
self.assertIn("self._diktat_neu_busy = True", self.dm_src)
|
|
self.assertIn("def _after_finalize", self.dm_src)
|
|
self.assertIn("finally:", self.dm_src)
|
|
|
|
|
|
class MiniDiktatMockCycleTests(unittest.TestCase):
|
|
def test_phase_idle_recording_finalizing(self):
|
|
import aza_mini_diktat_window as md
|
|
|
|
class FakeWin:
|
|
_phase = "idle"
|
|
|
|
def _aza_diktat_phase(self):
|
|
return self._phase
|
|
|
|
win = FakeWin()
|
|
win._phase = "idle"
|
|
self.assertEqual(md._diktat_phase(win), "idle")
|
|
win._phase = "recording"
|
|
self.assertEqual(md._diktat_phase(win), "recording")
|
|
self.assertTrue(md._is_diktat_recording(win))
|
|
win._phase = "finalizing"
|
|
self.assertEqual(md._diktat_phase(win), "finalizing")
|
|
self.assertFalse(md._is_diktat_recording(win))
|
|
|
|
def test_stop_command_not_weiterfahren(self):
|
|
import aza_mini_diktat_window as md
|
|
|
|
calls = {"toggle": 0, "weiter": 0}
|
|
|
|
class DWin:
|
|
def _aza_diktat_toggle(self):
|
|
calls["toggle"] += 1
|
|
|
|
def _aza_diktat_weiterfahren(self):
|
|
calls["weiter"] += 1
|
|
|
|
def _aza_diktat_phase(self):
|
|
return "recording"
|
|
|
|
app = mock.Mock()
|
|
app._diktat_neu_busy = False
|
|
dw = DWin()
|
|
stop_fn = getattr(md, "open_mini_diktat_window") # noqa: sanity import
|
|
|
|
# Direkt die Stop-Logik spiegeln
|
|
def mini_stop():
|
|
if getattr(app, "_diktat_neu_busy", False):
|
|
return
|
|
fn = getattr(dw, "_aza_diktat_toggle", None)
|
|
if callable(fn):
|
|
fn()
|
|
|
|
mini_stop()
|
|
self.assertEqual(calls["toggle"], 1)
|
|
self.assertEqual(calls["weiter"], 0)
|
|
|
|
|
|
class StartScriptV9Tests(unittest.TestCase):
|
|
def test_points_to_v9(self):
|
|
ps1 = (ROOT / "start_doku_prompt_test.ps1").read_text(encoding="utf-8-sig")
|
|
self.assertIn("test_final_release_candidate_v9", ps1)
|
|
self.assertNotIn("test_final_release_candidate_v8", ps1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|