Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit d0b04d7

Browse files
committed
TabGroup tests
1 parent 584c105 commit d0b04d7

File tree

2 files changed

+96
-4
lines changed

2 files changed

+96
-4
lines changed

lib/tab-group.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default class TabGroup {
7373
this.autofocusTarget && this.autofocusTarget.focus();
7474
}
7575

76+
/* istanbul ignore next */
7677
getCurrentFocus() {
7778
return document.activeElement;
7879
}

test/tab-group.test.js

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe('TabGroup', function() {
2020
});
2121

2222
describe('with tabbable elements', function() {
23-
let group, zero, one, two;
23+
let group, zero, one, two, currentFocus, skip;
2424

2525
beforeEach(function() {
2626
group = new TabGroup();
@@ -38,9 +38,25 @@ describe('TabGroup', function() {
3838
one = root.querySelector('#one');
3939
two = root.querySelector('#two');
4040

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);
4460
});
4561

4662
it('appends elements into a doubly-linked circular list', function() {
@@ -74,6 +90,13 @@ describe('TabGroup', function() {
7490
assert.strictEqual(zero.focus.callCount, 1);
7591
});
7692

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+
77100
it('is a no-op with unregistered elements', function() {
78101
const unregistered = document.createElement('div');
79102

@@ -95,6 +118,74 @@ describe('TabGroup', function() {
95118
group.focusBefore(one);
96119
assert.strictEqual(zero.focus.callCount, 1);
97120
});
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+
});
98189
});
99190

100191
describe('autofocus', function() {

0 commit comments

Comments
 (0)