import { Component } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CarouselModule } from '../carousel/carousel.module';
@Component({selector: 'carousel-test', template: ''})
class TestCarouselComponent {
myInterval = 5000;
noWrapSlides = false;
showIndicators = true;
slides: any[] = [
{image: '//placekitten.com/600/300', text: 'slide0'},
{image: '//placekitten.com/600/300', text: 'slide1'},
{image: '//placekitten.com/600/300', text: 'slide2'}
];
}
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', () => {
let fixture: ComponentFixture;
let context: TestCarouselComponent;
let element: any;
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();
});
// beforeEach(fakeAsync(inject([TestComponentBuilder], (tcb:TestComponentBuilder) => {
// return tcb
// .overrideTemplate(TestCarouselComponent, html)
// .createAsync(TestCarouselComponent)
// .then((f:ComponentFixture) => {
// fixture = f;
// context = fixture.componentInstance;
// fixture.detectChanges();
// element = fixture.nativeElement.querySelector('#c1');
// clean = fixture.nativeElement.querySelector('#c2');
// discardPeriodicTasks();
// });
// })));
it('should set first slide as active by default', () => {
expectActiveSlides(element, [true, 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]);
});
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(3);
});
it('should hide navigation when only one slide', () => {
context.slides.splice(0, 2);
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 and 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 and noWrap is truthy', () => {
context.noWrapSlides = true;
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
indicators[2].click();
fixture.detectChanges();
const next = element.querySelector('a.right');
expect(next.classList).toContain('disabled');
});
it('should change slide on indicator click', () => {
const indicators = element.querySelectorAll('ol.carousel-indicators > li');
expectActiveSlides(element, [true, false, false]);
indicators[2].click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true]);
indicators[1].click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, 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]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false]);
});
// it('should change slide on time passage (default)', fakeAsync(() => {
// expectActiveSlides(clean, [true, false]);
// tick(6000);
// fixture.detectChanges();
// expectActiveSlides(clean, [false, true]);
// }));
it('should wrap slide changes by default', () => {
const prev = element.querySelector('a.left');
const next = element.querySelector('a.right');
expectActiveSlides(element, [true, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true]);
});
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]);
prev.click();
fixture.detectChanges();
expectActiveSlides(element, [true, false, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, true, false]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true]);
next.click();
fixture.detectChanges();
expectActiveSlides(element, [false, false, true]);
});
});