feat: add Vitest unit testing infrastructure with initial test suite.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user