@@ -6,6 +6,7 @@ import {FormControl, FormsModule, NgModel, ReactiveFormsModule} from '@angular/f
66import { defaultRippleAnimationConfig } from '@angular/material/core' ;
77import { By , HAMMER_GESTURE_CONFIG } from '@angular/platform-browser' ;
88import { TestGestureConfig } from '../slider/test-gesture-config' ;
9+ import { MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS } from './slide-toggle-config' ;
910import { MatSlideToggle , MatSlideToggleChange , MatSlideToggleModule } from './index' ;
1011
1112describe ( 'MatSlideToggle without forms' , ( ) => {
@@ -355,6 +356,96 @@ describe('MatSlideToggle without forms', () => {
355356 } ) ) ;
356357 } ) ;
357358
359+ describe ( 'custom action configuration' , ( ) => {
360+ it ( 'should not change value on click when click action is noop' , fakeAsync ( ( ) => {
361+ TestBed
362+ . resetTestingModule ( )
363+ . configureTestingModule ( {
364+ imports : [ MatSlideToggleModule ] ,
365+ declarations : [ SlideToggleBasic ] ,
366+ providers : [
367+ {
368+ provide : HAMMER_GESTURE_CONFIG ,
369+ useFactory : ( ) => gestureConfig = new TestGestureConfig ( )
370+ } ,
371+ { provide : MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS , useValue : { disableToggleValue : true } } ,
372+ ]
373+ } ) ;
374+ const fixture = TestBed . createComponent ( SlideToggleBasic ) ;
375+ const testComponent = fixture . debugElement . componentInstance ;
376+ const slideToggleDebug = fixture . debugElement . query ( By . css ( 'mat-slide-toggle' ) ) ;
377+
378+ const slideToggle = slideToggleDebug . componentInstance ;
379+ const inputElement = fixture . debugElement . query ( By . css ( 'input' ) ) . nativeElement ;
380+ const labelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
381+
382+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
383+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
384+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
385+
386+ labelElement . click ( ) ;
387+ fixture . detectChanges ( ) ;
388+
389+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
390+ expect ( testComponent . toggleTriggered ) . toBe ( 1 , 'Expect toggle once' ) ;
391+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
392+
393+ inputElement . click ( ) ;
394+ fixture . detectChanges ( ) ;
395+
396+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
397+ expect ( testComponent . toggleTriggered ) . toBe ( 2 , 'Expect toggle twice' ) ;
398+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
399+ } ) ) ;
400+
401+ it ( 'should not change value on dragging when drag action is noop' , fakeAsync ( ( ) => {
402+ TestBed
403+ . resetTestingModule ( )
404+ . configureTestingModule ( {
405+ imports : [ MatSlideToggleModule ] ,
406+ declarations : [ SlideToggleBasic ] ,
407+ providers : [
408+ {
409+ provide : HAMMER_GESTURE_CONFIG ,
410+ useFactory : ( ) => gestureConfig = new TestGestureConfig ( )
411+ } ,
412+ { provide : MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS , useValue : { disableDragValue : true } } ,
413+ ]
414+ } ) ;
415+ const fixture = TestBed . createComponent ( SlideToggleBasic ) ;
416+ const testComponent = fixture . debugElement . componentInstance ;
417+ const slideToggleDebug = fixture . debugElement . query ( By . css ( 'mat-slide-toggle' ) ) ;
418+ const thumbContainerDebug = slideToggleDebug
419+ . query ( By . css ( '.mat-slide-toggle-thumb-container' ) ) ;
420+
421+ const slideThumbContainer = thumbContainerDebug . nativeElement ;
422+ const slideToggle = slideToggleDebug . componentInstance ;
423+
424+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
425+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
426+ expect ( slideToggle . checked ) . toBe ( false ) ;
427+
428+ gestureConfig . emitEventForElement ( 'slidestart' , slideThumbContainer ) ;
429+
430+ expect ( slideThumbContainer . classList ) . toContain ( 'mat-dragging' ) ;
431+
432+ gestureConfig . emitEventForElement ( 'slide' , slideThumbContainer , {
433+ deltaX : 200 // Arbitrary, large delta that will be clamped to the end of the slide-toggle.
434+ } ) ;
435+
436+ gestureConfig . emitEventForElement ( 'slideend' , slideThumbContainer ) ;
437+
438+ // Flush the timeout for the slide ending.
439+ tick ( ) ;
440+
441+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
442+ expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
443+ expect ( testComponent . lastEvent ) . toBeUndefined ( ) ;
444+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
445+ expect ( testComponent . dragTriggered ) . toBe ( 1 , 'Expect drag once' ) ;
446+ } ) ) ;
447+ } ) ;
448+
358449 describe ( 'with dragging' , ( ) => {
359450 let fixture : ComponentFixture < any > ;
360451
@@ -849,6 +940,8 @@ describe('MatSlideToggle with forms', () => {
849940 [tabIndex]="slideTabindex"
850941 [labelPosition]="labelPosition"
851942 [disableRipple]="disableRipple"
943+ (toggleChange)="onSlideToggleChange()"
944+ (dragChange)="onSlideDragChange()"
852945 (change)="onSlideChange($event)"
853946 (click)="onSlideClick($event)">
854947 <span>Test Slide Toggle</span>
@@ -867,9 +960,13 @@ class SlideToggleBasic {
867960 slideTabindex : number ;
868961 lastEvent : MatSlideToggleChange ;
869962 labelPosition : string ;
963+ toggleTriggered : number = 0 ;
964+ dragTriggered : number = 0 ;
870965
871966 onSlideClick : ( event ?: Event ) => void = ( ) => { } ;
872967 onSlideChange = ( event : MatSlideToggleChange ) => this . lastEvent = event ;
968+ onSlideToggleChange = ( ) => this . toggleTriggered ++ ;
969+ onSlideDragChange = ( ) => this . dragTriggered ++ ;
873970}
874971
875972@Component ( {
0 commit comments