import React from 'react';
import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';
import KeySignaturePickerPopup from './KeySignaturePickerPopup';
vi.mock('vexflow', () => {
class MockRenderer {
static Backends = { SVG: 'svg' };
private readonly host: HTMLElement;
constructor(host: HTMLElement) {
this.host = host;
}
resize() {}
getContext() {
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
this.host.appendChild(svg);
return {};
}
}
class MockStave {
constructor() {}
addClef() {
return this;
}
addKeySignature() {
return this;
}
setContext() {
return this;
}
draw() {
return this;
}
}
return {
Renderer: MockRenderer,
Stave: MockStave,
};
});
describe('KeySignaturePickerPopup', () => {
it('selects major and minor key signatures', () => {
const onChange = vi.fn();
render();
fireEvent.click(screen.getByRole('button', { name: 'Select G major' }));
fireEvent.click(screen.getByRole('button', { name: 'Select E minor' }));
expect(onChange).toHaveBeenNthCalledWith(1, 'G major');
expect(onChange).toHaveBeenNthCalledWith(2, 'E minor');
});
it('renders both exact options for shared enharmonic slots', () => {
render();
expect(screen.getByRole('button', { name: 'Select Gb major or F# major' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Select Eb minor or D# minor' })).toBeInTheDocument();
});
it('toggles between paired enharmonic options from a single button', () => {
const onChange = vi.fn();
const { rerender } = render();
fireEvent.click(screen.getByRole('button', { name: 'Select Gb major or F# major' }));
expect(onChange).toHaveBeenCalledWith('Gb major');
rerender();
fireEvent.click(screen.getByRole('button', { name: 'Select Gb major or F# major' }));
expect(onChange).toHaveBeenLastCalledWith('F# major');
});
});