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 { NgModel , FormsModule , ReactiveFormsModule , FormControl } from '@angular/forms' ;
9
3
import { Component , DebugElement } from '@angular/core' ;
10
4
import { By } from '@angular/platform-browser' ;
11
5
import {
12
6
MatButtonToggleGroup ,
13
- MatButtonToggle ,
14
7
MatButtonToggleGroupMultiple ,
8
+ MatButtonToggle ,
15
9
MatButtonToggleChange ,
16
10
MatButtonToggleModule ,
17
11
} from './index' ;
18
12
19
-
20
13
describe ( 'MatButtonToggle with forms' , ( ) => {
21
14
22
- beforeEach ( async ( ( ) => {
15
+ beforeEach ( fakeAsync ( ( ) => {
23
16
TestBed . configureTestingModule ( {
24
17
imports : [ MatButtonToggleModule , FormsModule , ReactiveFormsModule ] ,
25
18
declarations : [
@@ -37,7 +30,7 @@ describe('MatButtonToggle with forms', () => {
37
30
let groupInstance : MatButtonToggleGroup ;
38
31
let testComponent : ButtonToggleGroupWithFormControl ;
39
32
40
- beforeEach ( async ( ( ) => {
33
+ beforeEach ( fakeAsync ( ( ) => {
41
34
fixture = TestBed . createComponent ( ButtonToggleGroupWithFormControl ) ;
42
35
fixture . detectChanges ( ) ;
43
36
@@ -89,7 +82,7 @@ describe('MatButtonToggle with forms', () => {
89
82
let groupNgModel : NgModel ;
90
83
let buttonToggleLabels : HTMLElement [ ] ;
91
84
92
- beforeEach ( async ( ( ) => {
85
+ beforeEach ( fakeAsync ( ( ) => {
93
86
fixture = TestBed . createComponent ( ButtonToggleGroupWithNgModel ) ;
94
87
fixture . detectChanges ( ) ;
95
88
testComponent = fixture . debugElement . componentInstance ;
@@ -143,7 +136,10 @@ describe('MatButtonToggle with forms', () => {
143
136
for ( let buttonToggle of buttonToggleInstances ) {
144
137
expect ( buttonToggle . checked ) . toBe ( groupInstance . value === buttonToggle . value ) ;
145
138
}
146
- expect ( groupInstance . selected ! . value ) . toBe ( groupInstance . value ) ;
139
+
140
+ const selected = groupInstance . selected as MatButtonToggle ;
141
+
142
+ expect ( selected . value ) . toBe ( groupInstance . value ) ;
147
143
} ) ;
148
144
149
145
it ( 'should have the correct FormControl state initially and after interaction' ,
@@ -183,7 +179,7 @@ describe('MatButtonToggle with forms', () => {
183
179
184
180
describe ( 'MatButtonToggle without forms' , ( ) => {
185
181
186
- beforeEach ( async ( ( ) => {
182
+ beforeEach ( fakeAsync ( ( ) => {
187
183
TestBed . configureTestingModule ( {
188
184
imports : [ MatButtonToggleModule ] ,
189
185
declarations : [
@@ -318,7 +314,6 @@ describe('MatButtonToggle without forms', () => {
318
314
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
319
315
buttonToggleInstances [ 0 ] . change . subscribe ( changeSpy ) ;
320
316
321
-
322
317
buttonToggleLabelElements [ 0 ] . click ( ) ;
323
318
fixture . detectChanges ( ) ;
324
319
tick ( ) ;
@@ -392,14 +387,16 @@ describe('MatButtonToggle without forms', () => {
392
387
393
388
fixture . detectChanges ( ) ;
394
389
390
+ // Note that we cast to a boolean, because the event has some circular references
391
+ // which will crash the runner when Jasmine attempts to stringify them.
392
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
395
393
expect ( groupInstance . value ) . toBe ( 'red' ) ;
396
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
397
394
398
395
groupInstance . value = 'green' ;
399
396
fixture . detectChanges ( ) ;
400
397
398
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
401
399
expect ( groupInstance . value ) . toBe ( 'green' ) ;
402
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
403
400
} ) ;
404
401
405
402
} ) ;
@@ -411,20 +408,19 @@ describe('MatButtonToggle without forms', () => {
411
408
let buttonToggleDebugElements : DebugElement [ ] ;
412
409
let buttonToggleNativeElements : HTMLElement [ ] ;
413
410
let buttonToggleLabelElements : HTMLLabelElement [ ] ;
414
- let groupInstance : MatButtonToggleGroupMultiple ;
411
+ let groupInstance : MatButtonToggleGroup ;
415
412
let buttonToggleInstances : MatButtonToggle [ ] ;
416
413
let testComponent : ButtonTogglesInsideButtonToggleGroupMultiple ;
417
414
418
- beforeEach ( async ( ( ) => {
415
+ beforeEach ( fakeAsync ( ( ) => {
419
416
fixture = TestBed . createComponent ( ButtonTogglesInsideButtonToggleGroupMultiple ) ;
420
417
fixture . detectChanges ( ) ;
421
418
422
419
testComponent = fixture . debugElement . componentInstance ;
423
420
424
- groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ;
421
+ groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroup ) ) ;
425
422
groupNativeElement = groupDebugElement . nativeElement ;
426
- groupInstance = groupDebugElement . injector . get < MatButtonToggleGroupMultiple > (
427
- MatButtonToggleGroupMultiple ) ;
423
+ groupInstance = groupDebugElement . injector . get < MatButtonToggleGroup > ( MatButtonToggleGroup ) ;
428
424
429
425
buttonToggleDebugElements = fixture . debugElement . queryAll ( By . directive ( MatButtonToggle ) ) ;
430
426
buttonToggleNativeElements = buttonToggleDebugElements
@@ -448,16 +444,22 @@ describe('MatButtonToggle without forms', () => {
448
444
let nativeCheckboxLabel = buttonToggleDebugElements [ 0 ] . query ( By . css ( 'label' ) ) . nativeElement ;
449
445
450
446
nativeCheckboxLabel . click ( ) ;
447
+
448
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
451
449
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
452
450
} ) ;
453
451
454
452
it ( 'should allow for multiple toggles to be selected' , ( ) => {
455
453
buttonToggleInstances [ 0 ] . checked = true ;
456
454
fixture . detectChanges ( ) ;
455
+
456
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
457
457
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
458
458
459
459
buttonToggleInstances [ 1 ] . checked = true ;
460
460
fixture . detectChanges ( ) ;
461
+
462
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' , 'flour' ] ) ;
461
463
expect ( buttonToggleInstances [ 1 ] . checked ) . toBe ( true ) ;
462
464
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
463
465
} ) ;
@@ -468,6 +470,7 @@ describe('MatButtonToggle without forms', () => {
468
470
nativeCheckboxInput . click ( ) ;
469
471
fixture . detectChanges ( ) ;
470
472
473
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
471
474
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
472
475
} ) ;
473
476
@@ -480,18 +483,23 @@ describe('MatButtonToggle without forms', () => {
480
483
expect ( groupNativeElement . classList ) . toContain ( 'mat-button-toggle-vertical' ) ;
481
484
} ) ;
482
485
483
- it ( 'should deselect a button toggle when selected twice' , ( ) => {
484
- buttonToggleNativeElements [ 0 ] . click ( ) ;
486
+ it ( 'should deselect a button toggle when selected twice' , fakeAsync ( ( ) => {
487
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
485
488
fixture . detectChanges ( ) ;
489
+ tick ( ) ;
486
490
487
- buttonToggleNativeElements [ 0 ] . click ( ) ;
491
+ expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
492
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
493
+
494
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
488
495
fixture . detectChanges ( ) ;
496
+ tick ( ) ;
489
497
498
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
490
499
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
491
- } ) ;
500
+ } ) ) ;
492
501
493
502
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
494
-
495
503
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
496
504
497
505
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
@@ -501,17 +509,29 @@ describe('MatButtonToggle without forms', () => {
501
509
fixture . detectChanges ( ) ;
502
510
tick ( ) ;
503
511
expect ( changeSpy ) . toHaveBeenCalled ( ) ;
512
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
504
513
505
514
buttonToggleLabelElements [ 0 ] . click ( ) ;
506
515
fixture . detectChanges ( ) ;
507
516
tick ( ) ;
517
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
508
518
509
519
// The default browser behavior is to emit an event, when the value was set
510
520
// to false. That's because the current input type is set to `checkbox` when
511
521
// using the multiple mode.
512
522
expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
513
523
} ) ) ;
514
524
525
+ it ( 'should throw when attempting to assign a non-array value' , ( ) => {
526
+ expect ( ( ) => {
527
+ groupInstance . value = 'not-an-array' ;
528
+ } ) . toThrowError ( / V a l u e m u s t b e a n a r r a y / ) ;
529
+ } ) ;
530
+
531
+ it ( 'should be able to query for the deprecated `MatButtonToggleGroupMultiple`' , ( ) => {
532
+ expect ( fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ) . toBeTruthy ( ) ;
533
+ } ) ;
534
+
515
535
} ) ;
516
536
517
537
describe ( 'as standalone' , ( ) => {
@@ -522,19 +542,18 @@ describe('MatButtonToggle without forms', () => {
522
542
let buttonToggleInstance : MatButtonToggle ;
523
543
let testComponent : StandaloneButtonToggle ;
524
544
525
- beforeEach ( async ( ( ) => {
545
+ beforeEach ( fakeAsync ( ( ) => {
526
546
fixture = TestBed . createComponent ( StandaloneButtonToggle ) ;
527
547
fixture . detectChanges ( ) ;
528
548
529
- testComponent = fixture . debugElement . componentInstance ;
530
-
549
+ testComponent = fixture . componentInstance ;
531
550
buttonToggleDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggle ) ) ;
532
551
buttonToggleNativeElement = buttonToggleDebugElement . nativeElement ;
533
552
buttonToggleLabelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
534
553
buttonToggleInstance = buttonToggleDebugElement . componentInstance ;
535
554
} ) ) ;
536
555
537
- it ( 'should toggle when clicked' , ( ) => {
556
+ it ( 'should toggle when clicked' , fakeAsync ( ( ) => {
538
557
buttonToggleLabelElement . click ( ) ;
539
558
540
559
fixture . detectChanges ( ) ;
@@ -545,7 +564,7 @@ describe('MatButtonToggle without forms', () => {
545
564
fixture . detectChanges ( ) ;
546
565
547
566
expect ( buttonToggleInstance . checked ) . toBe ( false ) ;
548
- } ) ;
567
+ } ) ) ;
549
568
550
569
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
551
570
0 commit comments