axe-core
Version:
Accessibility engine for automated Web UI testing
164 lines (140 loc) • 4.26 kB
JavaScript
describe('axe.utils.getScrollState', function () {
'use strict';
var mockWin;
var getScrollState = axe.utils.getScrollState;
var fixture = document.getElementById('fixture');
beforeEach(function () {
mockWin = {
pageXOffset: 1,
pageYOffset: 3,
document: {
documentElement: {
children: [],
scrollTop: 3,
scrollHeight: 4
}
},
body: { children: [] }
};
fixture.innerHTML = '';
});
it('should be a function', function () {
assert.isFunction(getScrollState);
});
it('takes the window object as an optional argument', function () {
assert.deepEqual(
getScrollState(),
getScrollState(window)
);
});
it('returns the window as the first item, if pageXOffset is supported', function () {
assert.deepEqual(
getScrollState(mockWin)[0],
{
elm: mockWin,
top: mockWin.pageYOffset,
left: mockWin.pageXOffset
}
);
});
it('returns the html as the first item, if pageXOffset is not supported', function () {
mockWin.pageYOffset = undefined;
mockWin.pageXOffset = undefined;
var html = mockWin.document.documentElement;
assert.deepEqual(
getScrollState(mockWin)[0],
{
elm: html,
top: html.scrollTop,
left: html.scrollLeft
}
);
});
it('grabs scrollTop and scrollLeft from all descendants of body', function () {
fixture.innerHTML =
'<div style="overflow:auto; height: 50px" id="tgt1">' +
'<div style="height: 100px"> Han Solo </div>' +
'<div style="overflow: hidden; height: 50px" id="tgt2">' +
'<div style="height: 100px"> Chewbacca </div>' +
'</div>' +
'</div>';
var tgt1 = document.getElementById('tgt1');
var tgt2 = document.getElementById('tgt2');
tgt1.scrollTop = 10;
tgt2.scrollTop = 20;
var scrollState = getScrollState();
assert.deepEqual(
scrollState.find(function (scroll) { return scroll.elm === tgt1; }),
{ elm: tgt1, top: 10, left: 0 }
);
assert.deepEqual(
scrollState.find(function (scroll) { return scroll.elm === tgt2; }),
{ elm: tgt2, top: 20, left: 0 }
);
});
it('ignores elements with overflow visible', function () {
fixture.innerHTML =
'<div style="overflow:visible; height: 50px" id="tgt1">' +
'<div style="height: 100px" id="tgt2"> Han Solo </div>' +
'</div>';
var tgt1 = document.getElementById('tgt1');
var tgt2 = document.getElementById('tgt2');
var scrollState = getScrollState();
assert.isUndefined(
scrollState.find(function (scroll) { return scroll.elm === tgt1; })
);
assert.isUndefined(
scrollState.find(function (scroll) { return scroll.elm === tgt2; })
);
});
it('ignores elements that do not overflow', function () {
fixture.innerHTML =
'<div style="overflow:auto; height: 300px" id="tgt1">' +
'<div style="height: 100px"> Han Solo </div>' +
'<div style="overflow: hidden; height: 150px" id="tgt2">' +
'<div style="height: 100px"> Chewbacca </div>' +
'</div>' +
'</div>';
var tgt1 = document.getElementById('tgt1');
var tgt2 = document.getElementById('tgt2');
var scrollState = getScrollState();
assert.isUndefined(
scrollState.find(function (scroll) { return scroll.elm === tgt1; })
);
assert.isUndefined(
scrollState.find(function (scroll) { return scroll.elm === tgt2; })
);
});
});
describe('axe.utils.setScrollState', function () {
'use strict';
var setScrollState = axe.utils.setScrollState;
var fixture = document.getElementById('fixture');
afterEach(function () {
fixture.innerHTML = '';
});
it('should be a function', function () {
assert.isFunction(setScrollState);
});
it('sets scrollTop and scrollLeft for regular nodes', function () {
var elm1 = {}, elm2 = {};
setScrollState([
{ elm: elm1, top: 10, left: 20 },
{ elm: elm2, top: 30, left: 40 },
]);
assert.deepEqual(elm1, { scrollTop: 10, scrollLeft: 20 });
assert.deepEqual(elm2, { scrollTop: 30, scrollLeft: 40 });
});
it('calls scroll() for the window element', function () {
var called;
var winScroll = window.scroll;
window.scroll = function (top, left) {
called = { top: top, left: left };
};
setScrollState([
{ elm: window, top: 10, left: 20 }
]);
assert.deepEqual(called, { top: 10, left: 20 });
window.scroll = winScroll;
});
});