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
@@ -90,7 +83,7 @@ describe('MatButtonToggle with forms', () => {
90
83
let groupNgModel : NgModel ;
91
84
let buttonToggleLabels : HTMLElement [ ] ;
92
85
93
- beforeEach ( async ( ( ) => {
86
+ beforeEach ( fakeAsync ( ( ) => {
94
87
fixture = TestBed . createComponent ( ButtonToggleGroupWithNgModel ) ;
95
88
fixture . detectChanges ( ) ;
96
89
testComponent = fixture . debugElement . componentInstance ;
@@ -144,7 +137,10 @@ describe('MatButtonToggle with forms', () => {
144
137
for ( let buttonToggle of buttonToggleInstances ) {
145
138
expect ( buttonToggle . checked ) . toBe ( groupInstance . value === buttonToggle . value ) ;
146
139
}
147
- expect ( groupInstance . selected ! . value ) . toBe ( groupInstance . value ) ;
140
+
141
+ const selected = groupInstance . selected as MatButtonToggle ;
142
+
143
+ expect ( selected . value ) . toBe ( groupInstance . value ) ;
148
144
} ) ;
149
145
150
146
it ( 'should have the correct FormControl state initially and after interaction' ,
@@ -208,7 +204,7 @@ describe('MatButtonToggle with forms', () => {
208
204
209
205
describe ( 'MatButtonToggle without forms' , ( ) => {
210
206
211
- beforeEach ( async ( ( ) => {
207
+ beforeEach ( fakeAsync ( ( ) => {
212
208
TestBed . configureTestingModule ( {
213
209
imports : [ MatButtonToggleModule ] ,
214
210
declarations : [
@@ -343,7 +339,6 @@ describe('MatButtonToggle without forms', () => {
343
339
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
344
340
buttonToggleInstances [ 0 ] . change . subscribe ( changeSpy ) ;
345
341
346
-
347
342
buttonToggleLabelElements [ 0 ] . click ( ) ;
348
343
fixture . detectChanges ( ) ;
349
344
tick ( ) ;
@@ -417,14 +412,16 @@ describe('MatButtonToggle without forms', () => {
417
412
418
413
fixture . detectChanges ( ) ;
419
414
415
+ // Note that we cast to a boolean, because the event has some circular references
416
+ // which will crash the runner when Jasmine attempts to stringify them.
417
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
420
418
expect ( groupInstance . value ) . toBe ( 'red' ) ;
421
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
422
419
423
420
groupInstance . value = 'green' ;
424
421
fixture . detectChanges ( ) ;
425
422
423
+ expect ( ! ! testComponent . lastEvent ) . toBe ( false ) ;
426
424
expect ( groupInstance . value ) . toBe ( 'green' ) ;
427
- expect ( testComponent . lastEvent ) . toBeFalsy ( ) ;
428
425
} ) ;
429
426
430
427
} ) ;
@@ -436,20 +433,19 @@ describe('MatButtonToggle without forms', () => {
436
433
let buttonToggleDebugElements : DebugElement [ ] ;
437
434
let buttonToggleNativeElements : HTMLElement [ ] ;
438
435
let buttonToggleLabelElements : HTMLLabelElement [ ] ;
439
- let groupInstance : MatButtonToggleGroupMultiple ;
436
+ let groupInstance : MatButtonToggleGroup ;
440
437
let buttonToggleInstances : MatButtonToggle [ ] ;
441
438
let testComponent : ButtonTogglesInsideButtonToggleGroupMultiple ;
442
439
443
- beforeEach ( async ( ( ) => {
440
+ beforeEach ( fakeAsync ( ( ) => {
444
441
fixture = TestBed . createComponent ( ButtonTogglesInsideButtonToggleGroupMultiple ) ;
445
442
fixture . detectChanges ( ) ;
446
443
447
444
testComponent = fixture . debugElement . componentInstance ;
448
445
449
- groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ;
446
+ groupDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggleGroup ) ) ;
450
447
groupNativeElement = groupDebugElement . nativeElement ;
451
- groupInstance = groupDebugElement . injector . get < MatButtonToggleGroupMultiple > (
452
- MatButtonToggleGroupMultiple ) ;
448
+ groupInstance = groupDebugElement . injector . get < MatButtonToggleGroup > ( MatButtonToggleGroup ) ;
453
449
454
450
buttonToggleDebugElements = fixture . debugElement . queryAll ( By . directive ( MatButtonToggle ) ) ;
455
451
buttonToggleNativeElements = buttonToggleDebugElements
@@ -473,16 +469,22 @@ describe('MatButtonToggle without forms', () => {
473
469
let nativeCheckboxLabel = buttonToggleDebugElements [ 0 ] . query ( By . css ( 'label' ) ) . nativeElement ;
474
470
475
471
nativeCheckboxLabel . click ( ) ;
472
+
473
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
476
474
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
477
475
} ) ;
478
476
479
477
it ( 'should allow for multiple toggles to be selected' , ( ) => {
480
478
buttonToggleInstances [ 0 ] . checked = true ;
481
479
fixture . detectChanges ( ) ;
480
+
481
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
482
482
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
483
483
484
484
buttonToggleInstances [ 1 ] . checked = true ;
485
485
fixture . detectChanges ( ) ;
486
+
487
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' , 'flour' ] ) ;
486
488
expect ( buttonToggleInstances [ 1 ] . checked ) . toBe ( true ) ;
487
489
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
488
490
} ) ;
@@ -493,6 +495,7 @@ describe('MatButtonToggle without forms', () => {
493
495
nativeCheckboxInput . click ( ) ;
494
496
fixture . detectChanges ( ) ;
495
497
498
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
496
499
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
497
500
} ) ;
498
501
@@ -505,18 +508,23 @@ describe('MatButtonToggle without forms', () => {
505
508
expect ( groupNativeElement . classList ) . toContain ( 'mat-button-toggle-vertical' ) ;
506
509
} ) ;
507
510
508
- it ( 'should deselect a button toggle when selected twice' , ( ) => {
509
- buttonToggleNativeElements [ 0 ] . click ( ) ;
511
+ it ( 'should deselect a button toggle when selected twice' , fakeAsync ( ( ) => {
512
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
510
513
fixture . detectChanges ( ) ;
514
+ tick ( ) ;
511
515
512
- buttonToggleNativeElements [ 0 ] . click ( ) ;
516
+ expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
517
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
518
+
519
+ buttonToggleLabelElements [ 0 ] . click ( ) ;
513
520
fixture . detectChanges ( ) ;
521
+ tick ( ) ;
514
522
523
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
515
524
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
516
- } ) ;
525
+ } ) ) ;
517
526
518
527
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
519
-
520
528
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( false ) ;
521
529
522
530
let changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
@@ -526,17 +534,29 @@ describe('MatButtonToggle without forms', () => {
526
534
fixture . detectChanges ( ) ;
527
535
tick ( ) ;
528
536
expect ( changeSpy ) . toHaveBeenCalled ( ) ;
537
+ expect ( groupInstance . value ) . toEqual ( [ 'eggs' ] ) ;
529
538
530
539
buttonToggleLabelElements [ 0 ] . click ( ) ;
531
540
fixture . detectChanges ( ) ;
532
541
tick ( ) ;
542
+ expect ( groupInstance . value ) . toEqual ( [ ] ) ;
533
543
534
544
// The default browser behavior is to emit an event, when the value was set
535
545
// to false. That's because the current input type is set to `checkbox` when
536
546
// using the multiple mode.
537
547
expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
538
548
} ) ) ;
539
549
550
+ it ( 'should throw when attempting to assign a non-array value' , ( ) => {
551
+ expect ( ( ) => {
552
+ groupInstance . value = 'not-an-array' ;
553
+ } ) . toThrowError ( / V a l u e m u s t b e a n a r r a y / ) ;
554
+ } ) ;
555
+
556
+ it ( 'should be able to query for the deprecated `MatButtonToggleGroupMultiple`' , ( ) => {
557
+ expect ( fixture . debugElement . query ( By . directive ( MatButtonToggleGroupMultiple ) ) ) . toBeTruthy ( ) ;
558
+ } ) ;
559
+
540
560
} ) ;
541
561
542
562
describe ( 'as standalone' , ( ) => {
@@ -547,19 +567,18 @@ describe('MatButtonToggle without forms', () => {
547
567
let buttonToggleInstance : MatButtonToggle ;
548
568
let testComponent : StandaloneButtonToggle ;
549
569
550
- beforeEach ( async ( ( ) => {
570
+ beforeEach ( fakeAsync ( ( ) => {
551
571
fixture = TestBed . createComponent ( StandaloneButtonToggle ) ;
552
572
fixture . detectChanges ( ) ;
553
573
554
- testComponent = fixture . debugElement . componentInstance ;
555
-
574
+ testComponent = fixture . componentInstance ;
556
575
buttonToggleDebugElement = fixture . debugElement . query ( By . directive ( MatButtonToggle ) ) ;
557
576
buttonToggleNativeElement = buttonToggleDebugElement . nativeElement ;
558
577
buttonToggleLabelElement = fixture . debugElement . query ( By . css ( 'label' ) ) . nativeElement ;
559
578
buttonToggleInstance = buttonToggleDebugElement . componentInstance ;
560
579
} ) ) ;
561
580
562
- it ( 'should toggle when clicked' , ( ) => {
581
+ it ( 'should toggle when clicked' , fakeAsync ( ( ) => {
563
582
buttonToggleLabelElement . click ( ) ;
564
583
565
584
fixture . detectChanges ( ) ;
@@ -570,7 +589,7 @@ describe('MatButtonToggle without forms', () => {
570
589
fixture . detectChanges ( ) ;
571
590
572
591
expect ( buttonToggleInstance . checked ) . toBe ( false ) ;
573
- } ) ;
592
+ } ) ) ;
574
593
575
594
it ( 'should emit a change event for state changes' , fakeAsync ( ( ) => {
576
595
0 commit comments