@@ -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,96 @@ 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
+ } ) ;
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
+
358
449
describe ( 'with dragging' , ( ) => {
359
450
let fixture : ComponentFixture < any > ;
360
451
@@ -849,6 +940,8 @@ describe('MatSlideToggle with forms', () => {
849
940
[tabIndex]="slideTabindex"
850
941
[labelPosition]="labelPosition"
851
942
[disableRipple]="disableRipple"
943
+ (toggleChange)="onSlideToggleChange()"
944
+ (dragChange)="onSlideDragChange()"
852
945
(change)="onSlideChange($event)"
853
946
(click)="onSlideClick($event)">
854
947
<span>Test Slide Toggle</span>
@@ -867,9 +960,13 @@ class SlideToggleBasic {
867
960
slideTabindex : number ;
868
961
lastEvent : MatSlideToggleChange ;
869
962
labelPosition : string ;
963
+ toggleTriggered : number = 0 ;
964
+ dragTriggered : number = 0 ;
870
965
871
966
onSlideClick : ( event ?: Event ) => void = ( ) => { } ;
872
967
onSlideChange = ( event : MatSlideToggleChange ) => this . lastEvent = event ;
968
+ onSlideToggleChange = ( ) => this . toggleTriggered ++ ;
969
+ onSlideDragChange = ( ) => this . dragTriggered ++ ;
873
970
}
874
971
875
972
@Component ( {
0 commit comments