@@ -20,7 +20,7 @@ describe('TabGroup', function() {
20
20
} ) ;
21
21
22
22
describe ( 'with tabbable elements' , function ( ) {
23
- let group , zero , one , two ;
23
+ let group , zero , one , two , currentFocus , skip ;
24
24
25
25
beforeEach ( function ( ) {
26
26
group = new TabGroup ( ) ;
@@ -38,9 +38,25 @@ describe('TabGroup', function() {
38
38
one = root . querySelector ( '#one' ) ;
39
39
two = root . querySelector ( '#two' ) ;
40
40
41
- sinon . stub ( zero , 'focus' ) ;
42
- sinon . stub ( one , 'focus' ) ;
43
- sinon . stub ( two , 'focus' ) ;
41
+ skip = new Set ( ) ;
42
+
43
+ sinon . stub ( zero , 'focus' ) . callsFake ( ( ) => {
44
+ if ( ! skip . has ( zero ) ) {
45
+ currentFocus = zero ;
46
+ }
47
+ } ) ;
48
+ sinon . stub ( one , 'focus' ) . callsFake ( ( ) => {
49
+ if ( ! skip . has ( one ) ) {
50
+ currentFocus = one ;
51
+ }
52
+ } ) ;
53
+ sinon . stub ( two , 'focus' ) . callsFake ( ( ) => {
54
+ if ( ! skip . has ( two ) ) {
55
+ currentFocus = two ;
56
+ }
57
+ } ) ;
58
+
59
+ sinon . stub ( group , 'getCurrentFocus' ) . callsFake ( ( ) => currentFocus ) ;
44
60
} ) ;
45
61
46
62
it ( 'appends elements into a doubly-linked circular list' , function ( ) {
@@ -74,6 +90,13 @@ describe('TabGroup', function() {
74
90
assert . strictEqual ( zero . focus . callCount , 1 ) ;
75
91
} ) ;
76
92
93
+ it ( 'skips elements that do not receive focus when moving forward' , function ( ) {
94
+ skip . add ( one ) ;
95
+
96
+ group . focusAfter ( zero ) ;
97
+ assert . strictEqual ( two . focus . callCount , 1 ) ;
98
+ } ) ;
99
+
77
100
it ( 'is a no-op with unregistered elements' , function ( ) {
78
101
const unregistered = document . createElement ( 'div' ) ;
79
102
@@ -95,6 +118,74 @@ describe('TabGroup', function() {
95
118
group . focusBefore ( one ) ;
96
119
assert . strictEqual ( zero . focus . callCount , 1 ) ;
97
120
} ) ;
121
+
122
+ it ( 'skips elements that do not receive focus when moving backwards' , function ( ) {
123
+ skip . add ( one ) ;
124
+
125
+ group . focusBefore ( two ) ;
126
+ assert . strictEqual ( zero . focus . callCount , 1 ) ;
127
+ } ) ;
128
+
129
+ describe ( 'removing elements' , function ( ) {
130
+ it ( 'is a no-op for elements that are not present' , function ( ) {
131
+ const unregistered = document . createElement ( 'div' ) ;
132
+ group . removeElement ( unregistered ) ;
133
+ } ) ;
134
+
135
+ it ( 'removes the first element' , function ( ) {
136
+ group . removeElement ( zero ) ;
137
+
138
+ // No-op
139
+ group . focusAfter ( zero ) ;
140
+ assert . isFalse ( zero . focus . called ) ;
141
+ assert . isFalse ( one . focus . called ) ;
142
+ assert . isFalse ( two . focus . called ) ;
143
+
144
+ group . focusAfter ( one ) ;
145
+ assert . strictEqual ( two . focus . callCount , 1 ) ;
146
+
147
+ group . focusAfter ( two ) ;
148
+ assert . strictEqual ( one . focus . callCount , 1 ) ;
149
+
150
+ group . focusBefore ( two ) ;
151
+ assert . strictEqual ( one . focus . callCount , 2 ) ;
152
+
153
+ group . focusBefore ( one ) ;
154
+ assert . strictEqual ( two . focus . callCount , 2 ) ;
155
+ } ) ;
156
+
157
+ it ( 'removes an interior element' , function ( ) {
158
+ group . removeElement ( one ) ;
159
+
160
+ group . focusAfter ( zero ) ;
161
+ assert . strictEqual ( two . focus . callCount , 1 ) ;
162
+
163
+ group . focusAfter ( two ) ;
164
+ assert . strictEqual ( zero . focus . callCount , 1 ) ;
165
+
166
+ group . focusBefore ( two ) ;
167
+ assert . strictEqual ( zero . focus . callCount , 2 ) ;
168
+
169
+ group . focusBefore ( zero ) ;
170
+ assert . strictEqual ( two . focus . callCount , 2 ) ;
171
+ } ) ;
172
+
173
+ it ( 'removes the final element' , function ( ) {
174
+ group . removeElement ( two ) ;
175
+
176
+ group . focusAfter ( zero ) ;
177
+ assert . strictEqual ( one . focus . callCount , 1 ) ;
178
+
179
+ group . focusAfter ( one ) ;
180
+ assert . strictEqual ( zero . focus . callCount , 1 ) ;
181
+
182
+ group . focusBefore ( zero ) ;
183
+ assert . strictEqual ( one . focus . callCount , 2 ) ;
184
+
185
+ group . focusBefore ( one ) ;
186
+ assert . strictEqual ( zero . focus . callCount , 2 ) ;
187
+ } ) ;
188
+ } ) ;
98
189
} ) ;
99
190
100
191
describe ( 'autofocus' , function ( ) {
0 commit comments