import { minimum } from '../data/html';
import Splide from '../../src/js/splide';
import { COMPLETE } from '../../src/js/components';
describe( 'The "loop" type Splide', () => {
	let splide;
	const width = 800;
	beforeEach( () => {
		document.body.innerHTML = minimum;
		splide = new Splide( '#splide', { type: 'loop' }, COMPLETE ).mount();
		// Set up the getBoundingClientRect.
		splide.Components.Elements.getSlides( true ).forEach( Slide => {
			Slide.slide.getBoundingClientRect = jest.fn( () => ( {
				right: width * ( Slide.index + 1 + splide.Components.Clones.length  / 2 ),
			} ) );
		} );
	} );
	test( 'should activate a Clones component and yield clone slides', () => {
		const Clones = splide.Components.Clones;
		expect( Clones.length ).toBeGreaterThan( 0 );
	} );
	test( 'should init track position according to length of clones.', () => {
		const { Track, Clones, Elements } = splide.Components;
		Object.defineProperty( Elements.track, 'clientWidth', { value: width } );
		global.dispatchEvent( new Event( 'resize' ) );
		expect( Math.abs( Track.toPosition( 0 ) ) ).toBe( width * Clones.length / 2 );
	} );
	test( 'should move to clones before the first slide or after the last one then jump to actual slide.', done => {
		splide.on( 'move', ( newIndex, prevIndex, destIndex ) => {
			expect( newIndex ).toBe( 0 );
			expect( destIndex ).toBe( splide.length );
		} );
		splide.on( 'moved', ( newIndex, prevIndex, destIndex ) => {
			expect( newIndex ).toBe( 0 );
			expect( destIndex ).toBe( splide.length );
			expect( splide.index ).toBe( 0 );
			done();
		} );
		splide.go( splide.length );
		splide.Components.Elements.list.dispatchEvent( new Event( 'transitionend' ) );
	} );
} );