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 here = path.dirname(fileURLToPath(import.meta.url)); const rendererRoot = path.resolve(here, '..'); void test('video scenes share map overlays / effects with image scenes', () => { const control = fs.readFileSync(path.join(rendererRoot, 'control/ControlApp.tsx'), 'utf8'); const presentation = fs.readFileSync(path.join(rendererRoot, 'shared/PresentationView.tsx'), 'utf8'); const sceneEditor = fs.readFileSync(path.join(rendererRoot, 'sceneEditor/SceneEditorApp.tsx'), 'utf8'); const editor = fs.readFileSync(path.join(rendererRoot, 'editor/EditorApp.tsx'), 'utf8'); const main = fs.readFileSync(path.join(rendererRoot, '../main/index.ts'), 'utf8'); assert.equal(control.includes('isVideoPreviewScene'), false); assert.ok(fs.readFileSync(path.join(rendererRoot, 'control/ControlScenePreview.tsx'), 'utf8').includes('ContainedVideo')); assert.ok(presentation.includes('ContainedVideo')); assert.ok(presentation.includes("previewAssetType === 'video'")); assert.ok(presentation.includes('SceneTrapsOverlay')); assert.ok(presentation.includes('PixiEffectsOverlay')); assert.ok(presentation.includes('SceneDarknessOverlay')); assert.ok(sceneEditor.includes('ContainedVideo')); assert.ok(sceneEditor.includes('hasMapMedia')); assert.ok(sceneEditor.includes('Нужно изображение или видео сцены')); assert.ok(editor.includes("previewAssetType === 'image' || previewAssetType === 'video'")); assert.ok(editor.includes('windows.openSceneEditor')); assert.ok(editor.includes('ContainedVideo')); assert.ok(editor.includes('onRotatePreview')); assert.match( editor, /previewAssetId && \(previewAssetType === 'image' \|\| previewAssetType === 'video'\) \? \([\s\S]*?onRotatePreview/, ); assert.ok(fs.readFileSync(path.join(rendererRoot, 'shared/ContainedVideo.tsx'), 'utf8').includes('rotationDeg')); assert.ok( fs .readFileSync(path.join(rendererRoot, 'control/ControlScenePreview.tsx'), 'utf8') .includes('rotationDeg={rot}'), ); assert.ok(presentation.includes('rotationDeg={rot}')); assert.ok(sceneEditor.includes('rotationDeg={rot}')); assert.ok(main.includes("scene?.previewAssetType === 'video'")); assert.ok(main.includes('syncSceneDarknessForProject')); assert.match( main, /darkenScene[\s\S]{0,120}previewAssetType === 'image'[\s\S]{0,80}previewAssetType === 'video'/, ); }); void test('control traps: GM-hidden markers stay relatively bright', () => { const css = fs.readFileSync( path.join(rendererRoot, 'shared/traps/SceneTrapsOverlay.module.css'), 'utf8', ); assert.ok(css.includes('.trapGmHidden')); assert.doesNotMatch(css, /\.trapGmHidden\s*\{[^}]*opacity:\s*0\.[0-6]/); });