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, }, }); }); });