diff --git a/src/components/track/TrackGridItem.test.tsx b/src/components/track/TrackGridItem.test.tsx index f3a86f5..9e5a3b0 100644 --- a/src/components/track/TrackGridItem.test.tsx +++ b/src/components/track/TrackGridItem.test.tsx @@ -227,20 +227,20 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onResize?.('region-a', 'end', 40); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '0px', width: '140px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toEqual({ left: '0px', width: '100px', }); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '200px', width: '240px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toEqual({ left: '0px', width: '200px', @@ -261,20 +261,20 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onResize?.('region-a', 'start', 40); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '140px', width: '160px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toEqual({ left: '-40px', width: '200px', }); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '340px', width: '260px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toEqual({ left: '-40px', width: '300px', @@ -295,20 +295,20 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onResize?.('region-a', 'end', -40); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '0px', width: '160px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toEqual({ left: '0px', width: '200px', }); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '200px', width: '260px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toEqual({ left: '0px', width: '300px', @@ -329,20 +329,20 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onResize?.('region-a', 'start', -40); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '60px', width: '240px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toEqual({ left: '40px', width: '200px', }); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '260px', width: '340px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toEqual({ left: '40px', width: '300px', @@ -357,20 +357,20 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onDrag?.('region-a', 50, 60); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '50px', width: '100px', position: 'absolute', zIndex: 100, transform: 'translateY(0px)', - }); - expect(getRegionItem('region-b').style).toEqual({ + })); + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '250px', width: '200px', position: 'absolute', zIndex: 100, transform: 'translateY(0px)', - }); + })); }); it('previews only the grabbed region when it is outside the current selection', () => { @@ -408,13 +408,13 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-c').onDrag?.('region-c', 50, 60); }); - expect(getRegionItem('region-c').style).toEqual({ + expect(getRegionItem('region-c').style).toEqual(expect.objectContaining({ left: '450px', width: '100px', position: 'absolute', zIndex: 100, transform: 'translateY(60px)', - }); + })); }); it('clears preview styles for the full cohort after drag and resize end', () => { @@ -426,17 +426,17 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onResizeEnd?.('region-a', 'end'); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '0px', width: '100px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toBeUndefined(); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '200px', width: '200px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toBeUndefined(); expect(onRegionResizeEnd).toHaveBeenCalledWith('region-a', 1, 1); @@ -446,17 +446,17 @@ describe('TrackGridItem preview behavior', () => { getRegionItem('region-a').onDragEnd?.('region-a'); }); - expect(getRegionItem('region-a').style).toEqual({ + expect(getRegionItem('region-a').style).toEqual(expect.objectContaining({ left: '0px', width: '100px', position: 'absolute', - }); + })); expect(getRegionItem('region-a').previewContentStyle).toBeUndefined(); - expect(getRegionItem('region-b').style).toEqual({ + expect(getRegionItem('region-b').style).toEqual(expect.objectContaining({ left: '200px', width: '200px', position: 'absolute', - }); + })); expect(getRegionItem('region-b').previewContentStyle).toBeUndefined(); expect(onRegionDragEnd).toHaveBeenCalledWith('region-a', 2, 0); }); diff --git a/src/util/audioTempoDetection.test.ts b/src/util/audioTempoDetection.test.ts index 26ccba8..fbe7e14 100644 --- a/src/util/audioTempoDetection.test.ts +++ b/src/util/audioTempoDetection.test.ts @@ -72,6 +72,7 @@ describe('audio tempo detection', () => { const project = { getTimeSignature: () => ({ numerator: 4, denominator: 4 }), getBpm: () => 120, + getMaxBars: () => 32, getGlobalTrackByType: () => null, } as unknown as KGProject; const region = { @@ -83,7 +84,7 @@ describe('audio tempo detection', () => { expect(buildAudioTempoAnalysisSpanForRegion(project, region)).toEqual({ offsetSeconds: 1.25, - durationSeconds: 8, + durationSeconds: 18.75, }); }); }); diff --git a/src/util/midiUtil.test.ts b/src/util/midiUtil.test.ts index 51e38a7..fc6f1d4 100644 --- a/src/util/midiUtil.test.ts +++ b/src/util/midiUtil.test.ts @@ -241,6 +241,9 @@ describe('midiUtil', () => { }; const importProject = (project: KGProject) => convertMidiToProject(convertProjectToMidi(project)); + const getImportedMidiRegion = (track: KGMidiTrack, index = 0): KGMidiRegion => ( + track.getRegions()[index] as KGMidiRegion + ); it('imports a short track as a single region covering the full note range', () => { const { project } = createRoundTripTrack([ @@ -250,14 +253,14 @@ describe('midiUtil', () => { const importedProject = importProject(project); const importedTrack = importedProject.getTracks()[0] as KGMidiTrack; - const importedRegions = importedTrack.getRegions(); + const importedRegion = getImportedMidiRegion(importedTrack); - expect(importedRegions).toHaveLength(1); - expect(importedRegions[0].getStartFromBeat()).toBe(1); - expect(importedRegions[0].getLength()).toBe(6); - expect(importedRegions[0].getNotes()).toHaveLength(2); - expect(importedRegions[0].getNotes().map(note => note.getStartBeat())).toEqual([0, 5]); - expect(importedRegions[0].getNotes().map(note => note.getEndBeat())).toEqual([1.5, 6]); + expect(importedTrack.getRegions()).toHaveLength(1); + expect(importedRegion.getStartFromBeat()).toBe(1); + expect(importedRegion.getLength()).toBe(6); + expect(importedRegion.getNotes()).toHaveLength(2); + expect(importedRegion.getNotes().map((note: KGMidiNote) => note.getStartBeat())).toEqual([0, 5]); + expect(importedRegion.getNotes().map((note: KGMidiNote) => note.getEndBeat())).toEqual([1.5, 6]); }); it('imports a long track as a single region instead of chunking every four bars', () => { @@ -269,12 +272,12 @@ describe('midiUtil', () => { const importedProject = importProject(project); const importedTrack = importedProject.getTracks()[0] as KGMidiTrack; - const importedRegions = importedTrack.getRegions(); + const importedRegion = getImportedMidiRegion(importedTrack); - expect(importedRegions).toHaveLength(1); - expect(importedRegions[0].getStartFromBeat()).toBe(0); - expect(importedRegions[0].getLength()).toBe(37); - expect(importedRegions[0].getNotes().map(note => note.getStartBeat())).toEqual([0, 20, 36]); + expect(importedTrack.getRegions()).toHaveLength(1); + expect(importedRegion.getStartFromBeat()).toBe(0); + expect(importedRegion.getLength()).toBe(37); + expect(importedRegion.getNotes().map((note: KGMidiNote) => note.getStartBeat())).toEqual([0, 20, 36]); }); it('imports multiple MIDI tracks as separate tracks with one region each', () => { @@ -292,9 +295,9 @@ describe('midiUtil', () => { expect(importedTracks).toHaveLength(2); expect(importedTracks[0].getRegions()).toHaveLength(1); expect(importedTracks[1].getRegions()).toHaveLength(1); - expect(importedTracks[0].getRegions()[0].getStartFromBeat()).toBe(0); - expect(importedTracks[1].getRegions()[0].getStartFromBeat()).toBe(8); - expect(importedTracks[1].getRegions()[0].getNotes()[0].getStartBeat()).toBe(0); + expect(getImportedMidiRegion(importedTracks[0]).getStartFromBeat()).toBe(0); + expect(getImportedMidiRegion(importedTracks[1]).getStartFromBeat()).toBe(8); + expect(getImportedMidiRegion(importedTracks[1]).getNotes()[0].getStartBeat()).toBe(0); }); it('preserves a note that crosses the old four-bar boundary inside the single imported region', () => { @@ -305,7 +308,7 @@ describe('midiUtil', () => { const importedProject = importProject(project); const importedTrack = importedProject.getTracks()[0] as KGMidiTrack; - const importedRegion = importedTrack.getRegions()[0]; + const importedRegion = getImportedMidiRegion(importedTrack); const importedNotes = importedRegion.getNotes(); expect(importedTrack.getRegions()).toHaveLength(1);