1
- import {
2
- async ,
3
- fakeAsync ,
4
- tick ,
5
- ComponentFixture ,
6
- TestBed ,
7
- } from '@angular/core/testing' ;
1
+ import { fakeAsync , tick , ComponentFixture , TestBed } from '@angular/core/testing' ;
8
2
import { dispatchMouseEvent } from '@angular/cdk/testing' ;
9
3
import { NgModel , FormsModule , ReactiveFormsModule , FormControl } from '@angular/forms' ;
10
4
import { Component , DebugElement } from '@angular/core' ;
11
5
import { By } from '@angular/platform-browser' ;
12
6
import {
13
7
MatButtonToggleGroup ,
14
- MatButtonToggle ,
15
8
MatButtonToggleGroupMultiple ,
9
+ MatButtonToggle ,
16
10
MatButtonToggleChange ,
17
11
MatButtonToggleModule ,
18
12
} from './index' ;
19
13
20
-
21
14
describe ( 'MatButtonToggle with forms' , ( ) => {
22
15
23
- beforeEach ( async ( ( ) => {
16
+ beforeEach ( fakeAsync ( ( ) => {
24
17
TestBed . configureTestingModule ( {
25
18
imports : [ MatButtonToggleModule , FormsModule , ReactiveFormsModule ] ,
26
19
declarations : [
@@ -38,7 +31,7 @@ describe('MatButtonToggle with forms', () => {
38
31
let groupInstance : MatButtonToggleGroup ;
39
32
let testComponent : ButtonToggleGroupWithFormControl ;
40
33
41
- beforeEach ( async ( ( ) => {
34
+ beforeEach ( fakeAsync ( ( ) => {
42
35
fixture = TestBed . createComponent ( ButtonToggleGroupWithFormControl ) ;
43
36
fixture . detectChanges ( ) ;
44
37
@@ -88,7 +81,7 @@ describe('MatButtonToggle with forms', () => {
88
81
let groupNgModel : NgModel ;
89
82
let buttonToggleLabels : HTMLElement [ ] ;
90
83
91
- beforeEach ( async ( ( ) => {
84
+ beforeEach ( fakeAsync ( ( ) => {
92
85
fixture = TestBed . createComponent ( ButtonToggleGroupWithNgModel ) ;
93
86
fixture . detectChanges ( ) ;
94
87
testComponent = fixture . debugElement . componentInstance ;
@@ -139,7 +132,10 @@ describe('MatButtonToggle with forms', () => {
139
132
for ( let buttonToggle of buttonToggleInstances ) {
140
133
expect ( buttonToggle . checked ) . toBe ( groupInstance . value === buttonToggle . value ) ;
141
134
}
142
- expect ( groupInstance . selected ! . value ) . toBe ( groupInstance . value ) ;
135
+
136
+ const selected = groupInstance . selected as MatButtonToggle ;
137
+
138
+ expect ( selected . value ) . toBe ( groupInstance . value ) ;
143
139
} ) ;
144
140
145
141
it ( 'should have the correct FormControl state initially and after interaction' ,
@@ -203,7 +199,7 @@ describe('MatButtonToggle with forms', () => {
203
199
204
200
describe ( 'MatButtonToggle without forms' , ( ) => {
205
201
206
- beforeEach ( async ( ( ) => {
202
+ beforeEach ( fakeAsync ( ( ) => {
207
203
TestBed . configureTestingModule ( {
208
204
imports : [ MatButtonToggleModule ] ,
209
205
declarations : [
@@ -338,7 +334,6 @@ describe('MatButtonToggle without forms', () => {
338
334
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
339
335
buttonToggleInstances [ 0 ] . change . subscribe ( changeSpy ) ;
340
336
341
-
342
337
buttonToggleLabelElements [ 0 ] . click ( ) ;
343
338
fixture . detectChanges ( ) ;
344
339
tick ( ) ;
@@ -412,14 +407,16 @@ describe('MatButtonToggle without forms', () => {
412
407
413
408
fixture . detectChanges ( ) ;
414
409
410
+ // Note that we cast to a boolean, because the event has some circular references
411
+ // which will crash the runner when Jasmine attempts to stringify them.
412
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
415
413
expect ( groupInstance . value ) . toBe ( 'red' ) ;
416
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
417
414
418
415
groupInstance . value = 'green' ;
419
416
fixture . detectChanges ( ) ;
420
417
418
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
421
419
expect ( groupInstance . value ) . toBe ( 'green' ) ;
422
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
423
420
} ) ;
424
421
425
422
} ) ;
@@ -431,20 +428,19 @@ describe('MatButtonToggle without forms', () => {
431
428
let buttonToggleDebugElements : DebugElement [ ] ;
432
429
let buttonToggleNativeElements : HTMLElement [ ] ;
433
430
let buttonToggleLabelElements : HTMLLabelElement [ ] ;
434
- let groupInstance : MatButtonToggleGroupMultiple ;
431
+ let groupInstance : MatButtonToggleGroup ;
435
432
let buttonToggleInstances : MatButtonToggle [ ] ;
436
433
let testComponent : ButtonTogglesInsideButtonToggleGroupMultiple ;
437
434
438
- beforeEach ( async ( ( ) => {
435
+ beforeEach ( fakeAsync ( ( ) => {
439
436
fixture = TestBed . createComponent ( ButtonTogglesInsideButtonToggleGroupMultiple ) ;
440
437
fixture . detectChanges ( ) ;
441
438
442
439
testComponent = fixture . debugElement . componentInstance ;
443
440
444
- groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ;
441
+ groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroup ) ) ;
445
442
groupNativeElement = groupDebugElement . nativeElement ;
446
- groupInstance = groupDebugElement . injector . get < MatButtonToggleGroupMultiple > (
447
- MatButtonToggleGroupMultiple ) ;
443
+ groupInstance = groupDebugElement . injector . get < MatButtonToggleGroup > ( MatButtonToggleGroup ) ;
448
444
449
445
buttonToggleDebugElements = fixture . debugElement . queryAll ( By . directive ( MatButtonToggle ) ) ;
450
446
buttonToggleNativeElements = buttonToggleDebugElements
@@ -468,16 +464,22 @@ describe('MatButtonToggle without forms', () => {
468
464
let nativeCheckboxLabel = buttonToggleDebugElements [ 0 ] . query ( By . css ( 'label' ) ) . nativeElement ;
469
465
470
466
nativeCheckboxLabel . click ( ) ;
467
+
468
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
471
469
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
472
470
} ) ;
473
471
474
472
it ( 'should allow for multiple toggles to be selected' , ( ) => {
475
473
buttonToggleInstances [ 0 ] . checked = true ;
476
474
fixture . detectChanges ( ) ;
475
+
476
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
477
477
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
478
478
479
479
buttonToggleInstances [ 1 ] . checked = true ;
480
480
fixture . detectChanges ( ) ;
481
+
482
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' , 'flour' ] ) ;
481
483
expect ( buttonToggleInstances [ 1 ] . checked ) . toBe ( true ) ;
482
484
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
483
485
} ) ;
@@ -488,6 +490,7 @@ describe('MatButtonToggle without forms', () => {
488
490
nativeCheckboxInput . click ( ) ;
489
491
fixture . detectChanges ( ) ;
490
492
493
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
491
494
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
492
495
} ) ;
493
496
@@ -500,18 +503,23 @@ describe('MatButtonToggle without forms', () => {
500
503
expect ( groupNativeElement . classList ) . toContain ( 'mat-button-toggle-vertical' ) ;
501
504
} ) ;
502
505
503
- it ( 'should deselect a button toggle when selected twice' , ( ) => {
504
- buttonToggleNativeElements [ 0 ] . click ( ) ;
506
+ it ( 'should deselect a button toggle when selected twice' , fakeAsync ( ( ) => {
507
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
505
508
fixture . detectChanges ( ) ;
509
+ tick ( ) ;
506
510
507
- buttonToggleNativeElements [ 0 ] . click ( ) ;
511
+ expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
512
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
513
+
514
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
508
515
fixture . detectChanges ( ) ;
516
+ tick ( ) ;
509
517
518
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
510
519
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
511
- } ) ;
520
+ } ) ) ;
512
521
513
522
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
514
-
515
523
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
516
524
517
525
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
@@ -521,17 +529,29 @@ describe('MatButtonToggle without forms', () => {
521
529
fixture . detectChanges ( ) ;
522
530
tick ( ) ;
523
531
expect ( changeSpy ) . toHaveBeenCalled ( ) ;
532
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
524
533
525
534
buttonToggleLabelElements [ 0 ] . click ( ) ;
526
535
fixture . detectChanges ( ) ;
527
536
tick ( ) ;
537
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
528
538
529
539
// The default browser behavior is to emit an event, when the value was set
530
540
// to false. That's because the current input type is set to `checkbox` when
531
541
// using the multiple mode.
532
542
expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
533
543
} ) ) ;
534
544
545
+ it ( 'should throw when attempting to assign a non-array value' , ( ) => {
546
+ expect ( ( ) => {
547
+ groupInstance . value = 'not-an-array' ;
548
+ } ) . toThrowError ( / V a l u e m u s t b e a n a r r a y / ) ;
549
+ } ) ;
550
+
551
+ it ( 'should be able to query for the deprecated `MatButtonToggleGroupMultiple`' , ( ) => {
552
+ expect ( fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ) . toBeTruthy ( ) ;
553
+ } ) ;
554
+
535
555
} ) ;
536
556
537
557
describe ( 'as standalone' , ( ) => {
@@ -541,7 +561,7 @@ describe('MatButtonToggle without forms', () => {
541
561
let buttonToggleLabelElement : HTMLLabelElement ;
542
562
let buttonToggleInstance : MatButtonToggle ;
543
563
544
- beforeEach ( async ( ( ) => {
564
+ beforeEach ( fakeAsync ( ( ) => {
545
565
fixture = TestBed . createComponent ( StandaloneButtonToggle ) ;
546
566
fixture . detectChanges ( ) ;
547
567
@@ -551,7 +571,7 @@ describe('MatButtonToggle without forms', () => {
551
571
buttonToggleInstance = buttonToggleDebugElement . componentInstance ;
552
572
} ) ) ;
553
573
554
- it ( 'should toggle when clicked' , ( ) => {
574
+ it ( 'should toggle when clicked' , fakeAsync ( ( ) => {
555
575
buttonToggleLabelElement . click ( ) ;
556
576
557
577
fixture . detectChanges ( ) ;
@@ -562,7 +582,7 @@ describe('MatButtonToggle without forms', () => {
562
582
fixture . detectChanges ( ) ;
563
583
564
584
expect ( buttonToggleInstance . checked ) . toBe ( false ) ;
565
- } ) ;
585
+ } ) ) ;
566
586
567
587
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
568
588
0 commit comments