',
+ nodeIndexes: [12]
}
]
}
diff --git a/test/core/utils/dq-element.js b/test/core/utils/dq-element.js
index fee058d451..5e998b6950 100644
--- a/test/core/utils/dq-element.js
+++ b/test/core/utils/dq-element.js
@@ -4,227 +4,258 @@ describe('DqElement', function() {
var DqElement = axe.utils.DqElement;
var fixture = document.getElementById('fixture');
var fixtureSetup = axe.testUtils.fixtureSetup;
+ var queryFixture = axe.testUtils.queryFixture;
afterEach(function() {
axe.reset();
});
- it('should be a function', function() {
- assert.isFunction(DqElement);
- });
-
it('should be exposed to utils', function() {
assert.equal(axe.utils.DqElement, DqElement);
});
- it('should take a node as a parameter and return an object', function() {
- var node = document.createElement('div');
- var result = new DqElement(node);
+ it('should take a virtual node as a parameter and return an object', function() {
+ var vNode = queryFixture('');
+ var result = new DqElement(vNode);
+ assert.equal(result.element, vNode.actualNode);
+ });
- assert.isObject(result);
+ it('should take an actual node as a parameter and return an object', function() {
+ var vNode = queryFixture('');
+ var result = new DqElement(vNode.actualNode);
+ assert.equal(result.element, vNode.actualNode);
});
+
describe('element', function() {
it('should store reference to the element', function() {
- var div = document.createElement('div');
- var dqEl = new DqElement(div);
- assert.equal(dqEl.element, div);
+ var vNode = queryFixture('');
+ var dqEl = new DqElement(vNode);
+ assert.equal(dqEl.element, vNode.actualNode);
});
it('should not be present in stringified version', function() {
- var div = document.createElement('div');
- fixtureSetup();
-
- var dqEl = new DqElement(div);
-
+ var vNode = queryFixture('');
+ var dqEl = new DqElement(vNode);
assert.isUndefined(JSON.parse(JSON.stringify(dqEl)).element);
});
});
describe('source', function() {
it('should include the outerHTML of the element', function() {
- fixture.innerHTML = '
Hello!
';
-
- var result = new DqElement(fixture.firstChild);
- assert.equal(result.source, fixture.firstChild.outerHTML);
+ var vNode = queryFixture('
Hello!
');
+ var outerHTML = vNode.actualNode.outerHTML;
+ var result = new DqElement(vNode);
+ assert.equal(result.source, outerHTML);
});
it('should work with SVG elements', function() {
- fixture.innerHTML = '';
+ var vNode = queryFixture('');
+ var result = new DqElement(vNode);
- var result = new DqElement(fixture.firstChild);
- assert.isString(result.source);
+ if (axe.testUtils.isIE11) {
+ assert.isString(result.source);
+ } else {
+ assert.equal(result.source, vNode.actualNode.outerHTML);
+ }
});
+
it('should work with MathML', function() {
- fixture.innerHTML =
- '';
+ var vNode = queryFixture(
+ ''
+ );
- var result = new DqElement(fixture.firstChild);
- assert.isString(result.source);
+ var result = new DqElement(vNode);
+ if (axe.testUtils.isIE11) {
+ assert.isString(result.source);
+ } else {
+ assert.equal(result.source, vNode.actualNode.outerHTML);
+ }
});
it('should truncate large elements', function() {
- var div = '
';
+ var div = '
';
for (var i = 0; i < 300; i++) {
div += i;
}
div += '
';
- fixture.innerHTML = div;
-
- var result = new DqElement(fixture.firstChild);
- assert.equal(result.source.length, '
'.length);
+ var vNode = queryFixture(div);
+ var result = new DqElement(vNode);
+ assert.equal(result.source, '
');
});
it('should use spec object over passed element', function() {
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(
- fixture.firstChild,
- {},
- {
- source: 'woot'
- }
- );
+ var vNode = queryFixture('
Hello!
');
+ var spec = { source: 'woot' };
+ var result = new DqElement(vNode, {}, spec);
assert.equal(result.source, 'woot');
});
it('should return null if audit.noHtml is set', function() {
axe.configure({ noHtml: true });
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(fixture.firstChild);
+ var vNode = queryFixture('
Hello!
');
+ var result = new DqElement(vNode);
assert.isNull(result.source);
});
it('should not use spec object over passed element if audit.noHtml is set', function() {
axe.configure({ noHtml: true });
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(
- fixture.firstChild,
- {},
- {
- source: 'woot'
- }
- );
+ var vNode = queryFixture('
Hello!
');
+ var spec = { source: 'woot' };
+ var result = new DqElement(vNode, {}, spec);
assert.isNull(result.source);
});
});
describe('selector', function() {
it('should prefer selector from spec object', function() {
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(
- fixture.firstChild,
- {},
- {
- selector: 'woot'
- }
- );
+ var vNode = queryFixture('
Hello!
');
+ var spec = { selector: 'woot' };
+ var result = new DqElement(vNode, {}, spec);
assert.equal(result.selector, 'woot');
});
});
describe('ancestry', function() {
it('should prefer selector from spec object', function() {
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(
- fixture.firstChild,
- {},
- {
- ancestry: 'woot'
- }
- );
+ var vNode = queryFixture('
Hello!
');
+ var spec = { ancestry: 'woot' };
+ var result = new DqElement(vNode, {}, spec);
assert.equal(result.ancestry, 'woot');
});
});
describe('xpath', function() {
it('should prefer selector from spec object', function() {
- fixture.innerHTML = '
Hello!
';
- var result = new DqElement(
- fixture.firstChild,
- {},
- {
- xpath: 'woot'
- }
- );
+ var vNode = queryFixture('
Hello!
');
+ var spec = { xpath: 'woot' };
+ var result = new DqElement(vNode, {}, spec);
assert.equal(result.xpath, 'woot');
});
});
describe('absolutePaths', function() {
it('creates a path all the way to root', function() {
- fixtureSetup('
Hello!
');
-
- var result = new DqElement(fixture.firstChild, {
+ var vNode = queryFixture('
Hello!
');
+ var result = new DqElement(vNode, {
absolutePaths: true
});
assert.include(result.selector[0], 'html > ');
assert.include(result.selector[0], '#fixture > ');
- assert.include(result.selector[0], '#foo');
+ assert.include(result.selector[0], '#target');
+ });
+ });
+
+ describe('nodeIndexes', function() {
+ it('is taken from virtualNode', function() {
+ fixtureSetup('');
+ assert.deepEqual(new DqElement(fixture.children[0]).nodeIndexes, [1]);
+ assert.deepEqual(new DqElement(fixture.children[1]).nodeIndexes, [2]);
+ assert.deepEqual(new DqElement(fixture.children[2]).nodeIndexes, [3]);
+ });
+
+ it('is taken from spec, over virtualNode', function() {
+ var vNode = queryFixture('');
+ var spec = { nodeIndexes: [123, 456] };
+ var dqElm = new DqElement(vNode, {}, spec);
+ assert.deepEqual(dqElm.nodeIndexes, [123, 456]);
+ });
+
+ it('is [] when the element is not in the virtual tree.', function() {
+ var div = document.createElement('div');
+ var dqElm = new DqElement(div);
+ assert.deepEqual(dqElm.nodeIndexes, []);
});
});
describe('toJSON', function() {
it('should only stringify selector and source', function() {
- var expected = {
+ var spec = {
selector: 'foo > bar > joe',
source: '',
xpath: '/foo/bar/joe',
- ancestry: 'foo > bar > joe'
+ ancestry: 'foo > bar > joe',
+ nodeIndexes: [123, 456]
};
- var result = new DqElement('joe', {}, expected);
- assert.deepEqual(JSON.stringify(result), JSON.stringify(expected));
+ var div = document.createElement('div');
+ var result = new DqElement(div, {}, spec);
+ assert.deepEqual(result.toJSON(), spec);
});
});
describe('fromFrame', function() {
var dqMain, dqIframe;
beforeEach(function() {
- var main = document.createElement('main');
- main.id = 'main';
- dqMain = new DqElement(
- main,
- {},
- {
- selector: ['#main'],
- ancestry: ['html > body > main'],
- xpath: ['/main']
- }
+ var tree = fixtureSetup(
+ ''
);
+ var main = axe.utils.querySelectorAll(tree, 'main')[0];
+ var mainSpec = {
+ selector: ['#main'],
+ ancestry: ['html > body > main'],
+ xpath: ['/main']
+ };
+ dqMain = new DqElement(main, {}, mainSpec);
- var iframe = document.createElement('iframe');
- iframe.id = 'iframe';
- dqIframe = new DqElement(
- iframe,
- {},
- {
- selector: ['#iframe'],
- ancestry: ['html > body > iframe'],
- xpath: ['/iframe']
- }
- );
+ var iframe = axe.utils.querySelectorAll(tree, 'iframe')[0];
+ var iframeSpec = {
+ selector: ['#iframe'],
+ ancestry: ['html > body > iframe'],
+ xpath: ['/iframe']
+ };
+ dqIframe = new DqElement(iframe, {}, iframeSpec);
});
- it('returns a new DqElement', function() {
- assert.instanceOf(DqElement.fromFrame(dqMain, {}, dqIframe), DqElement);
- });
+ describe('DqElement.fromFrame', function() {
+ it('returns a new DqElement', function() {
+ assert.instanceOf(DqElement.fromFrame(dqMain, {}, dqIframe), DqElement);
+ });
+
+ it('sets options for DqElement', function() {
+ var options = { absolutePaths: true };
+ var dqElm = DqElement.fromFrame(dqMain, options, dqIframe);
+ assert.isTrue(dqElm._options.toRoot);
+ });
- it('sets options for DqElement', function() {
- var options = { absolutePaths: true };
- var dqElm = DqElement.fromFrame(dqMain, options, dqIframe);
- assert.isTrue(dqElm._options.toRoot);
+ it('merges node and frame selectors', function() {
+ var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe);
+ assert.deepEqual(dqElm.selector, [
+ dqIframe.selector[0],
+ dqMain.selector[0]
+ ]);
+ assert.deepEqual(dqElm.ancestry, [
+ dqIframe.ancestry[0],
+ dqMain.ancestry[0]
+ ]);
+ assert.deepEqual(dqElm.xpath, [dqIframe.xpath[0], dqMain.xpath[0]]);
+ });
+
+ it('merges nodeIndexes', function() {
+ var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe);
+ assert.deepEqual(dqElm.nodeIndexes, [
+ dqIframe.nodeIndexes[0],
+ dqMain.nodeIndexes[0]
+ ]);
+ });
});
- it('merges node and frame selectors', function() {
- var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe);
- assert.deepEqual(dqElm.selector, [
- dqIframe.selector[0],
- dqMain.selector[0]
- ]);
- assert.deepEqual(dqElm.ancestry, [
- dqIframe.ancestry[0],
- dqMain.ancestry[0]
- ]);
- assert.deepEqual(dqElm.xpath, [dqIframe.xpath[0], dqMain.xpath[0]]);
+ describe('DqElement.prototype.fromFrame', function() {
+ it('is false when created without a spec', function() {
+ assert.isFalse(dqMain.fromFrame);
+ });
+
+ it('is false when spec is not from a frame', function() {
+ var specMain = dqMain.toJSON();
+ var dqElm = new DqElement(dqMain, {}, specMain);
+ assert.isFalse(dqElm.fromFrame);
+ });
+
+ it('is true when created with a spec', function() {
+ var dqElm = DqElement.fromFrame(dqMain, {}, dqIframe);
+ assert.isTrue(dqElm.fromFrame);
+ });
});
});
});
diff --git a/test/core/utils/flattened-tree.js b/test/core/utils/flattened-tree.js
index 71ea346dd0..9c458339de 100644
--- a/test/core/utils/flattened-tree.js
+++ b/test/core/utils/flattened-tree.js
@@ -3,7 +3,6 @@ var shadowSupport = axe.testUtils.shadowSupport;
describe('axe.utils.getFlattenedTree', function() {
'use strict';
-
function createStyle(box) {
var style = document.createElement('style');
style.textContent =
@@ -75,6 +74,10 @@ describe('axe.utils.getFlattenedTree', function() {
);
}
+ afterEach(function() {
+ fixture.innerHTML = '';
+ });
+
it('should default to document', function() {
fixture.innerHTML = '';
var tree = axe.utils.getFlattenedTree();
@@ -86,11 +89,26 @@ describe('axe.utils.getFlattenedTree', function() {
assert(tree[0].parent === null);
});
+ it('creates virtual nodes in the correct order', function() {
+ fixture.innerHTML = '