@@ -9,7 +9,7 @@ describe('MdSlideToggle', () => {
9
9
beforeEach ( async ( ( ) => {
10
10
TestBed . configureTestingModule ( {
11
11
imports : [ MdSlideToggleModule . forRoot ( ) , FormsModule ] ,
12
- declarations : [ SlideToggleTestApp ] ,
12
+ declarations : [ SlideToggleTestApp , SlideToggleFormsTestApp ] ,
13
13
} ) ;
14
14
15
15
TestBed . compileComponents ( ) ;
@@ -318,6 +318,18 @@ describe('MdSlideToggle', () => {
318
318
expect ( slideToggleElement . classList ) . toContain ( 'md-slide-toggle-focused' ) ;
319
319
} ) ;
320
320
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
+
321
333
} ) ;
322
334
323
335
describe ( 'custom template' , ( ) => {
@@ -331,6 +343,55 @@ describe('MdSlideToggle', () => {
331
343
} ) ) ;
332
344
} ) ;
333
345
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
+
334
395
} ) ;
335
396
336
397
/**
@@ -347,16 +408,25 @@ function dispatchFocusChangeEvent(eventName: string, element: HTMLElement): void
347
408
@Component ( {
348
409
selector : 'slide-toggle-test-app' ,
349
410
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)"
354
421
(click)="onSlideClick($event)">
422
+
355
423
<span>Test Slide Toggle</span>
424
+
356
425
</md-slide-toggle>` ,
357
426
} )
358
427
class SlideToggleTestApp {
359
428
isDisabled : boolean = false ;
429
+ isRequired : boolean = false ;
360
430
slideModel : boolean = false ;
361
431
slideChecked : boolean = false ;
362
432
slideColor : string ;
@@ -371,3 +441,17 @@ class SlideToggleTestApp {
371
441
this . lastEvent = event ;
372
442
}
373
443
}
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