feat(web-console): refine intelligent cockpit sync interface
This commit is contained in:
@@ -236,19 +236,19 @@ operations:
|
||||
) as response:
|
||||
gesture_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/console-v2.js?v=sync-layout-11", timeout=3
|
||||
f"{self.base_url}/console-v2.js?v=sync-layout-26", timeout=3
|
||||
) as response:
|
||||
console_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/console-v2.css?v=sync-layout-11", timeout=3
|
||||
f"{self.base_url}/console-v2.css?v=sync-layout-26", timeout=3
|
||||
) as response:
|
||||
console_styles = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/self-extension.js?v=sync-layout-11", timeout=3
|
||||
f"{self.base_url}/self-extension.js?v=sync-layout-26", timeout=3
|
||||
) as response:
|
||||
extension_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/self-extension.css?v=sync-layout-11", timeout=3
|
||||
f"{self.base_url}/self-extension.css?v=sync-layout-26", timeout=3
|
||||
) as response:
|
||||
extension_styles = response.read().decode("utf-8").replace("\r\n", "\n")
|
||||
with self.opener.open(
|
||||
@@ -279,10 +279,10 @@ operations:
|
||||
self.assertIn('href="/styles.css?v=dual-seat-9"', html)
|
||||
self.assertIn('src="/gesture-control.js?v=android-pad-8"', html)
|
||||
self.assertNotIn('class="vehicle-system-hud"', html)
|
||||
self.assertIn('src="/console-v2.js?v=sync-layout-11"', html)
|
||||
self.assertIn('href="/console-v2.css?v=sync-layout-11"', html)
|
||||
self.assertIn('src="/self-extension.js?v=sync-layout-11"', html)
|
||||
self.assertIn('href="/self-extension.css?v=sync-layout-11"', html)
|
||||
self.assertIn('src="/console-v2.js?v=sync-layout-26"', html)
|
||||
self.assertIn('href="/console-v2.css?v=sync-layout-26"', html)
|
||||
self.assertIn('src="/self-extension.js?v=sync-layout-26"', html)
|
||||
self.assertIn('href="/self-extension.css?v=sync-layout-26"', html)
|
||||
self.assertNotIn("self-calibration", html)
|
||||
self.assertNotIn("self-repair", html)
|
||||
self.assertNotIn("self-evolution", html)
|
||||
@@ -484,7 +484,7 @@ operations:
|
||||
self.assertIn('client_type: "web_console"', app_script)
|
||||
self.assertIn('canvas.addEventListener("webglcontextlost"', app_script)
|
||||
self.assertIn('"cognitive-agent:module-change"', app_script)
|
||||
self.assertIn('const CACHE_VERSION = "cognitive-agent-pad-v163"', service_worker)
|
||||
self.assertIn('const CACHE_VERSION = "cognitive-agent-pad-v178"', service_worker)
|
||||
self.assertIn('"/assets/pets/self-extension-cat.png?v=3"', service_worker)
|
||||
self.assertIn(".then(() => self.skipWaiting())", service_worker)
|
||||
self.assertNotIn("const cached = await caches.match(request)", service_worker)
|
||||
|
||||
@@ -103,3 +103,113 @@ def test_orchestration_session_reset_remains_available() -> None:
|
||||
orchestration = source("app.js")
|
||||
|
||||
assert 'sessionStorage.removeItem("cognitive-agent.conversation-id")' in orchestration
|
||||
|
||||
|
||||
def test_vehicle_device_status_cards_prioritize_seats_and_expose_manual_controls() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
passenger = console.index('id: "passenger", name: "副驾座椅"')
|
||||
driver = console.index('id: "driver", name: "主驾座椅"')
|
||||
windows = console.index('id: "windows", name: "车窗"')
|
||||
assert passenger < driver < windows
|
||||
|
||||
for key_status in (
|
||||
'["左前窗", readText("#frontLeftWindow")]',
|
||||
'["右前窗", readText("#frontRightWindow")]',
|
||||
'["左后窗", readText("#rearLeftWindow")]',
|
||||
'["右后窗", readText("#rearRightWindow")]',
|
||||
'["当前位置", readText("#shadePositionValue")]',
|
||||
'["按摩模式", massageMode]',
|
||||
'["按摩强度", massageStrength]',
|
||||
'["前排亮度", frontBrightness]',
|
||||
'["前排颜色", frontColor]',
|
||||
'["后排亮度", rearBrightness]',
|
||||
'["后排颜色", rearColor]',
|
||||
):
|
||||
assert key_status in console
|
||||
|
||||
assert 'data-device-control-toggle="${device.id}"' in console
|
||||
assert 'data-device-control-apply="${device.id}"' in console
|
||||
assert 'new CustomEvent("cognitive-agent:vehicle-control-request"' in console
|
||||
assert "window.CognitiveAgentConsole?.executeUtterance?.(utterance" in console
|
||||
assert '.v2-device-control-row input[type="range"]' in styles
|
||||
assert ".v2-device-control-select" in styles
|
||||
assert ".v2-device-control-apply" in styles
|
||||
|
||||
|
||||
def test_interactive_console_keeps_actions_inside_composer_and_collapsed_rails_aligned() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
assert 'const resetButton = $("#newConversation", originalForm);' in console
|
||||
assert 'const runButton = $("#runButton", originalForm);' in console
|
||||
assert "if (resetButton) composer.append(resetButton);" in console
|
||||
assert "if (runButton) composer.append(runButton);" in console
|
||||
|
||||
assert ".v2-request-form .command-composer" in styles
|
||||
assert "overflow: hidden;" in styles
|
||||
assert "transform: translateY(-50%);" in styles
|
||||
assert '.joint-twin-shell[data-open-panels="none"]' in styles
|
||||
assert "grid-template-columns: 48px minmax(520px, 1fr) 48px;" in styles
|
||||
assert "writing-mode: horizontal-tb;" in styles
|
||||
assert "writing-mode: vertical-rl;" in styles
|
||||
|
||||
|
||||
def test_left_sync_rail_can_collapse_and_log_aligns_with_lower_workspace() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
assert 'make("section", "v2-sync-sidebar"' in console
|
||||
assert '<div class="v2-sync-sidebar-overview">' in console
|
||||
assert '$(".v2-sync-sidebar-overview", syncSidebar)?.append(sidebarFooter);' in console
|
||||
assert '$(".v2-sync-sidebar-heading", syncSidebar)?.append(sidebarToggle);' in console
|
||||
assert "function syncSidebarLogBaseline()" in console
|
||||
assert 'sidebar.style.setProperty("--v2-sync-log-top"' in console
|
||||
assert 'window.addEventListener("resize", syncSidebarLogBaseline);' in console
|
||||
assert "requestAnimationFrame(syncSidebarLogBaseline);" in console
|
||||
|
||||
assert "--v2-sync-log-top: 291px;" in styles
|
||||
assert "grid-template-rows: calc(var(--v2-sync-log-top) - 10px) minmax(0, 1fr);" in styles
|
||||
assert ".v2-sync-sidebar > .v2-sync-log" in styles
|
||||
assert "grid-template-columns: 64px minmax(0, 1fr);" in styles
|
||||
assert ".v2-sidebar-collapsed #v2SidebarToggle" in styles
|
||||
|
||||
|
||||
def test_twin_device_status_popover_has_clear_close_paths() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
assert 'data-twin-popover-close aria-label="关闭${escapeHtml(device.name)}状态详情"' in console
|
||||
assert 'popover.setAttribute("role", "dialog");' in console
|
||||
assert 'popover.setAttribute("aria-label", "车端设备状态详情");' in console
|
||||
assert 'event.target.closest("[data-twin-popover-close]")' in console
|
||||
assert 'event.target.closest("[data-twin-device], #v2TwinDevicePopover")' in console
|
||||
assert "const samePinned = displaySync.pinnedDevice === focus.dataset.deviceFocus;" in console
|
||||
assert "clearTwinDevicePreview({ force: true });" in console
|
||||
assert ".v2-twin-popover-close" in styles
|
||||
assert ".v2-twin-popover-close:focus-visible" in styles
|
||||
|
||||
|
||||
def test_twin_device_hotspots_use_responsive_hover_and_leader_labels() -> None:
|
||||
console = source("console-v2.js")
|
||||
styles = source("console-v2.css")
|
||||
|
||||
assert "previewClearTimer: null" in console
|
||||
assert "hoverSuppressedUntil: 0" in console
|
||||
assert 'class="v2-twin-hotspot-label"' in console
|
||||
assert 'button.addEventListener("pointerenter"' in console
|
||||
assert 'button.addEventListener("pointerleave"' in console
|
||||
assert "scheduleTwinDevicePreviewClear();" in console
|
||||
assert "}, 45);" in console
|
||||
assert "performance.now() + 160" in console
|
||||
assert 'hotspots.addEventListener("pointerover"' not in console
|
||||
assert 'hotspots.addEventListener("pointerout"' not in console
|
||||
|
||||
assert ".v2-twin-hotspots button::before" in styles
|
||||
assert ".v2-twin-hotspots button::after" in styles
|
||||
assert ".v2-twin-hotspot-label" in styles
|
||||
assert "--v2-hotspot-label-x: -115px" in styles
|
||||
assert "--v2-hotspot-line-angle: -150deg" in styles
|
||||
assert '.v2-twin-device-popover[data-pinned="false"]' in styles
|
||||
assert "pointer-events: none;" in styles
|
||||
|
||||
Reference in New Issue
Block a user