File size: 2,363 Bytes
44a2550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * Test setup and configuration for frontend tests.
 */
import { afterEach, vi } from 'vitest';
import { cleanup } from '@testing-library/react';
import '@testing-library/jest-dom';

// Cleanup after each test
afterEach(() => {
  cleanup();
});

// Mock VexFlow since it requires DOM and Canvas
vi.mock('vexflow', () => {
  // Minimal mocks for named exports used by NotationCanvas
  const Renderer = vi.fn(() => ({
    resize: vi.fn(),
    getContext: vi.fn(() => ({
      clear: vi.fn(),
    })),
  }));

  const Stave = vi.fn(() => ({
    addClef: vi.fn().mockReturnThis(),
    addTimeSignature: vi.fn().mockReturnThis(),
    addKeySignature: vi.fn().mockReturnThis(),
    setContext: vi.fn().mockReturnThis(),
    draw: vi.fn(),
    getWidth: vi.fn(() => 200),
  }));

  const StaveNote = vi.fn(() => ({
    addModifier: vi.fn(),
  }));

  const Voice = vi.fn(() => ({
    addTickables: vi.fn(),
    setMode: vi.fn(),
    draw: vi.fn(),
  }));
  (Voice as any).Mode = { SOFT: 0 };

  const Formatter = vi.fn(() => ({
    joinVoices: vi.fn().mockReturnThis(),
    format: vi.fn(),
  }));

  const Accidental = vi.fn();

  const StaveConnector = vi.fn(() => ({
    setType: vi.fn().mockReturnThis(),
    setContext: vi.fn().mockReturnThis(),
    draw: vi.fn(),
  }));
  (StaveConnector as any).type = { BRACE: 'brace', SINGLE_LEFT: 'singleleft' };

  return {
    Renderer,
    Stave,
    StaveNote,
    Voice,
    Formatter,
    Accidental,
    StaveConnector,
  };
});

// Mock Tone.js for audio playback
vi.mock('tone', () => ({
  Sampler: vi.fn(() => ({
    toDestination: vi.fn().mockReturnThis(),
    triggerAttackRelease: vi.fn(),
    loaded: true,
  })),
  Transport: {
    start: vi.fn(),
    stop: vi.fn(),
    pause: vi.fn(),
    position: 0,
    bpm: { value: 120 },
  },
  context: {
    resume: vi.fn(),
  },
}));

// Mock WebSocket
global.WebSocket = vi.fn(() => ({
  send: vi.fn(),
  close: vi.fn(),
  addEventListener: vi.fn(),
  removeEventListener: vi.fn(),
  readyState: WebSocket.OPEN,
})) as any;

// Mock IntersectionObserver (used by some UI libraries)
global.IntersectionObserver = vi.fn(() => ({
  observe: vi.fn(),
  unobserve: vi.fn(),
  disconnect: vi.fn(),
})) as any;

// Mock ResizeObserver (used by VexFlow)
global.ResizeObserver = vi.fn(() => ({
  observe: vi.fn(),
  unobserve: vi.fn(),
  disconnect: vi.fn(),
})) as any;