@@ -151,7 +151,7 @@ describe('MdButtonToggle', () => {
151
151
tick ( ) ;
152
152
153
153
// The default browser behavior is to not emit a change event, when the value was set
154
- // to false. That's why the change event was only triggered once.
154
+ // to false. That's because the current input type is set to `radio`
155
155
expect ( changeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
156
156
} ) ) ;
157
157
@@ -341,6 +341,7 @@ describe('MdButtonToggle', () => {
341
341
let groupNativeElement : HTMLElement ;
342
342
let buttonToggleDebugElements : DebugElement [ ] ;
343
343
let buttonToggleNativeElements : HTMLElement [ ] ;
344
+ let buttonToggleLabelElements : HTMLLabelElement [ ] ;
344
345
let groupInstance : MdButtonToggleGroupMultiple ;
345
346
let buttonToggleInstances : MdButtonToggle [ ] ;
346
347
let testComponent : ButtonTogglesInsideButtonToggleGroupMultiple ;
@@ -357,8 +358,10 @@ describe('MdButtonToggle', () => {
357
358
groupInstance = groupDebugElement . injector . get ( MdButtonToggleGroupMultiple ) ;
358
359
359
360
buttonToggleDebugElements = fixture . debugElement . queryAll ( By . directive ( MdButtonToggle ) ) ;
360
- buttonToggleNativeElements =
361
- buttonToggleDebugElements . map ( debugEl => debugEl . nativeElement ) ;
361
+ buttonToggleNativeElements = buttonToggleDebugElements
362
+ . map ( debugEl => debugEl . nativeElement ) ;
363
+ buttonToggleLabelElements = fixture . debugElement . queryAll ( By . css ( 'label' ) )
364
+ . map ( debugEl => debugEl . nativeElement ) ;
362
365
buttonToggleInstances = buttonToggleDebugElements . map ( debugEl => debugEl . componentInstance ) ;
363
366
} ) ;
364
367
} ) ) ;
@@ -409,12 +412,36 @@ describe('MdButtonToggle', () => {
409
412
410
413
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
411
414
} ) ;
415
+
416
+ it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
417
+
418
+ expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
419
+
420
+ let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
421
+ buttonToggleInstances [ 0 ] . change . subscribe ( changeSpy ) ;
422
+
423
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
424
+ fixture . detectChanges ( ) ;
425
+ tick ( ) ;
426
+ expect ( changeSpy ) . toHaveBeenCalled ( ) ;
427
+
428
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
429
+ fixture . detectChanges ( ) ;
430
+ tick ( ) ;
431
+
432
+ // The default browser behavior is to emit an event, when the value was set
433
+ // to false. That's because the current input type is set to `checkbox` when
434
+ // using the multiple mode.
435
+ expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
436
+ } ) ) ;
437
+
412
438
} ) ;
413
439
414
440
describe ( 'as standalone' , ( ) => {
415
441
let fixture : ComponentFixture < StandaloneButtonToggle > ;
416
442
let buttonToggleDebugElement : DebugElement ;
417
443
let buttonToggleNativeElement : HTMLElement ;
444
+ let buttonToggleLabelElement : HTMLLabelElement ;
418
445
let buttonToggleInstance : MdButtonToggle ;
419
446
let testComponent : StandaloneButtonToggle ;
420
447
@@ -427,24 +454,45 @@ describe('MdButtonToggle', () => {
427
454
428
455
buttonToggleDebugElement = fixture . debugElement . query ( By . directive ( MdButtonToggle ) ) ;
429
456
buttonToggleNativeElement = buttonToggleDebugElement . nativeElement ;
457
+ buttonToggleLabelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
430
458
buttonToggleInstance = buttonToggleDebugElement . componentInstance ;
431
459
} ) ;
432
460
} ) ) ;
433
461
434
462
it ( 'should toggle when clicked' , ( ) => {
435
- let nativeCheckboxLabel = buttonToggleDebugElement . query ( By . css ( 'label' ) ) . nativeElement ;
436
-
437
- nativeCheckboxLabel . click ( ) ;
463
+ buttonToggleLabelElement . click ( ) ;
438
464
439
465
fixture . detectChanges ( ) ;
440
466
441
467
expect ( buttonToggleInstance . checked ) . toBe ( true ) ;
442
468
443
- nativeCheckboxLabel . click ( ) ;
469
+ buttonToggleLabelElement . click ( ) ;
444
470
fixture . detectChanges ( ) ;
445
471
446
472
expect ( buttonToggleInstance . checked ) . toBe ( false ) ;
447
473
} ) ;
474
+
475
+ it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
476
+
477
+ expect ( buttonToggleInstance . checked ) . toBe ( false ) ;
478
+
479
+ let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
480
+ buttonToggleInstance . change . subscribe ( changeSpy ) ;
481
+
482
+ buttonToggleLabelElement . click ( ) ;
483
+ fixture . detectChanges ( ) ;
484
+ tick ( ) ;
485
+ expect ( changeSpy ) . toHaveBeenCalled ( ) ;
486
+
487
+ buttonToggleLabelElement . click ( ) ;
488
+ fixture . detectChanges ( ) ;
489
+ tick ( ) ;
490
+
491
+ // The default browser behavior is to emit an event, when the value was set
492
+ // to false. That's because the current input type is set to `checkbox`.
493
+ expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
494
+ } ) ) ;
495
+
448
496
} ) ;
449
497
} ) ;
450
498
0 commit comments