Fix the follow-up review findings in import, layers, startup and engines

- KML/KMZ import: a per-file canvas budget and cache for ground overlays,
  limits on rings and vertices of raised polygons, overlays across 360° and
  near the poles, degenerate holes, polar and single-latitude fills,
  absolute overlays at their altitude, overlay order by drawOrder as on
  Cesium, and pins on tiles keep their measured height.
- Points on the surface: OSM Places and Street Level cones share the
  surface sampler and sit on the terrain before they are measured, within
  a sampling budget per pass; Cockpit's contact-dot bank keeps the dot
  atlas, and a failed fleet model loads again after a pause.
- Startup: the loading screen lifts after the share-link view is restored,
  the retry screen names the failed engine and takes focus, and the
  fallback toast stays for 6 s.
- Engines: an engine switch lands a running camera flight at its
  destination (camera.completeFlight on both engines), the sighting card
  leaves focus on the engine picker after a switch, and a Cesium model
  error stays with the instance that failed.
- The MCP panel builds again: its wind-mesh alias resolves to the stub.
- QA: the wildlife switch waits for the camera to rest, GBFS --w2 says it
  needs the dev server, and test fixtures are shared instead of copied.
This commit is contained in:
German Khokhlov committed 2026-11-10 01:57:11 +04:00
1 parent 0ef29781e5
commit 60fb8fee07
82 files changed
+2363 -1574

No files matched your search

+50
View File
@@ -0,0 +1,50 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
const source = readFileSync(
new URL('./qa-gbfs-names.mjs', import.meta.url),
'utf8',
);
const openSource = source.slice(
source.indexOf('async function open('),
source.indexOf('async function nextFrame('),
);
function fixture({ extended, dev }) {
const page = {
bringToFront: async () => {},
on() {},
setViewport: async () => {},
evaluateOnNewDocument: async () => {},
goto: async () => {},
evaluate: async () => dev,
waitForFunction: async () => {},
};
const dependencies = {
browser: { newPage: async () => page },
extended,
watchBrowserPage() {},
report: {},
appUrl: 'http://localhost:4000',
information: {},
status: {},
fromDegrees: () => ({}),
};
return new Function(
...Object.keys(dependencies),
`${openSource}\nreturn open;`,
)(...Object.values(dependencies));
}
test('preview rejects the optional dev-only raster checks before importing source modules', async () => {
await assert.rejects(
fixture({ extended: true, dev: false })(),
/--w2 requires a Vite dev server/,
);
});
test('normal preview checks and extended dev checks remain available', async () => {
await fixture({ extended: false, dev: false })();
await fixture({ extended: true, dev: true })();
});