@@ -9,7 +9,7 @@ describe('MdSlideToggle', () => {
99 beforeEach ( async ( ( ) => {
1010 TestBed . configureTestingModule ( {
1111 imports : [ MdSlideToggleModule . forRoot ( ) , FormsModule ] ,
12- declarations : [ SlideToggleTestApp ] ,
12+ declarations : [ SlideToggleTestApp , SlideToggleFormsTestApp ] ,
1313 } ) ;
1414
1515 TestBed . compileComponents ( ) ;
@@ -318,6 +318,18 @@ describe('MdSlideToggle', () => {
318318 expect ( slideToggleElement . classList ) . toContain ( 'md-slide-toggle-focused' ) ;
319319 } ) ;
320320
321+ it ( 'should forward the required attribute' , ( ) => {
322+ testComponent . isRequired = true ;
323+ fixture . detectChanges ( ) ;
324+
325+ expect ( inputElement . required ) . toBe ( true ) ;
326+
327+ testComponent . isRequired = false ;
328+ fixture . detectChanges ( ) ;
329+
330+ expect ( inputElement . required ) . toBe ( false ) ;
331+ } ) ;
332+
321333 } ) ;
322334
323335 describe ( 'custom template' , ( ) => {
@@ -331,6 +343,55 @@ describe('MdSlideToggle', () => {
331343 } ) ) ;
332344 } ) ;
333345
346+ describe ( 'with forms' , ( ) => {
347+
348+ let fixture : ComponentFixture < any > ;
349+ let testComponent : SlideToggleFormsTestApp ;
350+ let buttonElement : HTMLButtonElement ;
351+ let labelElement : HTMLLabelElement ;
352+ let inputElement : HTMLInputElement ;
353+
354+ // This initialization is async() because it needs to wait for ngModel to set the initial value.
355+ beforeEach ( async ( ( ) => {
356+ fixture = TestBed . createComponent ( SlideToggleFormsTestApp ) ;
357+
358+ testComponent = fixture . debugElement . componentInstance ;
359+
360+ fixture . detectChanges ( ) ;
361+
362+ buttonElement = fixture . debugElement . query ( By . css ( 'button' ) ) . nativeElement ;
363+ labelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
364+ inputElement = fixture . debugElement . query ( By . css ( 'input' ) ) . nativeElement ;
365+ } ) ) ;
366+
367+ it ( 'should prevent the form from submit when being required' , ( ) => {
368+
369+ if ( 'reportValidity' in inputElement === false ) {
370+ // If the browser does not report the validity then the tests will break.
371+ // e.g Safari 8 on Mobile.
372+ return ;
373+ }
374+
375+ testComponent . isRequired = true ;
376+
377+ fixture . detectChanges ( ) ;
378+
379+ buttonElement . click ( ) ;
380+ fixture . detectChanges ( ) ;
381+
382+ expect ( testComponent . isSubmitted ) . toBe ( false ) ;
383+
384+ testComponent . isRequired = false ;
385+ fixture . detectChanges ( ) ;
386+
387+ buttonElement . click ( ) ;
388+ fixture . detectChanges ( ) ;
389+
390+ expect ( testComponent . isSubmitted ) . toBe ( true ) ;
391+ } ) ;
392+
393+ } ) ;
394+
334395} ) ;
335396
336397/**
@@ -347,16 +408,25 @@ function dispatchFocusChangeEvent(eventName: string, element: HTMLElement): void
347408@Component ( {
348409 selector : 'slide-toggle-test-app' ,
349410 template : `
350- <md-slide-toggle [(ngModel)]="slideModel" [disabled]="isDisabled" [color]="slideColor"
351- [id]="slideId" [checked]="slideChecked" [name]="slideName"
352- [ariaLabel]="slideLabel" [ariaLabelledby]="slideLabelledBy"
353- (change)="onSlideChange($event)"
411+ <md-slide-toggle [(ngModel)]="slideModel"
412+ [required]="isRequired"
413+ [disabled]="isDisabled"
414+ [color]="slideColor"
415+ [id]="slideId"
416+ [checked]="slideChecked"
417+ [name]="slideName"
418+ [ariaLabel]="slideLabel"
419+ [ariaLabelledby]="slideLabelledBy"
420+ (change)="onSlideChange($event)"
354421 (click)="onSlideClick($event)">
422+
355423 <span>Test Slide Toggle</span>
424+
356425 </md-slide-toggle>` ,
357426} )
358427class SlideToggleTestApp {
359428 isDisabled : boolean = false ;
429+ isRequired : boolean = false ;
360430 slideModel : boolean = false ;
361431 slideChecked : boolean = false ;
362432 slideColor : string ;
@@ -371,3 +441,17 @@ class SlideToggleTestApp {
371441 this . lastEvent = event ;
372442 }
373443}
444+
445+
446+ @Component ( {
447+ selector : 'slide-toggle-forms-test-app' ,
448+ template : `
449+ <form (ngSubmit)="isSubmitted = true">
450+ <md-slide-toggle name="slide" ngModel [required]="isRequired">Required</md-slide-toggle>
451+ <button type="submit"></button>
452+ </form>`
453+ } )
454+ class SlideToggleFormsTestApp {
455+ isSubmitted : boolean = false ;
456+ isRequired : boolean = false ;
457+ }
0 commit comments