1
- import { async , ComponentFixture , TestBed } from '@angular/core/testing' ;
2
- import { Component } from '@angular/core' ;
1
+ import { async , ComponentFixture , TestBed , inject } from '@angular/core/testing' ;
2
+ import { Component , Renderer } from '@angular/core' ;
3
3
import { StyleModule } from './index' ;
4
4
import { By } from '@angular/platform-browser' ;
5
5
import { TAB } from '../keyboard/keycodes' ;
6
+ import { FocusOriginMonitor } from './focus-classes' ;
7
+
8
+
9
+ describe ( 'FocusOriginMonitor' , ( ) => {
10
+ let fixture : ComponentFixture < PlainButton > ;
11
+ let buttonElement : HTMLElement ;
12
+ let buttonRenderer : Renderer ;
13
+ let focusOriginMonitor : FocusOriginMonitor ;
14
+
15
+ beforeEach ( async ( ( ) => {
16
+ TestBed . configureTestingModule ( {
17
+ imports : [ StyleModule ] ,
18
+ declarations : [
19
+ PlainButton ,
20
+ ] ,
21
+ } ) ;
22
+
23
+ TestBed . compileComponents ( ) ;
24
+ } ) ) ;
25
+
26
+ beforeEach ( inject ( [ FocusOriginMonitor ] , ( fom : FocusOriginMonitor ) => {
27
+ fixture = TestBed . createComponent ( PlainButton ) ;
28
+ fixture . detectChanges ( ) ;
29
+
30
+ buttonElement = fixture . debugElement . query ( By . css ( 'button' ) ) . nativeElement ;
31
+ buttonRenderer = fixture . componentInstance . renderer ;
32
+ focusOriginMonitor = fom ;
33
+
34
+ focusOriginMonitor . registerElementForFocusClasses ( buttonElement , buttonRenderer ) ;
35
+ } ) ) ;
36
+
37
+ it ( 'manually registered element should receive focus classes' , ( ) => {
38
+ buttonElement . focus ( ) ;
39
+ fixture . detectChanges ( ) ;
40
+
41
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
42
+ . toBe ( true , 'button should have cdk-focused class' ) ;
43
+ } ) ;
44
+
45
+ it ( 'should detect focus via keyboard' , ( ) => {
46
+ // Simulate focus via keyboard.
47
+ dispatchKeydownEvent ( document , TAB ) ;
48
+ buttonElement . focus ( ) ;
49
+ fixture . detectChanges ( ) ;
50
+
51
+ expect ( buttonElement . classList . length )
52
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
53
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
54
+ . toBe ( true , 'button should have cdk-focused class' ) ;
55
+ expect ( buttonElement . classList . contains ( 'cdk-keyboard-focused' ) )
56
+ . toBe ( true , 'button should have cdk-keyboard-focused class' ) ;
57
+ } ) ;
58
+
59
+ it ( 'should detect focus via mouse' , ( ) => {
60
+ // Simulate focus via mouse.
61
+ dispatchMousedownEvent ( document ) ;
62
+ buttonElement . focus ( ) ;
63
+ fixture . detectChanges ( ) ;
64
+
65
+ expect ( buttonElement . classList . length )
66
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
67
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
68
+ . toBe ( true , 'button should have cdk-focused class' ) ;
69
+ expect ( buttonElement . classList . contains ( 'cdk-mouse-focused' ) )
70
+ . toBe ( true , 'button should have cdk-mouse-focused class' ) ;
71
+ } ) ;
72
+
73
+ it ( 'should detect programmatic focus' , ( ) => {
74
+ // Programmatically focus.
75
+ buttonElement . focus ( ) ;
76
+ fixture . detectChanges ( ) ;
77
+
78
+ expect ( buttonElement . classList . length )
79
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
80
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
81
+ . toBe ( true , 'button should have cdk-focused class' ) ;
82
+ expect ( buttonElement . classList . contains ( 'cdk-program-focused' ) )
83
+ . toBe ( true , 'button should have cdk-program-focused class' ) ;
84
+ } ) ;
85
+
86
+ it ( 'focusVia keyboard should simulate keyboard focus' , ( ) => {
87
+ focusOriginMonitor . focusVia ( buttonElement , buttonRenderer , 'keyboard' ) ;
88
+ fixture . detectChanges ( ) ;
89
+
90
+ expect ( buttonElement . classList . length )
91
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
92
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
93
+ . toBe ( true , 'button should have cdk-focused class' ) ;
94
+ expect ( buttonElement . classList . contains ( 'cdk-keyboard-focused' ) )
95
+ . toBe ( true , 'button should have cdk-keyboard-focused class' ) ;
96
+ } ) ;
97
+
98
+ it ( 'focusVia mouse should simulate mouse focus' , ( ) => {
99
+ focusOriginMonitor . focusVia ( buttonElement , buttonRenderer , 'mouse' ) ;
100
+ fixture . detectChanges ( ) ;
101
+
102
+ expect ( buttonElement . classList . length )
103
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
104
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
105
+ . toBe ( true , 'button should have cdk-focused class' ) ;
106
+ expect ( buttonElement . classList . contains ( 'cdk-mouse-focused' ) )
107
+ . toBe ( true , 'button should have cdk-mouse-focused class' ) ;
108
+ } ) ;
109
+
110
+ it ( 'focusVia program should simulate programmatic focus' , ( ) => {
111
+ focusOriginMonitor . focusVia ( buttonElement , buttonRenderer , 'program' ) ;
112
+ fixture . detectChanges ( ) ;
113
+
114
+ expect ( buttonElement . classList . length )
115
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
116
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
117
+ . toBe ( true , 'button should have cdk-focused class' ) ;
118
+ expect ( buttonElement . classList . contains ( 'cdk-program-focused' ) )
119
+ . toBe ( true , 'button should have cdk-program-focused class' ) ;
120
+ } ) ;
121
+ } ) ;
6
122
7
123
8
124
describe ( 'cdkFocusClasses' , ( ) => {
125
+ let fixture : ComponentFixture < ButtonWithFocusClasses > ;
126
+ let buttonElement : HTMLElement ;
127
+
9
128
beforeEach ( async ( ( ) => {
10
129
TestBed . configureTestingModule ( {
11
130
imports : [ StyleModule ] ,
@@ -17,77 +136,66 @@ describe('cdkFocusClasses', () => {
17
136
TestBed . compileComponents ( ) ;
18
137
} ) ) ;
19
138
20
- describe ( 'cdkFocusClasses' , ( ) => {
21
- let fixture : ComponentFixture < ButtonWithFocusClasses > ;
22
- let buttonElement : HTMLElement ;
139
+ beforeEach ( ( ) => {
140
+ fixture = TestBed . createComponent ( ButtonWithFocusClasses ) ;
141
+ fixture . detectChanges ( ) ;
23
142
24
- beforeEach ( ( ) => {
25
- fixture = TestBed . createComponent ( ButtonWithFocusClasses ) ;
26
- fixture . detectChanges ( ) ;
143
+ buttonElement = fixture . debugElement . query ( By . css ( 'button' ) ) . nativeElement ;
144
+ } ) ;
27
145
28
- buttonElement = fixture . debugElement . query ( By . css ( 'button' ) ) . nativeElement ;
29
- } ) ;
146
+ it ( 'should initially not be focused' , ( ) => {
147
+ expect ( buttonElement . classList . length ) . toBe ( 0 , 'button should not have focus classes' ) ;
148
+ } ) ;
30
149
31
- it ( 'should initially not be focused' , ( ) => {
32
- expect ( buttonElement . classList . length ) . toBe ( 0 , 'button should not have focus classes' ) ;
33
- } ) ;
150
+ it ( 'should detect focus via keyboard' , ( ) => {
151
+ // Simulate focus via keyboard.
152
+ dispatchKeydownEvent ( document , TAB ) ;
153
+ buttonElement . focus ( ) ;
154
+ fixture . detectChanges ( ) ;
155
+
156
+ expect ( buttonElement . classList . length )
157
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
158
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
159
+ . toBe ( true , 'button should have cdk-focused class' ) ;
160
+ expect ( buttonElement . classList . contains ( 'cdk-keyboard-focused' ) )
161
+ . toBe ( true , 'button should have cdk-keyboard-focused class' ) ;
162
+ } ) ;
34
163
35
- it ( 'should detect focus via keyboard' , async ( ( ) => {
36
- // Simulate focus via keyboard.
37
- dispatchKeydownEvent ( document , TAB ) ;
38
- buttonElement . focus ( ) ;
39
- fixture . detectChanges ( ) ;
40
-
41
- setTimeout ( ( ) => {
42
- fixture . detectChanges ( ) ;
43
-
44
- expect ( buttonElement . classList . length )
45
- . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
46
- expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
47
- . toBe ( true , 'button should have cdk-focused class' ) ;
48
- expect ( buttonElement . classList . contains ( 'cdk-keyboard-focused' ) )
49
- . toBe ( true , 'button should have cdk-keyboard-focused class' ) ;
50
- } , 0 ) ;
51
- } ) ) ;
52
-
53
- it ( 'should detect focus via mouse' , async ( ( ) => {
54
- // Simulate focus via mouse.
55
- dispatchMousedownEvent ( document ) ;
56
- buttonElement . focus ( ) ;
57
- fixture . detectChanges ( ) ;
58
-
59
- setTimeout ( ( ) => {
60
- fixture . detectChanges ( ) ;
61
-
62
- expect ( buttonElement . classList . length )
63
- . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
64
- expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
65
- . toBe ( true , 'button should have cdk-focused class' ) ;
66
- expect ( buttonElement . classList . contains ( 'cdk-mouse-focused' ) )
67
- . toBe ( true , 'button should have cdk-mouse-focused class' ) ;
68
- } , 0 ) ;
69
- } ) ) ;
70
-
71
- it ( 'should detect programmatic focus' , async ( ( ) => {
72
- // Programmatically focus.
73
- buttonElement . focus ( ) ;
74
- fixture . detectChanges ( ) ;
75
-
76
- setTimeout ( ( ) => {
77
- fixture . detectChanges ( ) ;
78
-
79
- expect ( buttonElement . classList . length )
80
- . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
81
- expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
82
- . toBe ( true , 'button should have cdk-focused class' ) ;
83
- expect ( buttonElement . classList . contains ( 'cdk-programmatically-focused' ) )
84
- . toBe ( true , 'button should have cdk-programmatically-focused class' ) ;
85
- } , 0 ) ;
86
- } ) ) ;
164
+ it ( 'should detect focus via mouse' , ( ) => {
165
+ // Simulate focus via mouse.
166
+ dispatchMousedownEvent ( document ) ;
167
+ buttonElement . focus ( ) ;
168
+ fixture . detectChanges ( ) ;
169
+
170
+ expect ( buttonElement . classList . length )
171
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
172
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
173
+ . toBe ( true , 'button should have cdk-focused class' ) ;
174
+ expect ( buttonElement . classList . contains ( 'cdk-mouse-focused' ) )
175
+ . toBe ( true , 'button should have cdk-mouse-focused class' ) ;
176
+ } ) ;
177
+
178
+ it ( 'should detect programmatic focus' , ( ) => {
179
+ // Programmatically focus.
180
+ buttonElement . focus ( ) ;
181
+ fixture . detectChanges ( ) ;
182
+
183
+ expect ( buttonElement . classList . length )
184
+ . toBe ( 2 , 'button should have exactly 2 focus classes' ) ;
185
+ expect ( buttonElement . classList . contains ( 'cdk-focused' ) )
186
+ . toBe ( true , 'button should have cdk-focused class' ) ;
187
+ expect ( buttonElement . classList . contains ( 'cdk-program-focused' ) )
188
+ . toBe ( true , 'button should have cdk-program-focused class' ) ;
87
189
} ) ;
88
190
} ) ;
89
191
90
192
193
+ @Component ( { template : `<button>focus me!</button>` } )
194
+ class PlainButton {
195
+ constructor ( public renderer : Renderer ) { }
196
+ }
197
+
198
+
91
199
@Component ( { template : `<button cdkFocusClasses>focus me!</button>` } )
92
200
class ButtonWithFocusClasses { }
93
201
0 commit comments