igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
1,081 lines (846 loc) • 43.4 kB
text/typescript
import { Component, ViewChild, TemplateRef } from '@angular/core';
import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import {
IgxCarouselComponent,
ISlideEventArgs,
CarouselIndicatorsOrientation
} from './carousel.component';
import { UIInteractions, wait } from '../test-utils/ui-interactions.spec';
import { configureTestSuite } from '../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { IgxSlideComponent } from './slide.component';
import { HorizontalAnimationType } from './carousel-base';
import { IgxCarouselIndicatorDirective, IgxCarouselNextButtonDirective, IgxCarouselPrevButtonDirective } from './carousel.directives';
import { NgFor, NgIf } from '@angular/common';
describe('Carousel', () => {
configureTestSuite();
let fixture;
let carousel: IgxCarouselComponent;
beforeAll(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
CarouselTestComponent,
CarouselTemplateSetInMarkupTestComponent,
CarouselTemplateSetInTypescriptTestComponent,
CarouselAnimationsComponent,
CarouselDynamicSlidesComponent
]
}).compileComponents();
}));
describe('Base Tests: ', () => {
beforeEach(() => {
fixture = TestBed.createComponent(CarouselTestComponent);
carousel = fixture.componentInstance.carousel;
fixture.detectChanges();
});
it('should initialize a carousel with id property', () => {
const domCarousel = fixture.debugElement.query(By.css('igx-carousel')).nativeElement;
expect(carousel.id).toContain('igx-carousel-');
expect(domCarousel.id).toContain('igx-carousel-');
carousel.id = 'cusrtomCarousel';
fixture.detectChanges();
expect(carousel.id).toBe('cusrtomCarousel');
expect(domCarousel.id).toBe('cusrtomCarousel');
});
it('should initialize a carousel with four slides and then destroy it', () => {
const domCarousel = fixture.debugElement.query(By.css('igx-carousel')).nativeElement;
expect(carousel).toBeDefined();
expect(carousel.id).toContain('igx-carousel-');
expect(domCarousel.id).toContain('igx-carousel-');
expect(carousel instanceof IgxCarouselComponent).toBe(true);
expect(carousel.slides.first instanceof IgxSlideComponent).toBe(true);
expect(carousel.loop).toBe(true);
expect(carousel.pause).toBe(true);
expect(carousel.slides.length).toEqual(4);
expect(carousel.interval).toEqual(2500);
carousel.ngOnDestroy();
fixture.detectChanges();
expect(carousel.isDestroyed).toBe(true);
});
it('disabled looping', () => {
carousel.loop = false;
fixture.detectChanges();
carousel.next();
carousel.next();
carousel.next();
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
carousel.next();
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
carousel.prev();
carousel.prev();
carousel.prev();
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
carousel.prev();
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
});
it('getter/setter tests', () => {
carousel.loop = false;
carousel.pause = false;
carousel.interval = 500;
carousel.navigation = false;
fixture.detectChanges();
expect(carousel.loop).toBe(false);
expect(carousel.pause).toBe(false);
expect(carousel.interval).toEqual(500);
expect(carousel.navigation).toBe(false);
});
it('add/remove slides tests', () => {
let currentSlide = carousel.get(carousel.current);
carousel.remove(currentSlide);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(3);
expect(carousel.total).toEqual(3);
currentSlide = carousel.get(carousel.current);
carousel.remove(currentSlide);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(2);
expect(carousel.total).toEqual(2);
carousel.add(currentSlide);
carousel.add(currentSlide);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(4);
expect(carousel.total).toEqual(4);
});
it('checking if a slide is not active when it gets removed', () => {
const currentSlide = carousel.get(carousel.current);
carousel.remove(currentSlide);
fixture.detectChanges();
expect(currentSlide.active).toBe(false);
});
it('public methods', () => {
carousel.stop();
fixture.detectChanges();
expect(carousel.isPlaying).toBe(false);
carousel.next();
let currentSlide = carousel.get(carousel.current);
fixture.detectChanges();
expect(carousel.get(1)).toBe(currentSlide);
currentSlide = carousel.get(0);
carousel.prev();
fixture.detectChanges();
expect(carousel.get(0)).toBe(currentSlide);
});
it('emit events', () => {
spyOn(carousel.slideChanged, 'emit');
carousel.next();
fixture.detectChanges();
let args: ISlideEventArgs = {
carousel,
slide: carousel.get(carousel.current)
};
expect(carousel.slideChanged.emit).toHaveBeenCalledWith(args);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(1);
carousel.prev();
args = {
carousel,
slide: carousel.get(carousel.current)
};
fixture.detectChanges();
expect(carousel.slideChanged.emit).toHaveBeenCalledWith(args);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(2);
carousel.select(carousel.get(2));
args = {
carousel,
slide: carousel.get(2)
};
fixture.detectChanges();
expect(carousel.slideChanged.emit).toHaveBeenCalledWith(args);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(3);
spyOn(carousel.slideAdded, 'emit');
carousel.add(carousel.get(carousel.current));
fixture.detectChanges();
args = {
carousel,
slide: carousel.get(carousel.current)
};
expect(carousel.slideAdded.emit).toHaveBeenCalledWith(args);
spyOn(carousel.slideRemoved, 'emit');
args = {
carousel,
slide: carousel.get(carousel.current)
};
carousel.remove(carousel.get(carousel.current));
fixture.detectChanges();
expect(carousel.slideRemoved.emit).toHaveBeenCalledWith(args);
spyOn(carousel.carouselPaused, 'emit');
carousel.stop();
fixture.detectChanges();
expect(carousel.carouselPaused.emit).toHaveBeenCalledWith(carousel);
spyOn(carousel.carouselPlaying, 'emit');
carousel.play();
fixture.detectChanges();
expect(carousel.carouselPlaying.emit).toHaveBeenCalledWith(carousel);
});
it('click handlers', () => {
const nextNav = HelperTestFunctions.getNextButton(fixture);
const prevNav = HelperTestFunctions.getPreviousButton(fixture);
spyOn(carousel, 'prev');
prevNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
expect(carousel.prev).toHaveBeenCalled();
spyOn(carousel, 'next');
nextNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
expect(carousel.next).toHaveBeenCalled();
});
it('keyboard navigation test', () => {
spyOn(carousel.slideChanged, 'emit');
carousel.pause = true;
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
UIInteractions.triggerKeyDownEvtUponElem('ArrowLeft', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
UIInteractions.triggerKeyDownEvtUponElem('ArrowLeft', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
UIInteractions.triggerKeyDownEvtUponElem('Home', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
UIInteractions.triggerKeyDownEvtUponElem('End', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(8);
});
it('changing slides with navigation buttons', () => {
spyOn(carousel.slideChanged, 'emit');
carousel.pause = true;
const prevNav = HelperTestFunctions.getPreviousButton(fixture);
const nextNav = HelperTestFunctions.getNextButton(fixture);
nextNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
nextNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
nextNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
nextNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
prevNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
prevNav.dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(6);
});
it('changing slides with indicators buttons', () => {
spyOn(carousel.slideChanged, 'emit');
carousel.pause = true;
const indicators = HelperTestFunctions.getIndicators(fixture);
expect(indicators.length).toBe(4);
indicators[3].dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 3);
indicators[1].dispatchEvent(new Event('click'));
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(2);
});
it('navigation changes visibility of arrows', () => {
expect(HelperTestFunctions.getNextButton(fixture) === null).toBe(false);
expect(HelperTestFunctions.getPreviousButton(fixture) === null).toBe(false);
carousel.navigation = false;
fixture.detectChanges();
expect(HelperTestFunctions.getNextButton(fixture) === null).toBe(true);
expect(HelperTestFunctions.getPreviousButton(fixture) === null).toBe(true);
carousel.navigation = true;
fixture.detectChanges();
expect(HelperTestFunctions.getNextButton(fixture) === null).toBe(false);
expect(HelperTestFunctions.getPreviousButton(fixture) === null).toBe(false);
});
it('maximumIndicatorsCount changes visibility of indicators', () => {
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsLabel(fixture)).toBeNull();
carousel.maximumIndicatorsCount = 3;
fixture.detectChanges();
expect(carousel.maximumIndicatorsCount).toBe(3);
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(0);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(0);
const label = HelperTestFunctions.getIndicatorsLabel(fixture);
expect(label).toBeDefined();
expect(label.innerHTML).toBe('1 of 4');
carousel.maximumIndicatorsCount = 6;
fixture.detectChanges();
expect(carousel.maximumIndicatorsCount).toBe(6);
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsLabel(fixture)).toBeNull();
});
it('indicatorsOrientation changes the position of indicators', () => {
let indicatorsContainer = HelperTestFunctions.getIndicatorsContainer(fixture);
expect(indicatorsContainer).toBeDefined();
carousel.indicatorsOrientation = CarouselIndicatorsOrientation.top;
fixture.detectChanges();
indicatorsContainer = HelperTestFunctions.getIndicatorsContainer(fixture);
expect(indicatorsContainer).toBeNull();
indicatorsContainer = HelperTestFunctions.getIndicatorsContainer(fixture, CarouselIndicatorsOrientation.top);
expect(indicatorsContainer).toBeDefined();
carousel.indicatorsOrientation = CarouselIndicatorsOrientation.bottom;
fixture.detectChanges();
indicatorsContainer = HelperTestFunctions.getIndicatorsContainer(fixture, CarouselIndicatorsOrientation.top);
expect(indicatorsContainer).toBeNull();
indicatorsContainer = HelperTestFunctions.getIndicatorsContainer(fixture, CarouselIndicatorsOrientation.bottom);
expect(indicatorsContainer).toBeDefined();
});
it('keyboardSupport changes support for keyboard navigation', () => {
carousel.keyboardSupport = false;
carousel.select(carousel.get(1));
fixture.detectChanges();
spyOn(carousel.slideChanged, 'emit');
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
UIInteractions.triggerKeyDownEvtUponElem('ArrowLeft', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
UIInteractions.triggerKeyDownEvtUponElem('End', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
UIInteractions.triggerKeyDownEvtUponElem('Home', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 1);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(0);
carousel.keyboardSupport = true;
fixture.detectChanges();
UIInteractions.triggerKeyDownEvtUponElem('ArrowRight', carousel.nativeElement, true);
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(1);
});
it('should stop/play on mouse enter/leave ', () => {
carousel.interval = 1000;
carousel.play();
fixture.detectChanges();
spyOn(carousel.carouselPaused, 'emit');
spyOn(carousel.carouselPlaying, 'emit');
expect(carousel.isPlaying).toBeTruthy();
UIInteractions.hoverElement(carousel.nativeElement, true);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
expect(carousel.carouselPaused.emit).toHaveBeenCalledTimes(1);
UIInteractions.unhoverElement(carousel.nativeElement, true);
fixture.detectChanges();
expect(carousel.isPlaying).toBeTruthy();
expect(carousel.carouselPlaying.emit).toHaveBeenCalledTimes(1);
expect(carousel.carouselPaused.emit).toHaveBeenCalledTimes(1);
// When the carousel is stopped mouseleave does not start playing
carousel.stop();
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
expect(carousel.carouselPlaying.emit).toHaveBeenCalledTimes(1);
expect(carousel.carouselPaused.emit).toHaveBeenCalledTimes(2);
UIInteractions.hoverElement(carousel.nativeElement, true);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
UIInteractions.unhoverElement(carousel.nativeElement, true);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
expect(carousel.carouselPlaying.emit).toHaveBeenCalledTimes(1);
});
it('should apply correctly aria attributes to carousel component', () => {
const expectedRole = 'region';
const expectedRoleDescription = 'carousel';
const tabIndex = carousel.nativeElement.getAttribute('tabindex');
expect(tabIndex).toBeNull();
expect(carousel.nativeElement.getAttribute('role')).toEqual(expectedRole);
expect(carousel.nativeElement.getAttribute('aria-roledescription')).toEqual(expectedRoleDescription);
const indicators = carousel.nativeElement.querySelector(HelperTestFunctions.INDICATORS_BOTTOM_CLASS);
expect(indicators).toBeDefined();
expect(indicators.getAttribute('role')).toEqual('tablist');
const tabs = carousel.nativeElement.querySelectorAll('[role="tab"]');
expect(tabs.length).toEqual(4);
});
it('should apply correctly aria attributes to slide components', () => {
carousel.loop = false;
carousel.select(carousel.get(1));
fixture.detectChanges();
const expectedRole = 'tabpanel';
const slide = carousel.slides.find(s => s.active);
const tabIndex = slide.nativeElement.getAttribute('tabindex');
expect(+tabIndex).toBe(0);
expect(slide.nativeElement.getAttribute('role')).toEqual(expectedRole);
const tabs = carousel.nativeElement.querySelectorAll('[role="tab"]');
const slides = carousel.nativeElement.querySelectorAll('[role="tabpanel"]');
expect(slides.length).toEqual(tabs.length);
});
});
describe('Templates Tests: ', () => {
it('verify that templates can be defined in the markup', () => {
fixture = TestBed.createComponent(CarouselTemplateSetInMarkupTestComponent);
carousel = fixture.componentInstance.carousel;
fixture.detectChanges();
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(0);
for (let index = 0; index < 4; index++) {
const indicator = HelperTestFunctions.getIndicators(fixture)[index] as HTMLElement;
expect(indicator.innerText).toEqual(index.toString());
}
expect(HelperTestFunctions.getNextButtonArrow(fixture)).toBeNull();
expect(HelperTestFunctions.getPreviousButtonArrow(fixture)).toBeNull();
expect(HelperTestFunctions.getNextButton(fixture).innerText).toEqual('next');
expect(HelperTestFunctions.getPreviousButton(fixture).innerText).toEqual('prev');
});
it('verify that templates can be changed', () => {
fixture = TestBed.createComponent(CarouselTemplateSetInTypescriptTestComponent);
carousel = fixture.componentInstance.carousel;
fixture.detectChanges();
carousel.select(carousel.get(1));
fixture.detectChanges();
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(4);
expect(HelperTestFunctions.getNextButtonArrow(fixture)).toBeDefined();
expect(HelperTestFunctions.getPreviousButtonArrow(fixture)).toBeDefined();
carousel.indicatorTemplate = fixture.componentInstance.customIndicatorTemplate1;
carousel.nextButtonTemplate = fixture.componentInstance.customNextTemplate;
carousel.prevButtonTemplate = fixture.componentInstance.customPrevTemplate;
fixture.detectChanges();
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(0);
for (let index = 0; index < 4; index++) {
const indicator = HelperTestFunctions.getIndicators(fixture)[index] as HTMLElement;
expect(indicator.innerText).toEqual(index.toString());
}
expect(HelperTestFunctions.getNextButtonArrow(fixture)).toBeNull();
expect(HelperTestFunctions.getPreviousButtonArrow(fixture)).toBeNull();
expect(HelperTestFunctions.getNextButton(fixture).innerText).toEqual('next');
expect(HelperTestFunctions.getPreviousButton(fixture).innerText).toEqual('prev');
carousel.indicatorTemplate = fixture.componentInstance.customIndicatorTemplate2;
fixture.detectChanges();
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(0);
for (let index = 0; index < 4; index++) {
const indicator = HelperTestFunctions.getIndicators(fixture)[index] as HTMLElement;
if (index === 1) {
expect(indicator.innerText).toEqual('1: Active');
} else {
expect(indicator.innerText).toEqual(index.toString());
}
}
carousel.indicatorTemplate = null;
carousel.nextButtonTemplate = null;
carousel.prevButtonTemplate = null;
fixture.detectChanges();
expect(HelperTestFunctions.getIndicators(fixture).length).toBe(4);
expect(HelperTestFunctions.getIndicatorsDots(fixture).length).toBe(4);
expect(HelperTestFunctions.getNextButtonArrow(fixture)).toBeDefined();
expect(HelperTestFunctions.getPreviousButtonArrow(fixture)).toBeDefined();
});
});
describe('Animations Tests: ', () => {
beforeEach(() => {
fixture = TestBed.createComponent(CarouselAnimationsComponent);
fixture.detectChanges();
carousel = fixture.componentInstance.carousel;
});
it('Test slide animation', async () => {
await wait();
expect(carousel.get(0).active).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.animationType).toBe(HorizontalAnimationType.slide);
carousel.next();
fixture.detectChanges();
await wait(200);
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeTruthy();
await wait(200);
fixture.detectChanges();
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeFalsy();
carousel.prev();
fixture.detectChanges();
await wait(230);
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeTruthy();
await wait(200);
fixture.detectChanges();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeFalsy();
});
it('Test fade animation', async () => {
await wait();
carousel.animationType = HorizontalAnimationType.fade;
fixture.detectChanges();
expect(carousel.get(0).active).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.animationType).toBe(HorizontalAnimationType.fade);
carousel.next();
fixture.detectChanges();
await wait(200);
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeTruthy();
await wait(200);
fixture.detectChanges();
expect(carousel.get(1).nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.get(0).nativeElement.classList.contains(HelperTestFunctions.PREVIOUS_SLIDE_CLASS)).toBeFalsy();
});
});
describe('Dynamic Slides: ', () => {
let slides;
beforeEach(() => {
fixture = TestBed.createComponent(CarouselDynamicSlidesComponent);
fixture.detectChanges();
carousel = fixture.componentInstance.carousel;
slides = fixture.componentInstance.slides;
});
it('should activate slide when change its property active', fakeAsync(() => {
tick();
// Verify 3th slide is active
HelperTestFunctions.verifyActiveSlide(carousel, 2);
// Change active slide
slides[0].active = true;
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 0);
}));
it('should add slides to the carousel when collection is changed', fakeAsync(() => {
tick();
spyOn(carousel.slideAdded, 'emit');
// add a slide
slides.push({ text: 'Slide 5' });
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
expect(carousel.total).toEqual(5);
// add an active slide
slides.push({ text: 'Slide 6', active: true });
fixture.detectChanges();
tick(100);
HelperTestFunctions.verifyActiveSlide(carousel, 5);
expect(carousel.total).toEqual(6);
expect(carousel.slideAdded.emit).toHaveBeenCalledTimes(2);
}));
it('should remove slides in the carousel', fakeAsync(() => {
tick();
spyOn(carousel.slideRemoved, 'emit');
// remove a slide
slides.pop();
fixture.detectChanges();
HelperTestFunctions.verifyActiveSlide(carousel, 2);
expect(carousel.total).toEqual(3);
// remove active slide
slides.pop();
fixture.detectChanges();
tick(200);
fixture.detectChanges();
expect(carousel.total).toEqual(2);
HelperTestFunctions.verifyActiveSlide(carousel, 1);
expect(carousel.slideRemoved.emit).toHaveBeenCalledTimes(2);
}));
it('should not render navigation buttons and indicators when carousel does not have slides', fakeAsync(() => {
fixture.componentInstance.removeAllSlides();
fixture.detectChanges();
tick(200);
expect(carousel.total).toEqual(0);
expect(HelperTestFunctions.getIndicatorsContainer(fixture)).toBeNull();
expect(HelperTestFunctions.getIndicatorsContainer(fixture, CarouselIndicatorsOrientation.top)).toBeNull();
expect(HelperTestFunctions.getNextButton(fixture)).toBeNull();
expect(HelperTestFunctions.getPreviousButton(fixture)).toBeNull();
// add a slide
fixture.componentInstance.addSlides();
fixture.detectChanges();
tick(200);
expect(carousel.total).toEqual(2);
expect(HelperTestFunctions.getIndicatorsContainer(fixture)).toBeDefined();
expect(HelperTestFunctions.getIndicatorsContainer(fixture, CarouselIndicatorsOrientation.top)).toBeDefined();
expect(HelperTestFunctions.getNextButton(fixture).hidden).toBeFalsy();
expect(HelperTestFunctions.getPreviousButton(fixture).hidden).toBeFalsy();
}));
});
describe('Gestures Tests: ', () => {
beforeEach(() => {
fixture = TestBed.createComponent(CarouselDynamicSlidesComponent);
fixture.detectChanges();
carousel = fixture.componentInstance.carousel;
});
it('should stop/play on tap ', () => {
carousel.interval = 1000;
carousel.play();
fixture.detectChanges();
spyOn(carousel.carouselPaused, 'emit');
spyOn(carousel.carouselPlaying, 'emit');
expect(carousel.isPlaying).toBeTruthy();
HelperTestFunctions.simulateTap(fixture, carousel);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
HelperTestFunctions.simulateTap(fixture, carousel);
fixture.detectChanges();
expect(carousel.isPlaying).toBeTruthy();
// When the carousel is stopped tap does not start playing
carousel.stop();
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
HelperTestFunctions.simulateTap(fixture, carousel);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
HelperTestFunctions.simulateTap(fixture, carousel);
fixture.detectChanges();
expect(carousel.isPlaying).toBeFalsy();
});
it('verify changing slides with pan left ', () => {
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, -0.05, 0.1);
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, -0.7, 0.1);
expect(carousel.current).toEqual(3);
HelperTestFunctions.simulatePan(fixture, carousel, -0.2, 2);
expect(carousel.current).toEqual(0);
});
it('verify changing slides with pan right ', () => {
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, 0.1, 0.1);
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, 0.6, 0.1);
expect(carousel.current).toEqual(1);
HelperTestFunctions.simulatePan(fixture, carousel, 0.05, 2);
expect(carousel.current).toEqual(0);
});
it('verify pan when loop is false', () => {
carousel.loop = false;
fixture.detectChanges();
carousel.select(carousel.get(0));
fixture.detectChanges();
expect(carousel.current).toEqual(0);
HelperTestFunctions.simulatePan(fixture, carousel, 0.9, 2);
expect(carousel.current).toEqual(0);
carousel.select(carousel.get(3));
fixture.detectChanges();
expect(carousel.current).toEqual(3);
HelperTestFunctions.simulatePan(fixture, carousel, -0.9, 2);
expect(carousel.current).toEqual(3);
});
it('verify pan when gesturesSupport is false', () => {
carousel.gesturesSupport = false;
fixture.detectChanges();
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, 0.9, 2);
expect(carousel.current).toEqual(2);
HelperTestFunctions.simulatePan(fixture, carousel, -0.6, 2);
expect(carousel.current).toEqual(2);
});
});
});
class HelperTestFunctions {
public static NEXT_BUTTON_CLASS = '.igx-carousel__arrow--next';
public static PRIV_BUTTON_CLASS = '.igx-carousel__arrow--prev';
public static BUTTON_ARROW_CLASS = '.igx-nav-arrow';
public static ACTIVE_SLIDE_CLASS = 'igx-slide--current';
public static PREVIOUS_SLIDE_CLASS = 'igx-slide--previous';
public static INDICATORS_TOP_CLASS = '.igx-carousel-indicators--top';
public static INDICATORS_BOTTOM_CLASS = '.igx-carousel-indicators--bottom';
public static INDICATORS_LABEL_CLASS = '.igx-carousel__label';
public static INDICATOR_CLASS = '.igx-carousel-indicators__indicator';
public static INDICATOR_DOT_CLASS = '.igx-nav-dot';
public static INDICATOR_ACTIVE_DOT_CLASS = '.igx-nav-dot--active';
public static getNextButton(fixture): HTMLElement {
return fixture.nativeElement.querySelector(HelperTestFunctions.NEXT_BUTTON_CLASS);
}
public static getPreviousButton(fixture): HTMLElement {
return fixture.nativeElement.querySelector(HelperTestFunctions.PRIV_BUTTON_CLASS);
}
public static getNextButtonArrow(fixture): HTMLElement {
const next = HelperTestFunctions.getNextButton(fixture);
return next.querySelector(HelperTestFunctions.BUTTON_ARROW_CLASS);
}
public static getPreviousButtonArrow(fixture): HTMLElement {
const prev = HelperTestFunctions.getPreviousButton(fixture);
return prev.querySelector(HelperTestFunctions.BUTTON_ARROW_CLASS);
}
public static getIndicatorsContainer(fixture, position: CarouselIndicatorsOrientation = CarouselIndicatorsOrientation.bottom): HTMLElement {
const carouselNative = fixture.nativeElement;
if (position === CarouselIndicatorsOrientation.bottom) {
return carouselNative.querySelector(HelperTestFunctions.INDICATORS_BOTTOM_CLASS);
} else {
return carouselNative.querySelector(HelperTestFunctions.INDICATORS_TOP_CLASS);
}
}
public static getIndicatorsLabel(fixture, position: CarouselIndicatorsOrientation = CarouselIndicatorsOrientation.bottom) {
const indContainer = HelperTestFunctions.getIndicatorsContainer(fixture, position);
return indContainer.querySelector(HelperTestFunctions.INDICATORS_LABEL_CLASS);
}
public static getIndicators(fixture, position: CarouselIndicatorsOrientation = CarouselIndicatorsOrientation.bottom) {
const indContainer = HelperTestFunctions.getIndicatorsContainer(fixture, position);
return indContainer.querySelectorAll(HelperTestFunctions.INDICATOR_CLASS);
}
public static getIndicatorsDots(fixture, position: CarouselIndicatorsOrientation = CarouselIndicatorsOrientation.bottom) {
const indContainer = HelperTestFunctions.getIndicatorsContainer(fixture, position);
return indContainer.querySelectorAll(HelperTestFunctions.INDICATOR_DOT_CLASS);
}
public static verifyActiveSlide(carousel, index: number) {
const activeSlide = carousel.get(index);
expect(carousel.current).toEqual(index);
expect(activeSlide.active).toBeTruthy();
expect(activeSlide.nativeElement.classList.contains(HelperTestFunctions.ACTIVE_SLIDE_CLASS)).toBeTruthy();
expect(carousel.slides.find((slide) => slide.active && slide.index !== index)).toBeUndefined();
}
public static simulateTap(fixture, carousel) {
const activeSlide = carousel.get(carousel.current).nativeElement;
const carouselElement = fixture.debugElement.query(By.css('igx-carousel'));
carouselElement.triggerEventHandler('tap', {target: activeSlide});
// Simulator.gestures.press(activeSlide, { duration: 180 });
}
public static simulatePan(fixture, carousel, deltaXOffset, velocity) {
const activeSlide = carousel.get(carousel.current).nativeElement;
const carouselElement = fixture.debugElement.query(By.css('igx-carousel'));
const deltaX = activeSlide.offsetWidth * deltaXOffset;
const event = deltaXOffset < 0 ? 'panleft' : 'panright';
const panOptions = {
deltaX,
deltaY: 0,
duration: 100,
velocity,
preventDefault: ( () => { })
};
carouselElement.triggerEventHandler(event, panOptions);
fixture.detectChanges();
carouselElement.triggerEventHandler('panend', panOptions);
fixture.detectChanges();
}
}
({
template: `
<igx-carousel #carousel [loop]="loop" [pause]="pause" [interval]="interval" [animationType]="'none'">
<igx-slide><h3>Slide1</h3></igx-slide>
<igx-slide><h3>Slide2</h3></igx-slide>
<igx-slide><h3>Slide3</h3></igx-slide>
<igx-slide><h3>Slide4</h3></igx-slide>
</igx-carousel>
`,
standalone: true,
imports: [IgxCarouselComponent, IgxSlideComponent]
})
class CarouselTestComponent {
('carousel', { static: true }) public carousel: IgxCarouselComponent;
public loop = true;
public pause = true;
public interval = 2500;
}
({
template: `
<igx-carousel #carousel>
<igx-slide [active]="true"><h3>Slide1</h3></igx-slide>
<igx-slide><h3>Slide2</h3></igx-slide>
<igx-slide><h3>Slide3</h3></igx-slide>
<igx-slide><h3>Slide4</h3></igx-slide>
</igx-carousel>
`,
standalone: true,
imports: [IgxCarouselComponent, IgxSlideComponent]
})
class CarouselAnimationsComponent {
('carousel', { static: true }) public carousel: IgxCarouselComponent;
}
({
template: `
<igx-carousel #carousel [animationType]="'none'">
<igx-slide><h3>Slide1</h3></igx-slide>
<igx-slide><h3>Slide2</h3></igx-slide>
<igx-slide><h3>Slide3</h3></igx-slide>
<igx-slide><h3>Slide4</h3></igx-slide>
<ng-template igxCarouselIndicator let-slide>
<span> {{slide.index}} </span>
</ng-template>
<ng-template igxCarouselNextButton>
<span>next</span>
</ng-template>
<ng-template igxCarouselPrevButton>
<span>prev</span>
</ng-template>
</igx-carousel>
`,
standalone: true,
imports: [IgxCarouselComponent, IgxSlideComponent, IgxCarouselIndicatorDirective, IgxCarouselNextButtonDirective, IgxCarouselPrevButtonDirective]
})
class CarouselTemplateSetInMarkupTestComponent {
('carousel', { static: true }) public carousel: IgxCarouselComponent;
}
({
template: `
<ng-template #customIndicatorTemplate1 let-slide>
<span> {{slide.index}} </span>
</ng-template>
<ng-template #customIndicatorTemplate2 let-slide>
<span *ngIf="!slide.active"> {{slide.index}} </span>
<span *ngIf="slide.active"> {{slide.index}}: Active </span>
</ng-template>
<ng-template #customNextTemplate>
<span>next</span>
</ng-template>
<ng-template #customPrevTemplate>
<span>prev</span>
</ng-template>
<igx-carousel #carousel [animationType]="'none'">
<igx-slide><h3>Slide1</h3></igx-slide>
<igx-slide><h3>Slide2</h3></igx-slide>
<igx-slide><h3>Slide3</h3></igx-slide>
<igx-slide><h3>Slide4</h3></igx-slide>
</igx-carousel>
`,
standalone: true,
imports: [IgxCarouselComponent, IgxSlideComponent, NgIf]
})
class CarouselTemplateSetInTypescriptTestComponent {
('carousel', { static: true }) public carousel: IgxCarouselComponent;
('customIndicatorTemplate1', { read: TemplateRef, static: false })
public customIndicatorTemplate1;
('customIndicatorTemplate2', { read: TemplateRef, static: false })
public customIndicatorTemplate2;
('customNextTemplate', { read: TemplateRef, static: false })
public customNextTemplate;
('customPrevTemplate', { read: TemplateRef, static: false })
public customPrevTemplate;
}
({
template: `
<igx-carousel #carousel [loop]="loop" [animationType]="'none'">
<igx-slide *ngFor="let slide of slides" [active]="slide.active">
<igx-slide><h3>{{slide.text}}</h3></igx-slide>
</igx-slide>
</igx-carousel>
`,
standalone: true,
imports: [IgxCarouselComponent, IgxSlideComponent, NgFor]
})
class CarouselDynamicSlidesComponent {
('carousel', { static: true }) public carousel: IgxCarouselComponent;
public loop = true;
public slides = [];
constructor() {
this.addNewSlide();
}
public addNewSlide() {
this.slides.push(
{ text: 'Slide 1', active: false },
{ text: 'Slide 2', active: false },
{ text: 'Slide 3', active: true },
{ text: 'Slide 4', active: false }
);
}
public removeAllSlides() {
this.slides = [];
}
public addSlides() {
this.slides.push(
{ text: 'Slide 1' },
{ text: 'Slide 2' }
);
}
}