@@ -5,6 +5,7 @@ import {ComponentFixture, fakeAsync, flushMicrotasks, TestBed, tick} from '@angu
55import { FormControl , FormsModule , NgModel , ReactiveFormsModule } from '@angular/forms' ;
66import { defaultRippleAnimationConfig } from '@angular/material/core' ;
77import { By , HAMMER_GESTURE_CONFIG } from '@angular/platform-browser' ;
8+ import { BidiModule , Direction } from '@angular/cdk/bidi' ;
89import { TestGestureConfig } from '../slider/test-gesture-config' ;
910import { MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS } from './slide-toggle-config' ;
1011import { MatSlideToggle , MatSlideToggleChange , MatSlideToggleModule } from './index' ;
@@ -18,7 +19,7 @@ describe('MatSlideToggle without forms', () => {
1819 mutationObserverCallbacks = [ ] ;
1920
2021 TestBed . configureTestingModule ( {
21- imports : [ MatSlideToggleModule ] ,
22+ imports : [ MatSlideToggleModule , BidiModule ] ,
2223 declarations : [
2324 SlideToggleBasic ,
2425 SlideToggleWithTabindexAttr ,
@@ -493,6 +494,29 @@ describe('MatSlideToggle without forms', () => {
493494 expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
494495 } ) ) ;
495496
497+ it ( 'should drag from start to end in RTL' , fakeAsync ( ( ) => {
498+ testComponent . direction = 'rtl' ;
499+ fixture . detectChanges ( ) ;
500+
501+ expect ( slideToggle . checked ) . toBe ( false ) ;
502+
503+ gestureConfig . emitEventForElement ( 'slidestart' , slideThumbContainer ) ;
504+
505+ expect ( slideThumbContainer . classList ) . toContain ( 'mat-dragging' ) ;
506+
507+ gestureConfig . emitEventForElement ( 'slide' , slideThumbContainer , {
508+ deltaX : - 200 // Arbitrary, large delta that will be clamped to the end of the slide-toggle.
509+ } ) ;
510+
511+ gestureConfig . emitEventForElement ( 'slideend' , slideThumbContainer ) ;
512+
513+ // Flush the timeout for the slide ending.
514+ tick ( ) ;
515+
516+ expect ( slideToggle . checked ) . toBe ( true ) ;
517+ expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
518+ } ) ) ;
519+
496520 it ( 'should drag from end to start' , fakeAsync ( ( ) => {
497521 slideToggle . checked = true ;
498522
@@ -513,6 +537,29 @@ describe('MatSlideToggle without forms', () => {
513537 expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
514538 } ) ) ;
515539
540+ it ( 'should drag from end to start in RTL' , fakeAsync ( ( ) => {
541+ testComponent . direction = 'rtl' ;
542+ fixture . detectChanges ( ) ;
543+
544+ slideToggle . checked = true ;
545+
546+ gestureConfig . emitEventForElement ( 'slidestart' , slideThumbContainer ) ;
547+
548+ expect ( slideThumbContainer . classList ) . toContain ( 'mat-dragging' ) ;
549+
550+ gestureConfig . emitEventForElement ( 'slide' , slideThumbContainer , {
551+ deltaX : 200 // Arbitrary, large delta that will be clamped to the end of the slide-toggle.
552+ } ) ;
553+
554+ gestureConfig . emitEventForElement ( 'slideend' , slideThumbContainer ) ;
555+
556+ // Flush the timeout for the slide ending.
557+ tick ( ) ;
558+
559+ expect ( slideToggle . checked ) . toBe ( false ) ;
560+ expect ( slideThumbContainer . classList ) . not . toContain ( 'mat-dragging' ) ;
561+ } ) ) ;
562+
516563 it ( 'should not drag when disabled' , fakeAsync ( ( ) => {
517564 slideToggle . disabled = true ;
518565
@@ -943,7 +990,7 @@ describe('MatSlideToggle with forms', () => {
943990
944991@Component ( {
945992 template : `
946- <mat-slide-toggle [required]="isRequired"
993+ <mat-slide-toggle [dir]="direction" [ required]="isRequired"
947994 [disabled]="isDisabled"
948995 [color]="slideColor"
949996 [id]="slideId"
@@ -976,6 +1023,7 @@ class SlideToggleBasic {
9761023 labelPosition : string ;
9771024 toggleTriggered : number = 0 ;
9781025 dragTriggered : number = 0 ;
1026+ direction : Direction = 'ltr' ;
9791027
9801028 onSlideClick : ( event ?: Event ) => void = ( ) => { } ;
9811029 onSlideChange = ( event : MatSlideToggleChange ) => this . lastEvent = event ;
0 commit comments