Skip to content
Draft
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
616ce35
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of로 교체하여 O(N) 오버헤드 최적화 및 테…
seonghobae Sep 23, 2026
95cb94e
preserve(ui): return GrooveMap source ownership to canonical lane
seonghobae Sep 23, 2026
514c884
preserve(perf): remove unsupported duplicate speedup claim
seonghobae Sep 23, 2026
0511420
test(ui): prove GrooveMap timeline geometry uses note maximum
seonghobae Sep 23, 2026
e337875
preserve(perf): restore Bolt journal byte-equivalent baseline
seonghobae Sep 23, 2026
e471d90
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of로 교체하여 O(N) 오버헤드 최적화 및 테…
seonghobae Sep 23, 2026
65ccba8
repair(perf): preserve canonical GrooveMap owner after generated regr…
seonghobae Sep 23, 2026
fadfdf4
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of로 교체하여 O(N) 오버헤드 최적화 및 테…
seonghobae Sep 23, 2026
deb0b1c
repair(perf): restore GrooveMap preservation after repeated generated…
seonghobae Sep 23, 2026
e9d1587
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of로 교체하여 O(N) 오버헤드 최적화 및 테…
seonghobae Sep 23, 2026
f44cc9a
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of 루프로 최적화 및 테스트 케이스 보강
seonghobae Sep 24, 2026
16b121b
repair(perf): restore #1259 preservation boundary
seonghobae Sep 24, 2026
52e843e
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of 루프로 최적화 및 테스트 케이스 보강
seonghobae Sep 24, 2026
3ebdac0
preserve(perf): collapse GrooveMap duplicate to provenance-only
seonghobae Sep 24, 2026
b32a14f
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of 루프로 최적화 및 테스트 케이스 보강
seonghobae Sep 24, 2026
ed0414a
preserve(perf): remove duplicate GrooveMap geometry test after canoni…
seonghobae Sep 24, 2026
2910c82
⚡ Bolt: [성능 개선] GrooveMap 배열 reduce를 for...of 루프로 최적화 및 테스트 케이스 보강
seonghobae Sep 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions apps/desktop/src/features/workspace/GrooveMap.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { describe, it, expect } from "vitest";
import { render, screen } from "@testing-library/react";
import { GrooveMap } from "./GrooveMap";

describe("GrooveMap", () => {
it("renders the loading state", () => {
render(<GrooveMap isLoading={true} />);
expect(screen.getByText(/Checking the bass line/)).toBeInTheDocument();
});

it("renders the empty state when no notes are provided", () => {
render(<GrooveMap />);
expect(screen.getByText(/No bass line transcription yet/)).toBeInTheDocument();
});

it("renders the empty state when notes array is empty", () => {
render(<GrooveMap notes={[]} />);
expect(screen.getByText(/No bass line transcription yet/)).toBeInTheDocument();
});

it("renders the notes correctly and verifies width scaling for offsets > 10", () => {
// We intentionally include a note with an offset > 10s (here 20.00s)
// to verify that the timeline max scaling adapts correctly, rather than capping at 10.
const notes = [
{ onset: 0, offset: 1.5, pitch: "E1" },
{ onset: 2, offset: 2.5, pitch: "A1" },
{ onset: 10, offset: 20, pitch: "E1" }, // max offset is 20
];

render(<GrooveMap notes={notes} />);

// Check main accessible region exists
expect(screen.getByRole("region", { name: "Bass transcription groove map" })).toBeInTheDocument();

// Check note blocks are rendered (title attributes match note descriptions)
expect(screen.getByTitle("E1 (0.00s - 1.50s)")).toBeInTheDocument();
expect(screen.getByTitle("A1 (2.00s - 2.50s)")).toBeInTheDocument();

// Verify the large offset note is rendered with the expected left and width attributes.
// The maxTime should be 20. So onset 10 = 50% left. (20-10) = 10 duration = 50% width.
const largeNote = screen.getByTitle("E1 (10.00s - 20.00s)");
expect(largeNote).toHaveStyle({
left: "50%",
width: "50%"
});

// Check pitches (A1 and E1) are rendered as horizontal lanes
expect(screen.getByText("A1")).toBeInTheDocument();
expect(screen.getByText("E1")).toBeInTheDocument();
});
});
Loading