const registeredTests = []; globalThis.test = (name, callback) => registeredTests.push({ name, callback }); globalThis.assert = (condition, message = "assertion failed") => { if (!condition) throw new Error(message); }; globalThis.assertEqual = (actual, expected, message = "values differ") => { if (!Object.is(actual, expected)) throw new Error(`${message}: expected ${expected}, received ${actual}`); }; try { await import("/tests/unit/contracts.test.js"); await import("/tests/unit/acoustics.test.js"); await import("/tests/unit/beam-pattern.test.js"); await import("/tests/unit/cfar.test.js"); await import("/tests/unit/activity-monitor.test.js"); await import("/tests/unit/spectral-flux.test.js"); await import("/tests/unit/gcc-phat.test.js"); await import("/tests/unit/music-numerics.test.js"); await import("/tests/unit/localization.test.js"); await import("/tests/unit/realtime-localizer.test.js"); await import("/tests/unit/builder.test.js"); await import("/tests/unit/evaluation.test.js"); await import("/tests/unit/camera.test.js"); await import("/tests/unit/webgpu.test.js"); await import("/tests/unit/split-pane.test.js"); await import("/tests/unit/array-builder.test.js"); await import("/tests/unit/array-builder-canvas.test.js"); await import("/tests/integration/cpu-baseline.test.js"); await import("/tests/integration/webgpu.test.js"); await import("/tests/integration/server.test.js"); await import("/tests/integration/array-builder-ui.test.js"); await import("/tests/integration/split-layout-ui.test.js"); await import("/tests/integration/builder-ui.test.js"); await import("/tests/integration/camera-ui.test.js"); await import("/tests/integration/workflow-ui.test.js"); } catch (error) { registeredTests.push({ name: "테스트 모듈을 불러온다", callback: () => { throw error; }, }); } if (registeredTests.length === 0) { registeredTests.push({ name: "하나 이상의 테스트가 등록된다", callback: () => { throw new Error("등록된 테스트가 없습니다."); }, }); } const resultList = document.querySelector("#test-results"); const summary = document.querySelector("#test-summary"); let passed = 0; for (const registeredTest of registeredTests) { const item = document.createElement("li"); item.className = "test-result"; try { await registeredTest.callback(); passed += 1; item.classList.add("test-result--pass"); item.textContent = `✓ ${registeredTest.name}`; } catch (error) { item.classList.add("test-result--fail"); const title = document.createElement("strong"); title.textContent = `✕ ${registeredTest.name}`; const details = document.createElement("pre"); details.textContent = error instanceof Error ? error.stack : String(error); item.append(title, details); } resultList.append(item); } const failed = registeredTests.length - passed; summary.textContent = `${registeredTests.length}개 중 ${passed}개 통과, ${failed}개 실패`; summary.dataset.failed = String(failed); document.documentElement.dataset.testStatus = failed === 0 ? "pass" : "fail"; document.title = failed === 0 ? "PASS · micarrsim tests" : "FAIL · micarrsim tests";