Files
2026-10-14 10:01:46 +00:00

273 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/audio.test.ts (11 tests | 9 failed) 139ms
❯ 오디오 재생 수명과 믹서 (8)
× intro와 목표 실제 fetch URL에 같은 명시적 cache-busting 버전을 붙인다 21ms
× intro 404 후 intro·목표를 동일한 versioned URL로 다시 요청한다 19ms
× target 404 후 intro·목표를 동일한 versioned URL로 다시 요청한다 20ms
× 생성 시 무음이며 gesture의 play에서만 장치를 연다 13ms
× 동시 시작을 거부하고 정지하면 모든 노드와 대기 Promise를 취소한다 14ms
× HTTP·디코드·장치 실패를 전달하고 다음 시도는 다시 로드한다 3ms
× 전체 음량은 두 신호의 비율을 보존하며 0부터 1 범위로 제한한다 9ms
× 선택한 녹음을 디코드·루프하고 목표 종료에서 모든 소스와 fetch를 정리한다 11ms
× 배경 404·디코드 실패는 한국어 복구 메시지이고 재시도로 성공한다 10ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 9 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > intro와 목표 실제 fetch URL에 같은 명시적 cache-busting 버전을 붙인다
TypeError: Cannot read properties of undefined (reading 'onended')
❯ tests/audio.test.ts:95:21
93| const done = f.engine.play(question, true, vi.fn());
94| await flush();
95| f.sources.at(-1)!.onended?.();
| ^
96| await done;
97| expect(f.fetcher.mock.calls.map(([url]) => url)).toEqual([
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/9]⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > intro 404 후 intro·목표를 동일한 versioned URL로 다시 요청한다
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > target 404 후 intro·목표를 동일한 versioned URL로 다시 요청한다
TypeError: Cannot read properties of undefined (reading 'onended')
❯ tests/audio.test.ts:129:23
127| const done = f.engine.play(question, true, vi.fn());
128| await flush();
129| f.sources.at(-1)!.onended?.();
| ^
130| await done;
131| expect(f.fetcher.mock.calls.map(([url]) => url)).toEqual([
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/9]⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > 생성 시 무음이며 gesture의 play에서만 장치를 연다
AssertionError: expected "vi.fn()" to be called once, but got 0 times
❯ tests/audio.test.ts:150:21
148| expect(f.context.resume).toHaveBeenCalledOnce();
149| await flush();
150| expect(started).toHaveBeenCalledOnce();
| ^
151| expect(f.sources).toHaveLength(3);
152| expect(
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/9]⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > 동시 시작을 거부하고 정지하면 모든 노드와 대기 Promise를 취소한다
AssertionError: expected TypeError: (0 , __vite_ssr_import_1__.syn… to match object { name: 'AbortError' }
- Expected
+ Received
- {
- "name": "AbortError",
+ TypeError {
+ "message": "(0 , __vite_ssr_import_1__.synthesizeBackground) is not a function",
}
❯ tests/audio.test.ts:182:35
180| const f = fixture();
181| const done = f.engine.play(question, false, vi.fn());
182| const cancelled = expect(done).rejects.toMatchObject({
| ^
183| name: "AbortError",
184| });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/9]⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > HTTP·디코드·장치 실패를 전달하고 다음 시도는 다시 로드한다
AssertionError: expected [Function] to throw error including '해석' but got 'decode'
Expected: "해석"
Received: "decode"
❯ tests/audio.test.ts:226:58
224| );
225| f.context.decodeAudioData.mockRejectedValueOnce(new Error("decode"…
226| await expect(f.engine.play(question, false, vi.fn())).rejects.toTh…
| ^
227| "해석",
228| );
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/9]⎯
FAIL tests/audio.test.ts > 오디오 재생 수명과 믹서 > 전체 음량은 두 신호의 비율을 보존하며 0부터 1 범위로 제한한다
TypeError: Cannot read properties of undefined (reading 'onended')
❯ tests/audio.test.ts:248:21
246| f.engine.setVolume(-1);
247| expect(f.gains[0]!.gain.setTargetAtTime).toHaveBeenCalledWith(0, 2…
248| f.sources.at(-1)!.onended?.();
| ^
249| await done;
250| });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/9]⎯
FAIL tests/audio.test.ts > 선택한 녹음을 디코드·루프하고 목표 종료에서 모든 소스와 fetch를 정리한다
AssertionError: expected "vi.fn()" to be called with arguments: [ Array(2) ]
Received:
1st vi.fn() call:
[
- "/ambience/street.wav?v=0.1.1",
- ObjectContaining {
- "signal": Any<AbortSignal>,
+ "/audio/correction-market.wav?v=0.1.1",
+ {
+ "signal": AbortSignal {
+ Symbol(kEvents): undefined,
+ Symbol(events.maxEventTargetListeners): 0,
+ Symbol(events.maxEventTargetListenersWarned): false,
+ Symbol(kHandlers): undefined,
+ Symbol(kAborted): true,
+ Symbol(kReason): AbortError {
+ "message": "This operation was aborted",
+ },
+ Symbol(kComposite): false,
+ },
},
]
Number of calls: 1
❯ tests/audio.test.ts:258:21
256| const done = f.engine.play(question, false, vi.fn());
257| await flush();
258| expect(f.fetcher).toHaveBeenCalledWith(question.environment.audioUrl…
| ^
259| expect(f.context.decodeAudioData).toHaveBeenCalledTimes(2);
260| expect(f.sources[0]!.loop).toBe(true);
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/9]⎯
FAIL tests/audio.test.ts > 배경 404·디코드 실패는 한국어 복구 메시지이고 재시도로 성공한다
AssertionError: expected [Function] to throw error matching /배경.*다시/ but got '(0 , __vite_ssr_import_1__.synthesize…'
- Expected:
/배경.*다시/
+ Received:
"(0 , __vite_ssr_import_1__.synthesizeBackground) is not a function"
❯ tests/audio.test.ts:272:56
270| f.fetcher.mockImplementationOnce(async () => ({ ok: true, arrayBuffe…
271| f.fetcher.mockResolvedValueOnce({ ok: false } as Response);
272| await expect(f.engine.play(question, false, vi.fn())).rejects.toThro…
| ^
273| f.context.decodeAudioData.mockRejectedValueOnce(new Error("EncodingE…
274| await expect(f.engine.play(question, false, vi.fn())).rejects.toThro…
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/9]⎯
⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯
Vitest caught 6 unhandled errors during the test run.
This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
TypeError: synthesizeBackground is not a function
❯ src/audio/engine.ts:131:15
129| background.copyToChannel(
130| normalizeRms(
131| synthesizeBackground(
| ^
132| question.environment,
133| context.sampleRate,
❯ process.processTicksAndRejections node:internal/process/task_queues:104:5
This error originated in "tests/audio.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The last test to run before this error was "로드 시간초과는 fetch를 취소하고 늦은 디코드가 소스를 만들지 않는다". This means either:
- the error was thrown while Vitest was running this test, or
- the error was thrown after the test completed, and this was the most recent test at that point.
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Test Files 1 failed (1)
Tests 9 failed | 2 passed (11)
Errors 6 errors
Start at 08:00:38
Duration 979ms (environment 65%, tests 16%, setup 11%, transform 6%, import 1%, worker 1%)