@@ -6,6 +6,7 @@ import {FormControl, FormsModule, NgModel, ReactiveFormsModule} from '@angular/f
6
6
import { defaultRippleAnimationConfig } from '@angular/material/core' ;
7
7
import { By , HAMMER_GESTURE_CONFIG } from '@angular/platform-browser' ;
8
8
import { TestGestureConfig } from '../slider/test-gesture-config' ;
9
+ import { MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS } from './slide-toggle-config' ;
9
10
import { MatSlideToggle , MatSlideToggleChange , MatSlideToggleModule } from './index' ;
10
11
11
12
describe ( 'MatSlideToggle without forms' , ( ) => {
@@ -355,6 +356,114 @@ describe('MatSlideToggle without forms', () => {
355
356
} ) ) ;
356
357
} ) ;
357
358
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
+
358
467
describe ( 'with dragging' , ( ) => {
359
468
let fixture : ComponentFixture < any > ;
360
469
@@ -849,6 +958,8 @@ describe('MatSlideToggle with forms', () => {
849
958
[tabIndex]="slideTabindex"
850
959
[labelPosition]="labelPosition"
851
960
[disableRipple]="disableRipple"
961
+ (toggleChange)="onSlideToggleChange()"
962
+ (dragChange)="onSlideDragChange()"
852
963
(change)="onSlideChange($event)"
853
964
(click)="onSlideClick($event)">
854
965
<span>Test Slide Toggle</span>
@@ -867,9 +978,13 @@ class SlideToggleBasic {
867
978
slideTabindex : number ;
868
979
lastEvent : MatSlideToggleChange ;
869
980
labelPosition : string ;
981
+ toggleTriggered : number = 0 ;
982
+ dragTriggered : number = 0 ;
870
983
871
984
onSlideClick : ( event ?: Event ) => void = ( ) => { } ;
872
985
onSlideChange = ( event : MatSlideToggleChange ) => this . lastEvent = event ;
986
+ onSlideToggleChange = ( ) => this . toggleTriggered ++ ;
987
+ onSlideDragChange = ( ) => this . dragTriggered ++ ;
873
988
}
874
989
875
990
@Component ( {
0 commit comments