import { minimum } from '../data/html';
import Splide from '../../src/js/splide';
import { STATUS_CLASSES } from "../../src/js/constants/classes";
import { COMPLETE } from '../../src/js/components';
describe( 'The "slide" type Splide', () => {
	let splide;
	const width = 800;
	beforeEach( () => {
		document.body.innerHTML = minimum;
		splide = new Splide( '#splide', {}, COMPLETE ).mount();
		const { track, list, slides } = splide.Components.Elements;
		// Set up the getBoundingClientRect.
		slides.forEach( ( slide, index ) => {
			slide.getBoundingClientRect = jest.fn( () => ( {
				right: width * index + 1,
			} ) );
			Object.defineProperty( slide, 'offsetWidth', { value: width } );
			Object.defineProperty( slide, 'clientWidth', { value: width } );
		} );
		track.getBoundingClientRect = jest.fn( () => ( { left: 0, right: width } ) );
		splide.on( 'move', newIndex => {
			const offset = slides.filter( ( slide, index ) => index < newIndex ).reduce( ( offset, slide ) => {
				offset += slide.clientWidth;
				return offset;
			}, 0 );
			list.getBoundingClientRect = jest.fn( () => ( { left: -offset } ) );
		} );
	} );
	test( 'should init index and slide attributes correctly.', () => {
		expect( splide.index ).toBe( 0 );
		const Slide     = splide.Components.Elements.getSlide( splide.index );
		const classList = Slide.slide.classList;
		expect( classList.contains( STATUS_CLASSES.active ) ).toBe( true );
		expect( classList.contains( STATUS_CLASSES.visible ) ).toBe( true );
	} );
	test( 'should move slides and update attributes correctly.', done => {
		const { Track, Elements: { track, list } } = splide.Components;
		Object.defineProperty( track, 'clientWidth', { value: width } );
		expect( parseInt( Track.position ) ).toBe( 0 );
		splide.on( 'moved', ( newIndex, prevIndex ) => {
			expect( Track.position ).toBe( -width );
			const prevSlide   = splide.Components.Elements.getSlide( prevIndex );
			const newSlide    = splide.Components.Elements.getSlide( newIndex );
			const prevClasses = prevSlide.slide.classList;
			const newClasses  = newSlide.slide.classList;
			expect( prevSlide.index ).toBe( 0 );
			expect( newSlide.index ).toBe( 1 );
			expect( prevClasses.contains( STATUS_CLASSES.active ) ).toBe( false );
			expect( prevClasses.contains( STATUS_CLASSES.visible ) ).toBe( false );
			expect( newClasses.contains( STATUS_CLASSES.active ) ).toBe( true );
			expect( newClasses.contains( STATUS_CLASSES.visible ) ).toBe( true );
			done();
		} );
		splide.go( '+' );
		list.dispatchEvent( new Event( 'transitionend' ) );
	} );
	test( 'should not rewind index.', () => {
		expect( splide.index ).toBe( 0 );
		splide.go( '-' );
		expect( splide.index ).toBe( 0 );
	} );
} );