Files
KGStudio/src/test/utils/mock-data.ts
T

200 lines
4.6 KiB
TypeScript

import { KGMidiNote } from '../../core/midi/KGMidiNote';
import { KGMidiControllerEvent } from '../../core/midi/KGMidiControllerEvent';
import { KGMidiPitchBend } from '../../core/midi/KGMidiPitchBend';
import { KGProject } from '../../core/KGProject';
import { KGMidiTrack } from '../../core/track/KGMidiTrack';
import { KGMidiRegion } from '../../core/region/KGMidiRegion';
/**
* Test data factories for creating mock objects
* These help create consistent test data across different test files
*/
export const createMockMidiNote = (overrides: Partial<{
pitch: number
velocity: number
startBeat: number
endBeat: number
id: string
}> = {}): KGMidiNote => {
const defaults = {
id: 'test-note-1',
startBeat: 0,
endBeat: 1,
pitch: 60, // Middle C
velocity: 80,
...overrides
};
return new KGMidiNote(
defaults.id,
defaults.startBeat,
defaults.endBeat,
defaults.pitch,
defaults.velocity
);
};
export const createMockMidiRegion = (overrides: Partial<{
id: string
trackId: string
trackIndex: number
name: string
startFromBeat: number
length: number
notes: KGMidiNote[]
pitchBends: KGMidiPitchBend[]
controllerEventsByType: KGMidiControllerEvent[][]
}> = {}): KGMidiRegion => {
const defaults = {
id: 'test-region-1',
trackId: 'test-track-1',
trackIndex: 0,
name: 'Test Region',
startFromBeat: 0,
length: 4,
...overrides
};
const region = new KGMidiRegion(
defaults.id,
defaults.trackId,
defaults.trackIndex,
defaults.name,
defaults.startFromBeat,
defaults.length
);
// Add notes if provided
if (overrides.notes) {
overrides.notes.forEach(note => region.addNote(note));
}
if (overrides.pitchBends) {
overrides.pitchBends.forEach(pitchBend => region.addPitchBend(pitchBend));
}
if (overrides.controllerEventsByType) {
region.setControllerEventsByType(overrides.controllerEventsByType);
}
return region;
};
export const createMockMidiPitchBend = (overrides: Partial<{
id: string
beat: number
value: number
}> = {}): KGMidiPitchBend => {
const defaults = {
id: 'test-bend-1',
beat: 0,
value: 8192,
...overrides,
};
return new KGMidiPitchBend(defaults.id, defaults.beat, defaults.value);
};
export const createMockMidiControllerEvent = (overrides: Partial<{
id: string
beat: number
value: number
}> = {}): KGMidiControllerEvent => {
const defaults = {
id: 'test-controller-1',
beat: 0,
value: 127,
...overrides,
};
return new KGMidiControllerEvent(defaults.id, defaults.beat, defaults.value);
};
export const createMockMidiTrack = (overrides: Partial<{
name: string
id: number
instrument: string
volume: number
regions: KGMidiRegion[]
}> = {}): KGMidiTrack => {
const defaults = {
name: 'Test Track',
id: 0,
instrument: 'acoustic_grand_piano' as const,
volume: 0.8,
...overrides
};
const track = new KGMidiTrack(
defaults.name,
defaults.id,
defaults.instrument as keyof typeof import('../../constants/generalMidiConstants').FLUIDR3_INSTRUMENT_MAP,
defaults.volume
);
// Add regions if provided
if (overrides.regions) {
track.setRegions(overrides.regions);
}
return track;
};
export const createMockProject = (overrides: Partial<{
name: string
bpm: number
timeSignature: { numerator: number; denominator: number }
tracks: KGMidiTrack[]
}> = {}): KGProject => {
const defaults = {
name: 'Test Project',
bpm: 120,
timeSignature: { numerator: 4, denominator: 4 },
tracks: [],
...overrides
};
const project = new KGProject(
defaults.name,
32, // maxBars
0, // currentBars
defaults.bpm,
defaults.timeSignature,
'C major', // keySignature
'ionian', // selectedMode
false, // isLooping
[0, 0], // loopingRange
1, // barWidthMultiplier
defaults.tracks, // tracks
KGProject.CURRENT_PROJECT_STRUCTURE_VERSION // projectStructureVersion
);
return project;
};
// Common test scenarios
export const createBasicProjectWithTrack = (): { project: KGProject; track: KGMidiTrack; region: KGMidiRegion } => {
const notes = [
createMockMidiNote({ pitch: 60, startBeat: 0, endBeat: 1 }),
createMockMidiNote({ pitch: 64, startBeat: 1, endBeat: 2 }),
];
const region = createMockMidiRegion({
id: 'region-1',
trackId: 'track-1',
notes
});
const track = createMockMidiTrack({
id: 1,
name: 'Track 1',
regions: [region]
});
const project = createMockProject({
name: 'Basic Test Project',
tracks: [track]
});
return { project, track, region };
};