feat: add Vitest unit testing infrastructure with initial test suite.

This commit is contained in:
Xiaohan-Tian
2025-09-03 22:15:05 -07:00
parent be39392aee
commit aa2b19966b
11 changed files with 2673 additions and 13 deletions
+115
View File
@@ -0,0 +1,115 @@
import { vi } from 'vitest'
/**
* Mock implementation of Tone.js for testing
* This provides consistent, deterministic behavior for audio-related tests
*/
// Mock Sampler class
export const MockSampler = vi.fn().mockImplementation(() => ({
triggerAttackRelease: vi.fn(),
triggerAttack: vi.fn(),
triggerRelease: vi.fn(),
dispose: vi.fn(),
loaded: true,
volume: {
value: -12
},
connect: vi.fn(),
disconnect: vi.fn(),
toDestination: vi.fn()
}))
// Mock Transport object
export const MockTransport = {
start: vi.fn(),
stop: vi.fn(),
pause: vi.fn(),
position: '0:0:0',
bpm: {
value: 120,
rampTo: vi.fn()
},
timeSignature: [4, 4],
state: 'stopped',
scheduleOnce: vi.fn(),
scheduleRepeat: vi.fn(),
cancel: vi.fn(),
clear: vi.fn()
}
// Mock Destination
export const MockDestination = {
volume: {
value: -12
},
mute: false,
connect: vi.fn(),
disconnect: vi.fn()
}
// Mock ToneAudioBuffer
export const MockToneAudioBuffer = vi.fn().mockImplementation(() => ({
loaded: true,
dispose: vi.fn(),
get: vi.fn(),
set: vi.fn(),
load: vi.fn().mockResolvedValue(undefined)
}))
// Mock Gain node
export const MockGain = vi.fn().mockImplementation(() => ({
gain: {
value: 1,
setValueAtTime: vi.fn(),
linearRampToValueAtTime: vi.fn(),
exponentialRampToValueAtTime: vi.fn()
},
connect: vi.fn(),
disconnect: vi.fn(),
dispose: vi.fn()
}))
// Mock Meter
export const MockMeter = vi.fn().mockImplementation(() => ({
getValue: vi.fn().mockReturnValue(-Infinity),
connect: vi.fn(),
disconnect: vi.fn(),
dispose: vi.fn()
}))
// Complete Tone.js mock
export const ToneMock = {
Sampler: MockSampler,
Transport: MockTransport,
Destination: MockDestination,
ToneAudioBuffer: MockToneAudioBuffer,
Gain: MockGain,
Meter: MockMeter,
// Context management
start: vi.fn().mockResolvedValue(undefined),
getContext: vi.fn().mockReturnValue({
state: 'running',
resume: vi.fn().mockResolvedValue(undefined),
suspend: vi.fn().mockResolvedValue(undefined),
close: vi.fn().mockResolvedValue(undefined)
}),
// Time utilities
Time: vi.fn().mockImplementation((time) => ({
toSeconds: vi.fn().mockReturnValue(parseFloat(time) || 0),
valueOf: vi.fn().mockReturnValue(parseFloat(time) || 0)
})),
// Frequency utilities
Frequency: vi.fn().mockImplementation((freq) => ({
toFrequency: vi.fn().mockReturnValue(parseFloat(freq) || 440),
valueOf: vi.fn().mockReturnValue(parseFloat(freq) || 440)
}))
}
// Setup the global mock
export const setupToneMocks = () => {
vi.doMock('tone', () => ToneMock)
}