@@ -9,7 +9,7 @@ describe('MdSlideToggle', () => {
99 beforeEach ( async ( ( ) => {
1010 TestBed . configureTestingModule ( {
1111 imports : [ MdSlideToggleModule , FormsModule ] ,
12- declarations : [ SlideToggleTestApp ] ,
12+ declarations : [ SlideToggleTestApp , SlideToggleFormsTestApp ] ,
1313 } ) ;
1414
1515 TestBed . compileComponents ( ) ;
@@ -332,6 +332,18 @@ describe('MdSlideToggle', () => {
332332 expect ( slideToggleElement . classList ) . toContain ( 'md-slide-toggle-focused' ) ;
333333 } ) ;
334334
335+ it ( 'should forward the required attribute' , ( ) => {
336+ testComponent . isRequired = true ;
337+ fixture . detectChanges ( ) ;
338+
339+ expect ( inputElement . required ) . toBe ( true ) ;
340+
341+ testComponent . isRequired = false ;
342+ fixture . detectChanges ( ) ;
343+
344+ expect ( inputElement . required ) . toBe ( false ) ;
345+ } ) ;
346+
335347 } ) ;
336348
337349 describe ( 'custom template' , ( ) => {
@@ -345,6 +357,44 @@ describe('MdSlideToggle', () => {
345357 } ) ) ;
346358 } ) ;
347359
360+ describe ( 'with forms' , ( ) => {
361+
362+ let fixture : ComponentFixture < any > ;
363+ let testComponent : SlideToggleFormsTestApp ;
364+ let buttonElement : HTMLButtonElement ;
365+ let labelElement : HTMLLabelElement ;
366+
367+ // This initialization is async() because it needs to wait for ngModel to set the initial value.
368+ beforeEach ( async ( ( ) => {
369+ fixture = TestBed . createComponent ( SlideToggleFormsTestApp ) ;
370+
371+ testComponent = fixture . debugElement . componentInstance ;
372+
373+ fixture . detectChanges ( ) ;
374+
375+ buttonElement = fixture . debugElement . query ( By . css ( 'button' ) ) . nativeElement ;
376+ labelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
377+ } ) ) ;
378+
379+ it ( 'should prevent the form from submit when being required' , async ( ( ) => {
380+
381+ let fixture = TestBed . createComponent ( SlideToggleFormsTestApp ) ;
382+
383+ fixture . detectChanges ( ) ;
384+
385+ buttonElement . click ( ) ;
386+ expect ( testComponent . isSubmitted ) . toBe ( false ) ;
387+
388+ // Make the form valid by setting the slide-toggle to true.
389+ labelElement . click ( ) ;
390+ fixture . detectChanges ( ) ;
391+
392+ buttonElement . click ( ) ;
393+ expect ( testComponent . isSubmitted ) . toBe ( true ) ;
394+ } ) ) ;
395+
396+ } )
397+
348398} ) ;
349399
350400/**
@@ -361,16 +411,25 @@ function dispatchFocusChangeEvent(eventName: string, element: HTMLElement): void
361411@Component ( {
362412 selector : 'slide-toggle-test-app' ,
363413 template : `
364- <md-slide-toggle [(ngModel)]="slideModel" [disabled]="isDisabled" [color]="slideColor"
365- [id]="slideId" [checked]="slideChecked" [name]="slideName"
366- [ariaLabel]="slideLabel" [ariaLabelledby]="slideLabelledBy"
367- (change)="onSlideChange($event)"
414+ <md-slide-toggle [(ngModel)]="slideModel"
415+ [required]="isRequired"
416+ [disabled]="isDisabled"
417+ [color]="slideColor"
418+ [id]="slideId"
419+ [checked]="slideChecked"
420+ [name]="slideName"
421+ [ariaLabel]="slideLabel"
422+ [ariaLabelledby]="slideLabelledBy"
423+ (change)="onSlideChange($event)"
368424 (click)="onSlideClick($event)">
425+
369426 <span>Test Slide Toggle</span>
427+
370428 </md-slide-toggle>` ,
371429} )
372430class SlideToggleTestApp {
373431 isDisabled : boolean = false ;
432+ isRequired : boolean = false ;
374433 slideModel : boolean = false ;
375434 slideChecked : boolean = false ;
376435 slideColor : string ;
@@ -385,3 +444,16 @@ class SlideToggleTestApp {
385444 this . lastEvent = event ;
386445 }
387446}
447+
448+
449+ @Component ( {
450+ selector : 'slide-toggle-forms-test-app' ,
451+ template : `
452+ <form (ngSubmit)="isSubmitted = true">
453+ <md-slide-toggle name="slideToggle" ngModel required>Required</md-slide-toggle>
454+ <button type="submit"></button>
455+ </form>`
456+ } )
457+ class SlideToggleFormsTestApp {
458+ isSubmitted : boolean = false ;
459+ }
0 commit comments