import React from 'react';
import { render } from '@testing-library/react';
import { Song, Track, Instrument } from '..';
import {
mockPolySynthConstructor,
mockPolySynthTriggerAttack,
mockPolySynthTriggerRelease,
mockPolySynthDispose,
mockMembraneSynthConstructor,
mockMetalSynthConstructor,
// mockNoiseSynthConstructor,
mockPluckSynthConstructor,
mockSamplerConstructor,
mockSamplerDispose,
mockPolySynthSet,
mockSamplerAdd,
} from '../__mocks__/tone';
beforeEach(() => {
jest.resetAllMocks();
});
describe('Instrument', () => {
it('should add and remove polySynth from Song', () => {
const { rerender } = render(
,
);
expect(mockPolySynthConstructor).toBeCalledTimes(1);
expect(mockPolySynthConstructor).toBeCalledWith(4, 'Synth', undefined);
expect(mockPolySynthDispose).toBeCalledTimes(0);
// @ts-ignore
rerender();
expect(mockPolySynthDispose).toBeCalledTimes(1);
});
it('should add and remove sampler from Song', () => {
const { rerender } = render(
,
);
expect(mockSamplerConstructor).toBeCalledWith({
C3: '../audio/file.mp3',
});
rerender();
expect(mockSamplerDispose).toBeCalledTimes(1);
});
it('should add and remove samples from sampler Instrument', () => {
const { rerender } = render(
,
);
rerender(
,
);
// TODO: Figure out what to do in this scenario
rerender(
,
);
expect(mockSamplerAdd).toHaveBeenNthCalledWith(
1,
'D3',
'../audio/file2.mp3',
expect.any(Function),
);
expect(mockSamplerAdd).toHaveBeenNthCalledWith(
2,
'E3',
'../audio/file3.mp3',
expect.any(Function),
);
});
it('should trigger and release note', () => {
const { rerender } = render(
,
);
expect(mockPolySynthTriggerAttack).toBeCalledWith(
'C3',
undefined, // Duration
0.5,
);
expect(mockPolySynthTriggerRelease).not.toBeCalledWith('C3');
rerender(
,
);
expect(mockPolySynthTriggerRelease).toBeCalledWith('C3');
});
});
describe('Synth', () => {
it('should render with polyphony and oscillator props', () => {
const { rerender } = render(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(5, 'Synth', {
oscillator: {
type: 'square',
},
});
rerender(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(3, 'Synth', {
oscillator: {
type: 'square',
},
});
rerender(
,
);
expect(mockPolySynthSet).toHaveBeenLastCalledWith('oscillator', {
type: 'sine',
});
});
it('should render with `synth`, `amSynth` and go through all other synth types', () => {
const { rerender } = render(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(
4,
'Synth',
undefined,
);
rerender(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(
4,
'AMSynth',
undefined,
);
rerender(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(
4,
'DuoSynth',
undefined,
);
rerender(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(
4,
'FMSynth',
undefined,
);
rerender(
,
);
expect(mockMembraneSynthConstructor).toHaveBeenLastCalledWith({
oscillator: {
type: 'triangle',
},
});
rerender(
,
);
expect(mockMetalSynthConstructor).toHaveBeenLastCalledWith(undefined);
rerender(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(
4,
'MonoSynth',
undefined,
);
// rerender(
//
//
// ,
// );
// expect(mockNoiseSynthConstructor).toHaveBeenLastCalledWith(undefined);
rerender(
,
);
expect(mockPluckSynthConstructor).toHaveBeenLastCalledWith(undefined);
});
it('should render synth envelopes', () => {
render(
,
);
expect(mockPolySynthConstructor).toHaveBeenLastCalledWith(4, 'Synth', {
envelope: {
attack: 0.02,
},
});
});
});