From 80cc0b536e0b5820b6d89efc7c6e62a5af5b463d Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 15 Oct 2026 22:34:25 +0400 Subject: [PATCH] style: format the phase 2 files and add them to the format scope Prettier on the 13 new test files that failed --check; format-scope.json now lists every file phase 2 added (src/globe/**, engineChoice, navaraMode, cameraAngles, the QA scripts and pages, build/navaraAssets and tests). --- scripts/format-scope.json | 59 +++++++++++++++++++- src/annotations/resolverEngine.test.mjs | 22 ++++++-- src/app/controls.test.mjs | 5 +- src/data/cameraSensitivity.test.mjs | 10 +++- src/globe/navara/cameraMath.test.mjs | 17 ++++-- src/globe/navara/cameraModel.test.mjs | 31 +++++++--- src/globe/navara/createNavaraEngine.test.mjs | 48 +++++++++++++--- src/globe/navara/credits.test.mjs | 8 ++- src/globe/navara/input.test.mjs | 5 +- src/globe/navara/internals.test.mjs | 7 ++- src/globe/navara/maps.test.mjs | 31 +++++++--- src/globe/navara/surface.test.mjs | 7 ++- src/orbit.test.mjs | 15 ++++- src/sharelinkPose.test.mjs | 10 +++- 14 files changed, 229 insertions(+), 46 deletions(-) diff --git a/scripts/format-scope.json b/scripts/format-scope.json index dfed388ca..91f724cbc 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1002,5 +1002,62 @@ "src/tools/globePanel.test.mjs", "src/costEndpointThrottle.test.mjs", "src/sources/gbfsStations.test.mjs", - "scripts/qa-gbfs-names.mjs" + "scripts/qa-gbfs-names.mjs", + "build/navaraAssets.js", + "scripts/qa-engine-bench.mjs", + "scripts/qa-engine-shell.mjs", + "scripts/qa/navara-contract.html", + "scripts/qa/navaraContractPage.js", + "src/annotations/resolverEngine.test.mjs", + "src/app/controls.test.mjs", + "src/app/engineChoice.js", + "src/app/engineChoice.test.mjs", + "src/app/navaraMode.js", + "src/app/navaraScene.test.mjs", + "src/app/viewerlessTools.test.mjs", + "src/cameraAngles.js", + "src/cameraAngles.test.mjs", + "src/data/cameraArrival.test.mjs", + "src/data/cameraSensitivity.test.mjs", + "src/globe/cesium/camera.js", + "src/globe/cesium/convert.js", + "src/globe/cesium/createCesiumEngine.js", + "src/globe/cesium/credits.js", + "src/globe/cesium/events.js", + "src/globe/cesium/frames.js", + "src/globe/cesium/input.js", + "src/globe/cesium/maps.js", + "src/globe/cesium/picker.js", + "src/globe/cesium/projector.js", + "src/globe/cesium/render.js", + "src/globe/cesium/surface.js", + "src/globe/contract.js", + "src/globe/navara/cameraMath.js", + "src/globe/navara/cameraMath.test.mjs", + "src/globe/navara/cameraModel.js", + "src/globe/navara/cameraModel.test.mjs", + "src/globe/navara/createNavaraEngine.js", + "src/globe/navara/createNavaraEngine.test.mjs", + "src/globe/navara/credits.js", + "src/globe/navara/credits.test.mjs", + "src/globe/navara/groundFloor.js", + "src/globe/navara/groundFloor.test.mjs", + "src/globe/navara/index.js", + "src/globe/navara/input.js", + "src/globe/navara/input.test.mjs", + "src/globe/navara/internals.js", + "src/globe/navara/internals.test.mjs", + "src/globe/navara/maps.js", + "src/globe/navara/maps.test.mjs", + "src/globe/navara/surface.js", + "src/globe/navara/surface.test.mjs", + "src/globe/navara/viewOptions.js", + "src/globe/navara/viewOptions.test.mjs", + "src/globe/testing/contractSuite.mjs", + "src/globe/testing/fakeEngine.js", + "src/mapStackController.test.mjs", + "src/orbit.test.mjs", + "src/services/groundSnap.test.mjs", + "src/sharelinkPose.test.mjs", + "src/tooling/navaraAssets.test.mjs" ] diff --git a/src/annotations/resolverEngine.test.mjs b/src/annotations/resolverEngine.test.mjs index 26eabe420..9396cd34a 100644 --- a/src/annotations/resolverEngine.test.mjs +++ b/src/annotations/resolverEngine.test.mjs @@ -33,7 +33,10 @@ test('viewportBias reads the engine view rectangle', () => { east: geo.math.toRadians(-97.5), north: geo.math.toRadians(30.5), }); - assert.equal(resolver.viewportBias(engine), '30.0000,-98.0000|30.5000,-97.5000'); + assert.equal( + resolver.viewportBias(engine), + '30.0000,-98.0000|30.5000,-97.5000', + ); engine.fake.script('viewRectangle', undefined); assert.equal(resolver.viewportBias(engine), null); }); @@ -43,7 +46,9 @@ test('pickWorldFromScreen tries the depth pick, then the ellipsoid, then the glo const depth = geo.cartesian3.fromDegrees(-97.7, 30.3, 210); engine.fake.script('pickPosition', depth); const picked = resolver.pickWorldFromScreen(engine, 0.5, 0.5); - assert.ok(Math.abs(picked.lat - 30.3) < 1e-9 && Math.abs(picked.height - 210) < 1e-6); + assert.ok( + Math.abs(picked.lat - 30.3) < 1e-9 && Math.abs(picked.height - 210) < 1e-6, + ); const [screen] = engine.fake.callsOf('picker.pickPosition')[0].args; assert.deepEqual([screen.x, screen.y], [512, 384]); @@ -53,7 +58,10 @@ test('pickWorldFromScreen tries the depth pick, then the ellipsoid, then the glo assert.ok(Math.abs(ellipsoid.height) < 1e-3); engine.fake.script('pickEllipsoid', undefined); - engine.fake.script('pickGlobe', geo.cartesian3.fromDegrees(-97.71, 30.25, 300)); + engine.fake.script( + 'pickGlobe', + geo.cartesian3.fromDegrees(-97.71, 30.25, 300), + ); const globe = resolver.pickWorldFromScreen(engine, 0.5, 0.5); assert.ok(Math.abs(globe.height - 300) < 1e-6); engine.fake.script('pickGlobe', undefined); @@ -71,7 +79,13 @@ test('near-view recovery centres on the engine camera when nothing is picked', a return []; }, }; - await resolver.placesNearViewRecovery(engine, 'cafe', null, undefined, placeSearch); + await resolver.placesNearViewRecovery( + engine, + 'cafe', + null, + undefined, + placeSearch, + ); assert.equal(centres.length, 1); assert.ok(Math.abs(centres[0].latitude - 48.85) < 1e-9); assert.ok(Math.abs(centres[0].longitude - 2.35) < 1e-9); diff --git a/src/app/controls.test.mjs b/src/app/controls.test.mjs index 74843f105..67f0ddb60 100644 --- a/src/app/controls.test.mjs +++ b/src/app/controls.test.mjs @@ -11,7 +11,10 @@ const read = (relative) => test('the controls pass the scene engine to the shell', () => { const controls = read('./controls.js'); - assert.match(controls, /scene: \{ viewer, engine, mapStackController, operations \}/); + assert.match( + controls, + /scene: \{ viewer, engine, mapStackController, operations \}/, + ); assert.match(controls, /new Controls\(viewer, \{[\s\S]*?\n\s+engine,\n/); }); diff --git a/src/data/cameraSensitivity.test.mjs b/src/data/cameraSensitivity.test.mjs index 5020f991b..d0d68c867 100644 --- a/src/data/cameraSensitivity.test.mjs +++ b/src/data/cameraSensitivity.test.mjs @@ -12,8 +12,14 @@ test('claims on a globe engine set its camera sensitivity and share one ledger', assert.equal(claimCameraSensitivity(engine, 'traffic', 0.05), 0.05); assert.equal(engine.camera.percentageChanged, 0.05); // The engine and its camera are the same claimant. - assert.equal(claimCameraSensitivity(engine.camera, 'installations', 0.01), 0.01); - assert.deepEqual(cameraSensitivityClaims(engine), ['traffic', 'installations']); + assert.equal( + claimCameraSensitivity(engine.camera, 'installations', 0.01), + 0.01, + ); + assert.deepEqual(cameraSensitivityClaims(engine), [ + 'traffic', + 'installations', + ]); assert.equal(releaseCameraSensitivity(engine, 'installations'), 0.05); assert.equal(releaseCameraSensitivity(engine.camera, 'traffic'), 0.5); assert.equal(engine.camera.percentageChanged, 0.5); diff --git a/src/globe/navara/cameraMath.test.mjs b/src/globe/navara/cameraMath.test.mjs index 343de7a47..2499a6f35 100644 --- a/src/globe/navara/cameraMath.test.mjs +++ b/src/globe/navara/cameraMath.test.mjs @@ -56,7 +56,12 @@ function cameraAt(lon, lat, height, heading, pitch, roll, size = [1280, 800]) { test('heading π/2 at pitch 0 looks east with up along the local up', () => { const position = cartesian3.fromDegrees(-120, 35, 3000); - const { direction, up } = orientationVectors(position, math.PI_OVER_TWO, 0, 0); + const { direction, up } = orientationVectors( + position, + math.PI_OVER_TWO, + 0, + 0, + ); const axes = axesAt(position); near(dot(direction, axes.east), 1, 1e-12, 'direction·east'); near(dot(up, axes.up), 1, 1e-12, 'up·up'); @@ -183,11 +188,11 @@ test('viewProjection agrees with projectToWindow', () => { test('horizonVisible: the nadir is visible and the antipode hidden', () => { const eye = cartesian3.fromDegrees(20, 10, 1e6); assert.equal(horizonVisible(eye, cartesian3.fromDegrees(20, 10, 0)), true); - assert.equal(horizonVisible(eye, cartesian3.fromDegrees(-160, -10, 0)), false); assert.equal( - horizonVisible(eye, cartesian3.fromDegrees(-70, 10, 2e7)), - true, + horizonVisible(eye, cartesian3.fromDegrees(-160, -10, 0)), + false, ); + assert.equal(horizonVisible(eye, cartesian3.fromDegrees(-70, 10, 2e7)), true); }); test("viewRectangle matches Cesium's computeViewRectangle (S4 reference poses)", () => { @@ -255,7 +260,9 @@ test('rectangleViewPosition frames a rectangle at the centre of a nadir view', ( [rectangle.east, rectangle.north], ]) { const corner = projectToWindow(camera, cartesian3.fromRadians(lon, lat)); - assert.ok(corner.x >= 0 && corner.x <= 1280 && corner.y >= 0 && corner.y <= 800); + assert.ok( + corner.x >= 0 && corner.x <= 1280 && corner.y >= 0 && corner.y <= 800, + ); } }); diff --git a/src/globe/navara/cameraModel.test.mjs b/src/globe/navara/cameraModel.test.mjs index 7ccd12cc0..b45604846 100644 --- a/src/globe/navara/cameraModel.test.mjs +++ b/src/globe/navara/cameraModel.test.mjs @@ -326,9 +326,11 @@ test('lookAt locks the transform, aims at the target and release keeps the pose' target, geo.ellipsoid.WGS84, ); - camera.transform().forEach((value, index) => - near(value, frame[index], 1e-9, `transform[${index}]`), - ); + camera + .transform() + .forEach((value, index) => + near(value, frame[index], 1e-9, `transform[${index}]`), + ); camera.release(); assert.deepEqual(camera.transform(), [...matrix4.IDENTITY]); near( @@ -395,8 +397,15 @@ test('picks, projection and view rectangle come from the pose and canvas size', const back = model.worldToWindow(hit); near(back.x, centre.x, 1e-6, 'x'); const rectangle = camera.viewRectangle(); - assert.ok(rectangle.west < math.toRadians(20) && math.toRadians(20) < rectangle.east); - near(camera.pose().fovy, 2 * Math.atan(Math.tan(Math.PI / 6) / 1.6), 1e-15, 'fovy'); + assert.ok( + rectangle.west < math.toRadians(20) && math.toRadians(20) < rectangle.east, + ); + near( + camera.pose().fovy, + 2 * Math.atan(Math.tan(Math.PI / 6) / 1.6), + 1e-15, + 'fovy', + ); }); test('destroy cancels a running flight and stops the moveEnd timer', () => { @@ -452,7 +461,12 @@ test('livePosition is one engine-owned object holding the current position; heig const moved = cartesian3.fromDegrees(21, 11, 9e5); port.drawn = { position: moved, ...orientationVectors(moved, 0.3, -1, 0) }; frame(); - near(cartesian3.distance(camera.livePosition, moved), 0, 1e-9, 'follows Navara'); + near( + cartesian3.distance(camera.livePosition, moved), + 0, + 1e-9, + 'follows Navara', + ); near(camera.height(), 9e5, 1e-6, 'height after a user move'); const pose = camera.pose(); assert.notEqual(pose.position, live, 'pose shares the live object'); @@ -469,7 +483,10 @@ test('commanded fires before each camera command and never for reads', () => { assert.equal(raised, 0); const target = cartesian3.fromDegrees(10, 10, 0); camera.setView({ destination: cartesian3.fromDegrees(10, 10, 1e6) }); - camera.flyTo({ destination: cartesian3.fromDegrees(11, 10, 1e6), duration: 0 }); + camera.flyTo({ + destination: cartesian3.fromDegrees(11, 10, 1e6), + duration: 0, + }); camera.flyToSphere({ center: target, radius: 10 }, { duration: 0 }); camera.lookAt(target, { heading: 0, pitch: -1, range: 500 }); camera.cancelFlight(); diff --git a/src/globe/navara/createNavaraEngine.test.mjs b/src/globe/navara/createNavaraEngine.test.mjs index 34fb980ea..e36dc23c2 100644 --- a/src/globe/navara/createNavaraEngine.test.mjs +++ b/src/globe/navara/createNavaraEngine.test.mjs @@ -18,14 +18,31 @@ function fakeView() { parentElement: { id: 'container' }, }); const position = cartesian3.fromDegrees(0, 0, 1e7); - const { direction, up } = orientationVectors(position, 0, -math.PI_OVER_TWO, 0); + const { direction, up } = orientationVectors( + position, + 0, + -math.PI_OVER_TWO, + 0, + ); // three's camera.matrixWorld: columns right, up, back (−direction), position. const right = cartesian3.cross(direction, up, cartesian3.create()); const elements = [ - right.x, right.y, right.z, 0, - up.x, up.y, up.z, 0, - -direction.x, -direction.y, -direction.z, 0, - position.x, position.y, position.z, 1, + right.x, + right.y, + right.z, + 0, + up.x, + up.y, + up.z, + 0, + -direction.x, + -direction.y, + -direction.z, + 0, + position.x, + position.y, + position.z, + 1, ]; const view = { canvas, @@ -58,7 +75,9 @@ function fakeView() { view.calls.push(['setCamera', pose]); }, flyTo(pose, options) { - return new Promise((resolve) => view.flights.push({ pose, options, resolve })); + return new Promise((resolve) => + view.flights.push({ pose, options, resolve }), + ); }, forceUpdate() { view.calls.push(['forceUpdate']); @@ -135,7 +154,12 @@ test("the camera starts from Navara's drawn camera and pushes poses with setCame test("Navara's fov follows Cesium's vertical fov, also after a resize", () => { const { view, engine } = setup(); - near(view.camera.fovs.at(-1), math.toDegrees(cesiumFovy(1280, 800)), 1e-12, 'fov'); + near( + view.camera.fovs.at(-1), + math.toDegrees(cesiumFovy(1280, 800)), + 1e-12, + 'fov', + ); view.canvas.clientWidth = 600; view.canvas.clientHeight = 900; view.emit('resize', 600, 900); @@ -187,7 +211,10 @@ test('the projector agrees with the camera', () => { const window = engine.projector.worldToWindow(ahead); near(window.x, 640, 1e-6, 'x'); near(window.y, 400, 1e-6, 'y'); - assert.equal(engine.projector.horizonVisible(cartesian3.fromDegrees(0, 0)), true); + assert.equal( + engine.projector.horizonVisible(cartesian3.fromDegrees(0, 0)), + true, + ); }); test('destroy removes its Navara listeners, keeps the view and is idempotent', () => { @@ -224,7 +251,10 @@ test('pickGlobe meets the terrain along the pick ray, or the ellipsoid', () => { const place = geo.cartographic.fromCartesian(raised); near(place.height, 2000, 0.5, 'terrain height (m)'); near(math.toDegrees(place.longitude), 0, 1e-6, 'longitude'); - assert.equal(engine.picker.pickGlobe(cartesian2.create(640, -1e7)), undefined); + assert.equal( + engine.picker.pickGlobe(cartesian2.create(640, -1e7)), + undefined, + ); }); test('a user gesture cancels a flight without raising camera.commanded', () => { diff --git a/src/globe/navara/credits.test.mjs b/src/globe/navara/credits.test.mjs index b5cdbea60..251592784 100644 --- a/src/globe/navara/credits.test.mjs +++ b/src/globe/navara/credits.test.mjs @@ -12,7 +12,9 @@ function fakeAttribution() { }, add(items) { for (const item of items) - if (!shown.some((entry) => entry.attributionHtml === item.attributionHtml)) + if ( + !shown.some((entry) => entry.attributionHtml === item.attributionHtml) + ) shown.push(item); }, remove(items) { @@ -31,7 +33,9 @@ test('addStatic shows HTML in the attribution and the remover is idempotent', () const attribution = fakeAttribution(); const { credits } = createNavaraCredits({ attribution }); const remove = credits.addStatic('X', { onScreen: true }); - assert.deepEqual(attribution.shown, [{ attributionHtml: 'X' }]); + assert.deepEqual(attribution.shown, [ + { attributionHtml: 'X' }, + ]); remove(); remove(); assert.deepEqual(attribution.shown, []); diff --git a/src/globe/navara/input.test.mjs b/src/globe/navara/input.test.mjs index 9defd0d88..f6f1789a0 100644 --- a/src/globe/navara/input.test.mjs +++ b/src/globe/navara/input.test.mjs @@ -107,7 +107,10 @@ test('modifiers: a listener fires only for its own key, an unmodified one only w test('on validates its arguments and returns an idempotent remover', () => { const { canvas, input } = setup(); assert.throws(() => input.on('wheel', () => {}), TypeError); - assert.throws(() => input.on('click', () => {}, { modifier: 'meta' }), TypeError); + assert.throws( + () => input.on('click', () => {}, { modifier: 'meta' }), + TypeError, + ); let count = 0; const off = input.on('down', () => count++); off(); diff --git a/src/globe/navara/internals.test.mjs b/src/globe/navara/internals.test.mjs index 0d74885a4..75777b2b1 100644 --- a/src/globe/navara/internals.test.mjs +++ b/src/globe/navara/internals.test.mjs @@ -24,7 +24,12 @@ test('Navara internals are pinned: package.json and internals.js name the same e const PRIVATE_ACCESS = /\.\s*_[A-Za-z]|\[\s*['"`]_[A-Za-z]/; test('the private-member pattern catches dotted and bracketed access', () => { - for (const code of ['view._isIdle', 'view?._scenes', "view['_isIdle']", 'v[ "_x" ]']) + for (const code of [ + 'view._isIdle', + 'view?._scenes', + "view['_isIdle']", + 'v[ "_x" ]', + ]) assert.ok(PRIVATE_ACCESS.test(code), code); for (const code of ['view.isIdle', 'a_b.c', "map['key']"]) assert.ok(!PRIVATE_ACCESS.test(code), code); diff --git a/src/globe/navara/maps.test.mjs b/src/globe/navara/maps.test.mjs index e8c37eaf5..c2765b50e 100644 --- a/src/globe/navara/maps.test.mjs +++ b/src/globe/navara/maps.test.mjs @@ -71,14 +71,19 @@ test('setBaseImagery builds Navara raster layers for OSM and Esri, one at a time 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', ); assert.equal(layer.desc.source, view.sources[0]); - assert.ok(view.shown.some((item) => /OpenStreetMap/.test(JSON.stringify(item)))); + assert.ok( + view.shown.some((item) => /OpenStreetMap/.test(JSON.stringify(item))), + ); await maps.setBaseImagery({ descriptor: { id: 'esri-imagery', kind: 'esri-imagery' }, credit: 'Powered by Esri', }); assert.equal(layersOf(view, 'raster').length, 1); assert.equal(view.sources.length, 1); - assert.match(view.sources[0].desc.url, /World_Imagery\/MapServer\/tile\/\{z\}\/\{y\}\/\{x\}$/); + assert.match( + view.sources[0].desc.url, + /World_Imagery\/MapServer\/tile\/\{z\}\/\{y\}\/\{x\}$/, + ); assert.deepEqual(view.shown, [ { attributionHtml: 'Powered by Esri' }, ]); @@ -100,7 +105,10 @@ test('an imagery source Navara cannot build rejects and the current one stays', await maps.setBaseImagery({ kind: 'osm' }); await assert.rejects(maps.setBaseImagery({ kind: 'ion', style: 2 }), /ion/); await assert.rejects(maps.setBaseImagery({ kind: 'nope' }), TypeError); - assert.equal(view.sources[0].desc.url, 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'); + assert.equal( + view.sources[0].desc.url, + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + ); }); test('setTerrain: keyless Re:Earth mesh, flat ellipsoid, and ion world terrain with a token', async () => { @@ -150,7 +158,10 @@ test('a newer terrain request wins over an older one still resolving', async () }); const world = maps.setTerrain({ kind: 'world', accessToken: 't' }); await maps.setTerrain({ kind: 'keyless' }); - answer({ ok: true, json: async () => ({ url: 'https://x/', accessToken: 'y' }) }); + answer({ + ok: true, + json: async () => ({ url: 'https://x/', accessToken: 'y' }), + }); await world; const [terrain] = layersOf(view, 'terrain'); assert.match(terrain.desc.source.desc.url, /reearth/); @@ -240,7 +251,11 @@ test('current() returns the passed sources: base while the globe shows, tiles wh await maps.setBaseImagery(esri); const [raster] = layersOf(view, 'raster'); assert.match(raster.desc.source.desc.url, /World_Imagery/); - assert.equal(raster.desc.raster?.show, false, 'the new layer shows over tiles'); + assert.equal( + raster.desc.raster?.show, + false, + 'the new layer shows over tiles', + ); assert.ok( !view.shown.some((item) => /esri/i.test(JSON.stringify(item))), 'its credit shows over tiles', @@ -250,7 +265,10 @@ test('current() returns the passed sources: base while the globe shows, tiles wh await maps.setPhotorealTiles(null); assert.deepEqual(maps.current(), { baseImagery: esri, photoreal: null }); assert.notEqual(raster.desc.raster?.show, false, 'base not back'); - assert.ok(view.shown.some((item) => /esri/i.test(JSON.stringify(item))), 'credit not back'); + assert.ok( + view.shown.some((item) => /esri/i.test(JSON.stringify(item))), + 'credit not back', + ); }); test('the same tiles under a new source object count as that source', async () => { @@ -277,4 +295,3 @@ test('releasePhotorealTiles forgets the source and takes its tiles away if shown assert.equal(maps.current().photoreal, null); assert.equal(layersOf(view, '3d-tiles').length, 0); }); - diff --git a/src/globe/navara/surface.test.mjs b/src/globe/navara/surface.test.mjs index 75178a093..c99fcdb34 100644 --- a/src/globe/navara/surface.test.mjs +++ b/src/globe/navara/surface.test.mjs @@ -52,7 +52,12 @@ function tileAt(lon, lat, height, half = 100) { return { tile, mesh }; } -function setup({ tiles = [], terrain = () => undefined, idle = true, retain } = {}) { +function setup({ + tiles = [], + terrain = () => undefined, + idle = true, + retain, +} = {}) { const view = { sampleTerrainHeight: (place) => terrain(place), }; diff --git a/src/orbit.test.mjs b/src/orbit.test.mjs index d09c76a62..1ac2b2ca5 100644 --- a/src/orbit.test.mjs +++ b/src/orbit.test.mjs @@ -21,20 +21,29 @@ test('orbit locks onto the target every frame from the current heading, and stop }); const target = geo.cartesian3.fromDegrees(-97.74, 30.27, 30); const orbit = new OrbitController(engine); - assert.equal(orbit.toggle(target, { radius: 800, pitch: -20, speed: 10 }), true); + assert.equal( + orbit.toggle(target, { radius: 800, pitch: -20, speed: 10 }), + true, + ); assert.ok(getRenderGovernorDiagnostics().holds.includes('camera-orbit')); t.mock.timers.tick(500); engine.fake.frame(); const [first] = engine.fake.callsOf('camera.lookAt'); assert.deepEqual(first.args[0], target); - assert.ok(Math.abs(first.args[1].heading - (0.4 + geo.math.toRadians(5))) < 1e-9); + assert.ok( + Math.abs(first.args[1].heading - (0.4 + geo.math.toRadians(5))) < 1e-9, + ); assert.equal(first.args[1].pitch, geo.math.toRadians(-20)); assert.equal(first.args[1].range, 800); assert.equal(orbit.toggle(), false); assert.equal(engine.fake.callsOf('camera.release').length, 1); assert.ok(!getRenderGovernorDiagnostics().holds.includes('camera-orbit')); engine.fake.frame(); - assert.equal(engine.fake.callsOf('camera.lookAt').length, 1, 'no frames after stop'); + assert.equal( + engine.fake.callsOf('camera.lookAt').length, + 1, + 'no frames after stop', + ); }); test('orbit needs a target', () => { diff --git a/src/sharelinkPose.test.mjs b/src/sharelinkPose.test.mjs index de242fbc8..1a1078ef4 100644 --- a/src/sharelinkPose.test.mjs +++ b/src/sharelinkPose.test.mjs @@ -15,7 +15,10 @@ function linkFor(pose) { const params = new URLSearchParams(manager._buildHashParams().toString()); manager.destroy(); return Object.fromEntries( - ['lat', 'lon', 'alt', 'heading', 'pitch', 'roll'].map((k) => [k, params.get(k)]), + ['lat', 'lon', 'alt', 'heading', 'pitch', 'roll'].map((k) => [ + k, + params.get(k), + ]), ); } @@ -43,7 +46,10 @@ test('a straight-down view writes roll 0; other angles round as before', () => { assert.equal(down.roll, '0'); assert.equal(down.pitch, '-90'); const oblique = linkFor(at(45.4, -29.6, 2)); - assert.deepEqual([oblique.heading, oblique.pitch, oblique.roll], ['45', '-30', '2']); + assert.deepEqual( + [oblique.heading, oblique.pitch, oblique.roll], + ['45', '-30', '2'], + ); assert.equal(linkFor(at(359.7, -30)).heading, '360'); });