"""gitea:Adriano/TieMeasureFlow#118 #119 #120 #121 - pannello visione dell'operatore (task_execute.html). Controlli sul testo del template: barra in alto con/senza camera, pulsante Salva, conteggio quote e «Completato» dopo «Registra», cella NaN, svg al posto del canvas. """ import re from pathlib import Path TEMPLATE = Path(__file__).resolve().parents[1] / "templates" / "measure" / "task_execute.html" SRC = TEMPLATE.read_text(encoding="utf-8") def _panel(): start = SRC.rindex(" NaN), non da Number(r.value).toFixed panel = _panel() assert 'fmtValue(r.value, r.unit)' in panel assert "Number(r.value)" not in panel def test_can_leave_task_depends_on_vision_recorded(): # #120: «Completato» e «Fine ciclo misura» richiedono visionRecorded per i task visione m = re.search(r"get canLeaveTask\(\) \{(.*?)\n \},", SRC, re.S) assert m and "isVisionTask && !this.visionRecorded" in m.group(1) assert m.group(1).index("visionRecorded") < m.group(1).index("cycleConfirmed") assert "visionRecorded: false" in SRC def test_missing_label_says_record_the_piece(): # #120: non registrato -> «Registra il pezzo», non «Mancano N quote» m = re.search(r"get missingQuotesLabel\(\) \{(.*?)\n \},", SRC, re.S) assert m and "Registra il pezzo" in m.group(1) assert m.group(1).index("Registra il pezzo") < m.group(1).index("Mancano") def test_page_listens_to_vision_recorded_and_resets(): # #120: la radice ascolta l'evento; resetForNewCycle azzera visionRecorded; il ripristino mette deviation null assert '@vision-recorded.window="onVisionRecorded($event.detail)"' in SRC m = re.search(r"resetForNewCycle\(\) \{(.*?)\n \},", SRC, re.S) assert m and "visionRecorded = false" in m.group(1) m = re.search(r"onVisionRecorded\(detail\) \{(.*?)\n \},", SRC, re.S) assert m and "visionRecorded = true" in m.group(1) and "this.measurements = " in m.group(1) assert "deviation: m.value == null ? null" in SRC assert "if (this.isVisionTask) this.visionRecorded = true" in SRC