slider-pro-js
Version:
Modular JavaScript slider that is dependency-free, rich-featured, flexible and easy to use
227 lines (167 loc) • 7.48 kB
JavaScript
import SliderPro from '../../src/core/slider-pro.js';
import { basicSlider } from '../assets/html/html.js';
let slider, sliderEl;
beforeAll( ()=> {
document.body.innerHTML = basicSlider;
sliderEl = document.getElementsByClassName( 'slider-pro' )[0];
});
describe( 'slider setup', () => {
beforeAll( () => {
slider = new SliderPro( '.slider-pro' );
});
afterAll( () => {
slider.destroy();
});
test( 'should have the sp-no-js class removed', () => {
expect( sliderEl.classList.contains( 'sp-no-js' ) ).toBe( false );
});
test( 'should have the correct number of slides', () => {
expect( slider.getTotalSlides() ).toBe( 5 );
});
test( 'should have the correct slide order', () => {
const expectedSlideOrder = ['1', '2', '3', '4', '5'];
const actualSlideOrder = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
actualSlideOrder.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( actualSlideOrder ).toEqual( expectedSlideOrder );
});
test( 'should return the correct initial selected slide index', () => {
expect( slider.getSelectedSlide() ).toBe( 0 );
});
test( 'should return the correct slide when retireving by index', () => {
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
expect( slider.getSlideAt( i ).index ).toBe( i );
}
});
});
describe( 'slider shuffle', () => {
beforeAll( () => {
slider = new SliderPro( '.slider-pro', { shuffle: true } );
});
afterAll( () => {
slider.destroy();
});
test( 'should have random slide order when `shuffle` is used', () => {
const notExpectedSlideOrder = ['1', '2', '3', '4', '5'];
const randomSlideOrder = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
randomSlideOrder.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( randomSlideOrder ).not.toEqual( notExpectedSlideOrder );
});
test( 'should have the correct number of slides when `shuffle` is used', () => {
expect( slider.getTotalSlides() ).toBe( 5 );
});
test( 'should have unique slides when `shuffle` is used', () => {
const slides = ['1', '2', '3', '4', '5'];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
const index = slides.indexOf( slider.getSlideAt( i ).slideEl.textContent );
slides.splice( index, 1 );
}
expect( slides.length ).toBe( 0 );
});
});
describe( 'update the slider content', () => {
beforeAll( () => {
document.body.innerHTML = basicSlider;
sliderEl = document.getElementsByClassName( 'slider-pro' )[0];
slider = new SliderPro( '.slider-pro' );
});
afterAll( () => {
slider.destroy();
});
test( 'should add a slide at the correct position', () => {
const newSlideEl = document.createElement( 'div' );
newSlideEl.classList.add( 'sp-slide' );
newSlideEl.textContent = 'new slide';
sliderEl.getElementsByClassName( 'sp-slide' )[2].after( newSlideEl );
slider.update();
const slidesContent = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
slidesContent.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( slidesContent ).toEqual( ['1', '2', '3', 'new slide', '4', '5'] );
});
test( 'should add multiple slides at the correct position', () => {
const secondSlideEl = document.createElement( 'div' );
secondSlideEl.classList.add( 'sp-slide' );
secondSlideEl.textContent = 'second slide';
const thirdSlideEl = document.createElement( 'div' );
thirdSlideEl.classList.add( 'sp-slide' );
thirdSlideEl.textContent = 'third slide';
sliderEl.getElementsByClassName( 'sp-slide' )[1].after( secondSlideEl );
sliderEl.getElementsByClassName( 'sp-slide' )[5].after( thirdSlideEl );
slider.update();
const slidesContent = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
slidesContent.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( slidesContent ).toEqual( ['1', '2', 'second slide', '3', 'new slide', '4', 'third slide', '5'] );
});
test( 'should remove a slide', () => {
const toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[4];
toRemoveSlideEl.remove();
slider.update();
const slidesContent = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
slidesContent.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( slidesContent ).toEqual( ['1', '2', 'second slide', '3', '4', 'third slide', '5'] );
});
test( 'should remove multiple slides', () => {
let toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[4];
toRemoveSlideEl.remove();
toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[2];
toRemoveSlideEl.remove();
toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[4];
toRemoveSlideEl.remove();
slider.update();
const slidesContent = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
slidesContent.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( slidesContent ).toEqual( ['1', '2', '3', 'third slide'] );
});
test( 'should add and remove multiple slides', () => {
let newSlideEl = document.createElement( 'div' );
newSlideEl.classList.add( 'sp-slide' );
newSlideEl.textContent = '4';
sliderEl.getElementsByClassName( 'sp-slide' )[2].after( newSlideEl );
newSlideEl = document.createElement( 'div' );
newSlideEl.classList.add( 'sp-slide' );
newSlideEl.textContent = '5';
sliderEl.getElementsByClassName( 'sp-slide' )[3].after( newSlideEl );
let toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[5];
toRemoveSlideEl.remove();
toRemoveSlideEl = sliderEl.getElementsByClassName( 'sp-slide' )[0];
toRemoveSlideEl.remove();
slider.update();
const slidesContent = [];
for ( let i = 0; i < slider.getTotalSlides(); i++ ) {
slidesContent.push( slider.getSlideAt( i ).slideEl.textContent );
}
expect( slidesContent ).toEqual( ['2', '3', '4', '5'] );
});
});
describe( 'slide order with loop enabled', () => {
beforeAll( () => {
document.body.innerHTML = basicSlider;
sliderEl = document.getElementsByClassName( 'slider-pro' )[0];
slider = new SliderPro( '.slider-pro' );
});
afterAll( () => {
slider.destroy();
});
test( 'should have the correct initial order when the number of slides is odd', () => {
expect( slider.slidesOrder ).toEqual( [ 3, 4, 0, 1, 2 ] );
});
test( 'should have the correct initial order when the number of slides is even', () => {
const newSlideEl = document.createElement( 'div' );
newSlideEl.classList.add( 'sp-slide' );
newSlideEl.textContent = '6';
sliderEl.getElementsByClassName( 'sp-slides' )[0].appendChild( newSlideEl );
slider.update();
expect( slider.slidesOrder ).toEqual( [ 4, 5, 0, 1, 2, 3 ] );
});
});