from __future__ import annotations from pathlib import Path ROOT = Path(__file__).resolve().parents[2] def source(name: str) -> str: return (ROOT / "apps" / "web-console" / name).read_text(encoding="utf-8") def test_calibration_twin_tracks_labels_and_commits_direct_axis_drag() -> None: calibration = source("self-calibration.js") seat3d = source("self-repair-seat3d.js") styles = source("self-calibration.css") assert 'data-seat-axis-label="backrest"' in calibration assert 'data-seat-label-line="legrest"' in calibration assert 'window.addEventListener("calibration-seat-axis-preview"' in calibration assert 'window.addEventListener("calibration-seat-axis-commit"' in calibration assert "function layoutSeatLabels()" in seat3d assert "makePanel(legrestPivot, cushionShape(0.08)" in seat3d assert "function legrestShape(" not in seat3d assert 'enableAxisDrag: true' in seat3d assert 'function startAxisDrag(axis, event, source = "model")' in seat3d assert 'startAxisDrag(item.axis, event, "label")' in seat3d assert "calculateAxisDragVector(axis, value)" in seat3d assert "Math.max(0, Math.min(100," in seat3d assert 'new CustomEvent("calibration-seat-axis-commit"' in seat3d assert ".v2-calibration-label-lines line" in styles assert '.v2-axis-tag[data-control-enabled="true"]' in styles assert "pointer-events: auto;" in styles def test_extension_pet_and_transient_vehicle_state_restart_contract() -> None: extension = source("self-extension.js") styles = source("self-extension.css") assert 'id="extensionDesktopPet"' in extension assert "function initializeDesktopPet()" in extension assert "saved.vehicleExecutions = {};" in extension assert "saved.lastProtocol = null;" in extension assert ".v2-extension-pet-body" in styles assert "@keyframes extension-pet-blink" in styles def test_virtual_modules_reset_but_physical_sessions_remain_authoritative() -> None: orchestration = source("app.js") calibration = source("self-calibration.js") repair = source("self-repair.js") assert 'sessionStorage.removeItem("cognitive-agent.conversation-id")' in orchestration assert 'api("/session/reset")' in calibration assert 'if (state.transport?.mode === "simulation")' in calibration assert 'if (backendMode === "bench")' in repair assert 'await apiPost("/runtime/reset-statistics")' in repair