import { readShellSource, shellMethod, } from './testSupport/readShellSource.mjs'; import { renderApplicationHtml } from './testSupport/applicationHtml.mjs'; import { readLayerSource } from './testSupport/readLayerSource.mjs'; import { PanelLayoutController } from './ui/panelLayoutController.js'; import { readShellElements } from './ui/shellElements.js'; import { readStylesheet } from './testSupport/readStylesheet.mjs'; import { SceneControls } from './ui/sceneControls.js'; import { isRenderedOnScreen } from './ui/cockpitPresentation.js'; import { onKeyDown as cockpitKeyDown } from './ui/cockpitInput.js'; import { enter as cockpitEnter, exit as cockpitExit, readAircraftInfo, _adoptTrackedEntity, } from './ui/cockpitTrackingController.js'; import { cycleVisionMode } from './ui/cockpitInstruments.js'; import { createVisionState } from './ui/cockpitInstrumentState.js'; import { COCKPIT_VISION_MODES } from './cockpitVisionPolicy.js'; import { updateContext as cockpitContext } from './ui/cockpitContext.js'; import { syncSignalLayout, setContextCollapsed, setSignalCollapsed, } from './ui/cockpitLayout.js'; import { createBriefState } from './ui/cockpitBriefPages.js'; import { publishBriefView, setBriefAutoRotate, } from './ui/cockpitBriefing.js'; import { CockpitDisplayPortal } from './ui/cockpitDisplayPortal.js'; import { _handleContextLayerChange } from './ui/contextLayerChanges.js'; import { clearSelectedLayers } from './ui/contextActions.js'; import { _selectContextMode } from './ui/contextTransactions.js'; import { _restoreContextSession } from './ui/contextSession.js'; import { readFileSync as readRadioSource } from 'node:fs'; const radioBindings = readRadioSource( new URL('./ui/radioBindings.js', import.meta.url), 'utf8', ); const radioPresentation = readRadioSource( new URL('./ui/radioPresentation.js', import.meta.url), 'utf8', ); import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import test from 'node:test'; import { fileURLToPath } from 'node:url'; const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const html = await renderApplicationHtml( fs.readFileSync(path.join(ROOT, 'index.html'), 'utf8'), ); const ui = readShellSource(); const css = readStylesheet(path.join(ROOT, 'style.css')); const sceneDirector = fs.readFileSync( path.join(ROOT, 'src', 'scenes', 'director.js'), 'utf8', ); const manager = fs.readFileSync( path.join(ROOT, 'src', 'data', 'lifecycle.js'), 'utf8', ); const contextLayer = readLayerSource( path.join(ROOT, 'src', 'data', 'militaryAwareness.js'), 'utf8', ); const voiceActions = fs.readFileSync( path.join(ROOT, 'src', 'voice', 'gevActions.js'), 'utf8', ); test('Cockpit has one reset action beside its bottom exit path', () => { assert.doesNotMatch(html, /id="cockpit-quick-entry"/); assert.doesNotMatch(html, /id="cockpit-exit"/); assert.match( html, /id="map-view-switch"[^>]*aria-label="Exit cockpit view"[^>]*aria-keyshortcuts="Escape C"[\s\S]*?close_fullscreen[\s\S]*?EXIT COCKPIT/, ); const topCenterActions = html.match( /