mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-08 13:33:42 +08:00
c532223fa0
Bundle the verified VASM model, enable it at startup, and split VASM and vision speed-sign inference across little cores when both are active. Restore VASM warnings in PiP activation, red outlines, and onroad blind-spot borders, including expanded Android Auto views. Improve cabin snapshots with longer warm-up, adjusted capture timeouts, a fresh preview frame, and clearer capture buttons and save prompts. Polish Galaxy settings with dimmed gated controls and icons, clearer vehicle fingerprinting and steering availability descriptions, rounded speed-offset ranges, and immediate refresh after saving. Improve updater startup messages and preserve update/reconnect screens across service interruptions and restarts. Add regression tests for the updated behavior.
77 lines
4.8 KiB
JavaScript
77 lines
4.8 KiB
JavaScript
import assert from "node:assert/strict"
|
|
import { SettingsFeed } from "../web/js/settings.js"
|
|
import { GalaxySettingRow } from "../web/js/galaxy-setting-row.js"
|
|
import { compile } from "../web/vendor/vue/vue.esm-browser.js"
|
|
|
|
const requests = [], updates = []
|
|
const flush = async () => { for (let i = 0; i < 12; i++) await Promise.resolve() }
|
|
const feed = new SettingsFeed({ publish: state => updates.push(state), later: () => 1, cancelTimer: () => {},
|
|
fetcher: (url, options) => new Promise(resolve => requests.push({ url, options, resolve })) })
|
|
async function reply(index, body, status = 200) {
|
|
requests[index].resolve({ ok: status === 200, status, json: async () => body }); await flush()
|
|
}
|
|
const row = { label: "Use StarPilot Widgets", value: "Off", defaultValue: "On", resetAvailable: true,
|
|
choices: ["Off", "On"], page: "", available: true, action: true, revision: "same-settings" }
|
|
const page = { page: "appearance", parked: true, view: "opaque-view", rows: [row] }
|
|
feed.start("appearance")
|
|
await reply(0, page)
|
|
feed.resetDefault(0)
|
|
assert.equal(requests[1].url, "./api/settings/reset-default")
|
|
assert.deepEqual(JSON.parse(requests[1].options.body), { view: "opaque-view", row: 0 })
|
|
await reply(1, { intent: "reset-intent", question: "Reset to default?", proposed: "On" })
|
|
assert.equal(updates.at(-1).pending, null, "defaults never display a per-setting confirmation")
|
|
assert.equal(requests[2].url, "./api/settings/confirm")
|
|
assert.deepEqual(JSON.parse(requests[2].options.body), { intent: "reset-intent", confirmed: true, page: "appearance" })
|
|
await reply(2, { saved: true })
|
|
await reply(3, { ...page, view: "fresh", rows: [{ ...row, value: "On", resetAvailable: false }] })
|
|
feed.resetDefault(0)
|
|
assert.equal(requests.length, 4, "an unavailable default cannot be submitted")
|
|
feed.stop()
|
|
assert.ok(GalaxySettingRow.emits.includes("reset-default"))
|
|
|
|
const renderTemplate = compile(GalaxySettingRow.template, { decodeEntities: raw => raw })
|
|
const rowContext = context => ({ ...context, presentedRow: GalaxySettingRow.computed.presentedRow.call(context) })
|
|
const render = (context, cache) => renderTemplate(rowContext(context), cache)
|
|
function buttons(node) {
|
|
if (!node || typeof node !== "object") return []
|
|
return [...(node.type === "button" ? [node] : []), ...(Array.isArray(node.children) ? node.children.flatMap(buttons) : [])]
|
|
}
|
|
const context = { row, index: 2, control: "switch", currentValue: "Off", dimmed: false, locked: false, busy: false, updating: false,
|
|
showDefault: true, onSwitch: () => {}, $emit: (...args) => events.push(args) }
|
|
const events = []
|
|
const button = buttons(render(context, [])).find(node => node.children === "Default")
|
|
assert.ok(button, "the button is actually rendered for a setting with a default")
|
|
assert.equal(button.props.disabled, false)
|
|
assert.equal(button.props["aria-label"], "Reset Use StarPilot Widgets to default")
|
|
button.props.onClick()
|
|
assert.deepEqual(events, [["reset-default", 2]])
|
|
const savingRow = render({ ...context, locked: true, busy: true }, [])
|
|
assert.equal(savingRow.props.inert, true, "saving blocks interaction without dimming controls")
|
|
assert.equal(buttons(savingRow).find(node => node.children === "Default").props.disabled, false)
|
|
assert.equal(buttons(render({ ...context, dimmed: true }, [])).find(node => node.children === "Default").props.disabled, true)
|
|
assert.equal(buttons(render({ ...context, row: { ...row, defaultValue: null }, showDefault: false }, [])).some(node => node.children === "Default"), false)
|
|
|
|
// A successful mutation invalidates every active consumer without user refreshes.
|
|
let savedValue = "Off"
|
|
const dependent = []
|
|
const sharedFetcher = async (url) => ({ ok: true, status: 200, json: async () => {
|
|
if (url.endsWith("/reset-default")) return { intent: "shared-default" }
|
|
if (url.endsWith("/confirm")) { savedValue = "On"; return { saved: true } }
|
|
const pageName = url.split("/").at(-1)
|
|
return { page: pageName, view: pageName + savedValue, parked: true, rows: [{ ...row, value: savedValue }] }
|
|
} })
|
|
const source = new SettingsFeed({ publish() {}, fetcher: sharedFetcher, later: () => 1, cancelTimer() {} })
|
|
const consumer = new SettingsFeed({ publish: value => dependent.push(value), fetcher: sharedFetcher, later: () => 1, cancelTimer() {} })
|
|
await source.start("appearance")
|
|
await consumer.start("pip")
|
|
await source.resetDefault(0)
|
|
await flush()
|
|
assert.equal(dependent.at(-1).data.rows[0].value, "On")
|
|
source.stop()
|
|
consumer.stop()
|
|
|
|
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row })), true)
|
|
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row: { ...row, value: 'On' } })), false)
|
|
assert.equal(GalaxySettingRow.computed.showDefault.call(rowContext({ row: { ...row, value: '0.9', defaultValue: '0.90' } })), false)
|
|
assert.equal(buttons(render({ ...context, showDefault: false }, [])).some(node => node.children === 'Default'), false)
|