@@ -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,114 @@ 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+ provide : MutationObserverFactory ,
374+ useValue : {
375+ create : ( callback : Function ) => {
376+ mutationObserverCallbacks . push ( callback ) ;
377+ return { observe : ( ) => { } , disconnect : ( ) => { } } ;
378+ }
379+ }
380+ }
381+ ]
382+ } ) ;
383+ const fixture = TestBed . createComponent ( SlideToggleBasic ) ;
384+ const testComponent = fixture . debugElement . componentInstance ;
385+ const slideToggleDebug = fixture . debugElement . query ( By . css ( 'mat-slide-toggle' ) ) ;
386+
387+ const slideToggle = slideToggleDebug . componentInstance ;
388+ const inputElement = fixture . debugElement . query ( By . css ( 'input' ) ) . nativeElement ;
389+ const labelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
390+
391+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
392+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
393+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
394+
395+ labelElement . click ( ) ;
396+ fixture . detectChanges ( ) ;
397+
398+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
399+ expect ( testComponent . toggleTriggered ) . toBe ( 1 , 'Expect toggle once' ) ;
400+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
401+
402+ inputElement . click ( ) ;
403+ fixture . detectChanges ( ) ;
404+
405+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
406+ expect ( testComponent . toggleTriggered ) . toBe ( 2 , 'Expect toggle twice' ) ;
407+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
408+ } ) ) ;
409+
410+ it ( 'should not change value on dragging when drag action is noop' , fakeAsync ( ( ) => {
411+ TestBed
412+ . resetTestingModule ( )
413+ . configureTestingModule ( {
414+ imports : [ MatSlideToggleModule ] ,
415+ declarations : [ SlideToggleBasic ] ,
416+ providers : [
417+ {
418+ provide : HAMMER_GESTURE_CONFIG ,
419+ useFactory : ( ) => gestureConfig = new TestGestureConfig ( )
420+ } ,
421+ { provide : MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS , useValue : { disableDragValue : true } } ,
422+ {
423+ provide : MutationObserverFactory ,
424+ useValue : {
425+ create : ( callback : Function ) => {
426+ mutationObserverCallbacks . push ( callback ) ;
427+ return { observe : ( ) => { } , disconnect : ( ) => { } } ;
428+ }
429+ }
430+ }
431+ ]
432+ } ) ;
433+ const fixture = TestBed . createComponent ( SlideToggleBasic ) ;
434+ const testComponent = fixture . debugElement . componentInstance ;
435+ const slideToggleDebug = fixture . debugElement . query ( By . css ( 'mat-slide-toggle' ) ) ;
436+ const thumbContainerDebug = slideToggleDebug
437+ . query ( By . css ( '.mat-slide-toggle-thumb-container' ) ) ;
438+
439+ const slideThumbContainer = thumbContainerDebug . nativeElement ;
440+ const slideToggle = slideToggleDebug . componentInstance ;
441+
442+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
443+ expect ( testComponent . dragTriggered ) . toBe ( 0 ) ;
444+ expect ( slideToggle . checked ) . toBe ( false ) ;
445+
446+ gestureConfig . emitEventForElement ( 'slidestart' , slideThumbContainer ) ;
447+
448+ expect ( slideThumbContainer . classList ) . toContain ( 'mat-dragging' ) ;
449+
450+ gestureConfig . emitEventForElement ( 'slide' , slideThumbContainer , {
451+ deltaX : 200 // Arbitrary, large delta that will be clamped to the end of the slide-toggle.
452+ } ) ;
453+
454+ gestureConfig . emitEventForElement ( 'slideend' , slideThumbContainer ) ;
455+
456+ // Flush the timeout for the slide ending.
457+ tick ( ) ;
458+
459+ expect ( slideToggle . checked ) . toBe ( false , 'Expect slide toggle value not changed' ) ;
460+ expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
461+ expect ( testComponent . lastEvent ) . toBeUndefined ( ) ;
462+ expect ( testComponent . toggleTriggered ) . toBe ( 0 ) ;
463+ expect ( testComponent . dragTriggered ) . toBe ( 1 , 'Expect drag once' ) ;
464+ } ) ) ;
465+ } ) ;
466+
358467 describe ( 'with dragging' , ( ) => {
359468 let fixture : ComponentFixture < any > ;
360469
@@ -849,6 +958,8 @@ describe('MatSlideToggle with forms', () => {
849958 [tabIndex]="slideTabindex"
850959 [labelPosition]="labelPosition"
851960 [disableRipple]="disableRipple"
961+ (toggleChange)="onSlideToggleChange()"
962+ (dragChange)="onSlideDragChange()"
852963 (change)="onSlideChange($event)"
853964 (click)="onSlideClick($event)">
854965 <span>Test Slide Toggle</span>
@@ -867,9 +978,13 @@ class SlideToggleBasic {
867978 slideTabindex : number ;
868979 lastEvent : MatSlideToggleChange ;
869980 labelPosition : string ;
981+ toggleTriggered : number = 0 ;
982+ dragTriggered : number = 0 ;
870983
871984 onSlideClick : ( event ?: Event ) => void = ( ) => { } ;
872985 onSlideChange = ( event : MatSlideToggleChange ) => this . lastEvent = event ;
986+ onSlideToggleChange = ( ) => this . toggleTriggered ++ ;
987+ onSlideDragChange = ( ) => this . dragTriggered ++ ;
873988}
874989
875990@Component ( {
0 commit comments