import { vi } from 'vitest'; import { resetElementTemplateHydrationListener } from '../../../../../src/element-template/background/hydration-listener.js'; import { BackgroundElementTemplateInstance } from '../../../../../src/element-template/background/instance.js'; import { backgroundElementTemplateInstanceManager } from '../../../../../src/element-template/background/manager.js'; import { root } from '../../../../../src/element-template/index.js'; import { resetElementTemplatePatchListener } from '../../../../../src/element-template/native/patch-listener.js'; import { resetElementTemplateRefInitValueListener } from '../../../../../src/element-template/main-thread-ref-init-value.js'; import { __root, setRoot } from '../../../../../src/element-template/runtime/page/root-instance.js'; import { serializeBackgroundTree } from '../../../test-utils/debug/serializer.js'; type CaseRunner = () => unknown; const cases: Record = {}; function defineCase(name: string, runner: CaseRunner): void { cases[name] = runner; } function setup(): void { vi.stubGlobal('__BACKGROUND__', true); backgroundElementTemplateInstanceManager.clear(); backgroundElementTemplateInstanceManager.nextId = 0; setRoot(new BackgroundElementTemplateInstance('root')); } function teardown(): void { resetElementTemplatePatchListener(); resetElementTemplateRefInitValueListener(); resetElementTemplateHydrationListener(); vi.unstubAllGlobals(); (globalThis as { __LYNX_REPORT_ERROR_CALLS?: Error[] }).__LYNX_REPORT_ERROR_CALLS = []; } export function runCaseByName(name: string): unknown { const runner = cases[name]; if (!runner) { throw new Error(`Unknown background-render case: ${name}`); } setup(); try { return runner(); } finally { teardown(); } } defineCase('constructs-shadow-tree', () => { function App() { return ( Hello Background ); } root.render(); return { isRootInstance: __root instanceof BackgroundElementTemplateInstance, tree: serializeBackgroundTree(__root), }; }); defineCase('supports-slot-component-materiality', () => { function Sub(props: any) { return {props.children}; } function App() { return ( Slot Content 1 Slot Content 2 ); } root.render(); return { tree: serializeBackgroundTree(__root), }; });