// tslint:disable:max-file-line-count max-line-length
import { Component } from '@angular/core';
import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
import { CarouselModule } from '../carousel';
@Component({selector: 'carousel-test', template: ''})
class TestCarouselComponent {
myInterval = 5000;
noWrapSlides = false;
showIndicators = true;
itemsPerSlide = 1;
singleSlideOffset = false;
startFromIndex = 0;
slides: any[] = [
{image: '//placekitten.com/600/300', text: 'slide0'},
{image: '//placekitten.com/600/300', text: 'slide1'},
{image: '//placekitten.com/600/300', text: 'slide2'},
{image: '//placekitten.com/600/300', text: 'slide3'},
{image: '//placekitten.com/600/300', text: 'slide4'},
{image: '//placekitten.com/600/300', text: 'slide5'}
];
}
const html = `
Slide {{index}}
{{slide.text}}
slide1
slide2
`;
function expectActiveSlides(nativeEl: HTMLDivElement, active: boolean[]): void {
const slideElms = nativeEl.querySelectorAll('.carousel-item');
const indicatorElms = nativeEl.querySelectorAll(
'ol.carousel-indicators > li'
);
expect(slideElms.length).toBe(active.length);
expect(indicatorElms.length).toBe(active.length);
for (let i = 0; i < active.length; i++) {
if (active[i]) {
expect(slideElms[i].classList).toContain('active');
expect(indicatorElms[i].classList).toContain('active');
} else {
expect(slideElms[i].classList).not.toContain('active');
expect(indicatorElms[i].classList).not.toContain('active');
}
}
}
describe('Component: Carousel', () => {
/* tslint:disable-next-line: no-any */
let fixture: ComponentFixture;
let context: TestCarouselComponent;
/* tslint:disable-next-line: no-any */
let element: any;
/* tslint:disable-next-line: no-any no-unused-variable */
let clean: any;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [TestCarouselComponent],
imports: [CarouselModule]
});
TestBed.overrideComponent(TestCarouselComponent, {
set: {template: html}
});
fixture = TestBed.createComponent(TestCarouselComponent);
context = fixture.componentInstance;
element = fixture.nativeElement.querySelector('#c1');
clean = fixture.nativeElement.querySelector('#c2');
fixture.detectChanges();
});
it('should set first slide as active by default', () => {
expectActiveSlides(element, [true, false, false, false, false, false]);
});
// TODO:
xit('should be able to select a slide via model changes', () => {
context.slides[2].active = true;
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, false, false, false]);
});
it('should create next/prev nav button', () => {
const prev = element.querySelectorAll('a.left');
const next = element.querySelectorAll('a.right');
expect(prev.length).toBe(1);
expect(next.length).toBe(1);
});
it('should display slide indicators', () => {
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
expect(indicators.length).toBe(6);
});
it('should hide navigation when only one slide', () => {
context.slides.splice(0, 5);
fixture.detectChanges();
expect(context.slides.length).toBe(1);
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
expect(indicators.length).toBe(0);
const prev = element.querySelectorAll('a.left');
expect(prev.length).toBe(0);
const next = element.querySelectorAll('a.right');
expect(next.length).toBe(0);
});
it('should disable prev button when slide index is 0, noWrap is truthy', () => {
context.noWrapSlides = true;
fixture.detectChanges();
const prev = element.querySelector('a.left');
expect(prev.classList).toContain('disabled');
});
it('should disable next button when last slide is active, noWrap is truthy', () => {
context.noWrapSlides = true;
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
indicators[5].click();
fixture.detectChanges();
const next = element.querySelector('a.right');
expect(next.classList).toContain('disabled');
});
it('should enable next button when last slide is active, noWrap is truthy', () => {
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
indicators[5].click();
fixture.detectChanges();
const next = element.querySelector('a.right');
expect(next.classList).not.toContain('disabled');
});
it('should change slide on indicator click', () => {
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
expectActiveSlides(element, [true, false, false, false, false, false]);
indicators[2].click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, false, false, false]);
indicators[1].click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false, false, false, false]);
});
it('should hide carousel-indicators if property showIndicators is == false', () => {
context.showIndicators = false;
fixture.detectChanges();
expect(element.querySelector('ol')).toBeNull();
});
it('should change slide on carousel control click', () => {
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false, false, false, false]);
});
it('should wrap slide changes by default', () => {
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, false, false, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false, false, false, false]);
});
it('should not wrap slide changes if noWrap == true', () => {
context.noWrapSlides = true;
fixture.detectChanges();
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, false, false, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, false, false, false]);
});
it('Multilist: should shift visible slides on carousel control click' +
'by number equal to itemsPerSlide value', () => fakeAsync(() => {
context.itemsPerSlide = 3;
fixture.detectChanges();
tick();
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, true, true, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, true, true]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [true, true, true, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, true, true]);
}));
it('Multilist: should select slides on carousel via indicator', () => fakeAsync(() => {
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
context.itemsPerSlide = 3;
fixture.detectChanges();
tick();
expectActiveSlides(element, [true, true, true, false, false, false]);
indicators[2].click();
fixture.detectChanges();
expectActiveSlides(element, [true, true, true, false, false, false]);
indicators[3].click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, true, true]);
}));
it('Multilist: carousel should not shifts if noWrap is false' +
'last or first items are visible', () => fakeAsync(() => {
context.itemsPerSlide = 3;
fixture.detectChanges();
context.noWrapSlides = false;
fixture.detectChanges();
tick();
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, true, true, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, true, true]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, false, true, true, true]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, true, true, false, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, true, true, false, false, false]);
}));
it('Multilist: carousel should shifts by 1 one item if singleSlideOffset is true', () => fakeAsync(() => {
context.itemsPerSlide = 3;
fixture.detectChanges();
context.singleSlideOffset = true;
fixture.detectChanges();
tick();
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, true, true, false, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, true, true, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true, true, true, false]);
}));
it('Multilist: carousel should starts from specific index if fromStartIndex is defined', () => fakeAsync(() => {
context.itemsPerSlide = 3;
fixture.detectChanges();
context.startFromIndex = 5;
fixture.detectChanges();
tick();
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, true, false, false, false, true]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [true, true, true, false, false, false]);
}));
});