77 waitUntil ,
88} from '@open-wc/testing' ;
99
10- import { type SinonFakeTimers , spy , useFakeTimers } from 'sinon' ;
10+ import { type SinonFakeTimers , spy , stub , useFakeTimers } from 'sinon' ;
1111import IgcButtonComponent from '../button/button.js' ;
1212import {
1313 arrowLeft ,
@@ -88,12 +88,6 @@ describe('Carousel', () => {
8888 IgcCarouselIndicatorComponent . tagName
8989 )
9090 ) ;
91-
92- clock = useFakeTimers ( { toFake : [ 'setInterval' ] } ) ;
93- } ) ;
94-
95- afterEach ( ( ) => {
96- clock . restore ( ) ;
9791 } ) ;
9892
9993 describe ( 'Initialization' , ( ) => {
@@ -556,6 +550,26 @@ describe('Carousel', () => {
556550 detail : 0 ,
557551 } ) ;
558552 } ) ;
553+
554+ it ( 'should properly call `igcSlideChanged` event' , async ( ) => {
555+ const eventSpy = spy ( carousel , 'emitEvent' ) ;
556+
557+ stub ( carousel , 'select' )
558+ . onFirstCall ( )
559+ . resolves ( true )
560+ . onSecondCall ( )
561+ . resolves ( false ) ;
562+
563+ // select second indicator
564+ simulateClick ( defaultIndicators [ 1 ] ) ;
565+ await slideChangeComplete ( slides [ 0 ] , slides [ 1 ] ) ;
566+
567+ // select second indicator again
568+ simulateClick ( defaultIndicators [ 1 ] ) ;
569+ await slideChangeComplete ( slides [ 0 ] , slides [ 1 ] ) ;
570+
571+ expect ( eventSpy . callCount ) . to . equal ( 1 ) ;
572+ } ) ;
559573 } ) ;
560574
561575 describe ( 'Keyboard' , ( ) => {
@@ -643,6 +657,12 @@ describe('Carousel', () => {
643657 } ) ;
644658
645659 describe ( 'Automatic rotation' , ( ) => {
660+ beforeEach ( async ( ) => {
661+ clock = useFakeTimers ( { toFake : [ 'setInterval' ] } ) ;
662+ } ) ;
663+
664+ afterEach ( ( ) => clock . restore ( ) ) ;
665+
646666 it ( 'should automatically change slides' , async ( ) => {
647667 expect ( carousel . current ) . to . equal ( 0 ) ;
648668
@@ -655,6 +675,21 @@ describe('Carousel', () => {
655675 expect ( carousel . current ) . to . equal ( 1 ) ;
656676 } ) ;
657677
678+ it ( 'should properly call `igcSlideChanged` event' , async ( ) => {
679+ const eventSpy = spy ( carousel , 'emitEvent' ) ;
680+
681+ carousel . disableLoop = true ;
682+ carousel . interval = 100 ;
683+ await elementUpdated ( carousel ) ;
684+
685+ expect ( carousel . current ) . to . equal ( 0 ) ;
686+
687+ await clock . tickAsync ( 300 ) ;
688+
689+ expect ( carousel . current ) . to . equal ( 2 ) ;
690+ expect ( eventSpy . callCount ) . to . equal ( 2 ) ;
691+ } ) ;
692+
658693 it ( 'should pause/play on pointerenter/pointerleave' , async ( ) => {
659694 const eventSpy = spy ( carousel , 'emitEvent' ) ;
660695 const divContainer = carousel . shadowRoot ?. querySelector (
@@ -1021,6 +1056,88 @@ describe('Carousel', () => {
10211056
10221057 expect ( carousel . current ) . to . equal ( 0 ) ;
10231058 } ) ;
1059+
1060+ it ( 'should properly call `igcSlideChanged` event' , async ( ) => {
1061+ carousel = await fixture < IgcCarouselComponent > (
1062+ html `< igc-carousel >
1063+ < igc-carousel-slide >
1064+ < span > 1</ span >
1065+ </ igc-carousel-slide >
1066+ < igc-carousel-slide >
1067+ < span > 2</ span >
1068+ </ igc-carousel-slide >
1069+ </ igc-carousel > `
1070+ ) ;
1071+
1072+ carouselSlidesContainer = carousel . shadowRoot ?. querySelector (
1073+ 'div[aria-live="polite"]'
1074+ ) as Element ;
1075+
1076+ const eventSpy = spy ( carousel , 'emitEvent' ) ;
1077+
1078+ const prevStub = stub ( carousel , 'prev' ) ;
1079+ const nextStub = stub ( carousel , 'next' ) ;
1080+
1081+ prevStub . resolves ( false ) ;
1082+ nextStub . onFirstCall ( ) . resolves ( true ) . onSecondCall ( ) . resolves ( false ) ;
1083+
1084+ carousel . disableLoop = true ;
1085+ await elementUpdated ( carousel ) ;
1086+
1087+ expect ( carousel . current ) . to . equal ( 0 ) ;
1088+
1089+ // swipe right - disabled
1090+ simulatePointerDown ( carouselSlidesContainer ) ;
1091+ simulatePointerMove ( carouselSlidesContainer , { } , { x : 100 } , 10 ) ;
1092+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1093+ await slideChangeComplete ( slides [ 0 ] , slides [ 2 ] ) ;
1094+
1095+ // swipe left
1096+ simulatePointerDown ( carouselSlidesContainer ) ;
1097+ simulatePointerMove ( carouselSlidesContainer , { } , { x : - 100 } , 10 ) ;
1098+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1099+ await slideChangeComplete ( slides [ 0 ] , slides [ 1 ] ) ;
1100+
1101+ // swipe left - disabled
1102+ simulatePointerDown ( carouselSlidesContainer ) ;
1103+ simulatePointerMove ( carouselSlidesContainer , { } , { x : - 100 } , 10 ) ;
1104+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1105+ await slideChangeComplete ( slides [ 0 ] , slides [ 1 ] ) ;
1106+
1107+ expect ( eventSpy . callCount ) . to . equal ( 1 ) ;
1108+
1109+ eventSpy . resetHistory ( ) ;
1110+ prevStub . resetHistory ( ) ;
1111+ nextStub . resetHistory ( ) ;
1112+
1113+ prevStub . resolves ( false ) ;
1114+ nextStub . onFirstCall ( ) . resolves ( true ) . onSecondCall ( ) . resolves ( false ) ;
1115+
1116+ carousel . vertical = true ;
1117+ await elementUpdated ( carousel ) ;
1118+
1119+ expect ( eventSpy . callCount ) . to . equal ( 0 ) ;
1120+
1121+ // swipe down - disabled
1122+ simulatePointerDown ( carouselSlidesContainer ) ;
1123+ simulatePointerMove ( carouselSlidesContainer , { } , { y : 100 } , 10 ) ;
1124+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1125+ await slideChangeComplete ( slides [ 2 ] , slides [ 0 ] ) ;
1126+
1127+ // swipe up
1128+ simulatePointerDown ( carouselSlidesContainer ) ;
1129+ simulatePointerMove ( carouselSlidesContainer , { } , { y : - 100 } , 10 ) ;
1130+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1131+ await slideChangeComplete ( slides [ 2 ] , slides [ 1 ] ) ;
1132+
1133+ // swipe up - disabled
1134+ simulatePointerDown ( carouselSlidesContainer ) ;
1135+ simulatePointerMove ( carouselSlidesContainer , { } , { y : - 100 } , 10 ) ;
1136+ simulateLostPointerCapture ( carouselSlidesContainer ) ;
1137+ await slideChangeComplete ( slides [ 1 ] , slides [ 0 ] ) ;
1138+
1139+ expect ( eventSpy . callCount ) . to . equal ( 1 ) ;
1140+ } ) ;
10241141 } ) ;
10251142 } ) ;
10261143} ) ;
0 commit comments