mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-15 18:39:52 +00:00
ef513244be
Some tests were using the wrong node in the expected data, but because only the summaries were compared, this would succeeed as long as the type and length were equal (and paragraphs of length 1 are quite common in our test data). Fixed equalNodeSelection() to compare each node by reference as well as comparing the summaries. If one of the equality tests fails, the summaries will still be displayed as expected/actual data (even though they might be equal), and the message will have "(reference equality for selection[3].node)" appended to it. This change broke the tests because a few test cases had bad data, fixed those in this commit as well. Change-Id: Iab420cf29d47f7368c8a9ce79f6309efae75685c
132 lines
3.8 KiB
JavaScript
132 lines
3.8 KiB
JavaScript
( function ( QUnit ) {
|
|
|
|
/**
|
|
* Builds a summary of a node tree.
|
|
*
|
|
* Generated summaries contain node types, lengths, outer lengths, attributes and summaries for
|
|
* each child recursively. It's simple and fast to use deepEqual on this.
|
|
*
|
|
* @method
|
|
* @param {ve.Node} node Node tree to summarize
|
|
* @param {Boolean} [shallow] Do not summarize each child recursively
|
|
* @returns {Object} Summary of node tree
|
|
*/
|
|
function getNodeTreeSummary( node, shallow ) {
|
|
var i,
|
|
summary = {
|
|
'getType': node.getType(),
|
|
'getLength': node.getLength(),
|
|
'getOuterLength': node.getOuterLength(),
|
|
'attributes': node.attributes,
|
|
'internal': node.internal
|
|
};
|
|
if ( node.children !== undefined ) {
|
|
summary['children.length'] = node.children.length;
|
|
if ( !shallow ) {
|
|
summary.children = [];
|
|
for ( i = 0; i < node.children.length; i++ ) {
|
|
summary.children.push( getNodeTreeSummary( node.children[i] ) );
|
|
}
|
|
}
|
|
}
|
|
return summary;
|
|
}
|
|
|
|
/**
|
|
* Builds a summary of a node selection.
|
|
*
|
|
* Generated summaries contain length of results as well as node summaries, ranges, indexes, indexes
|
|
* within parent and node ranges for each result. It's simple and fast to use deepEqual on this.
|
|
*
|
|
* @method
|
|
* @param {Object[]} selection Selection to summarize
|
|
* @returns {Object} Summary of selection
|
|
*/
|
|
function getNodeSelectionSummary( selection ) {
|
|
var i,
|
|
summary = {
|
|
'length': selection.length
|
|
};
|
|
if ( selection.length ) {
|
|
summary.results = [];
|
|
for ( i = 0; i < selection.length; i++ ) {
|
|
summary.results.push( {
|
|
'node': getNodeTreeSummary( selection[i].node, true ),
|
|
'range': selection[i].range,
|
|
'index': selection[i].index,
|
|
'indexInNode': selection[i].indexInNode,
|
|
'nodeRange': selection[i].nodeRange,
|
|
'nodeOuterRange': selection[i].nodeOuterRange
|
|
} );
|
|
}
|
|
}
|
|
return summary;
|
|
}
|
|
|
|
/**
|
|
* Builds a summary of an HTML element.
|
|
*
|
|
* Summaries include node name, text, attributes and recursive summaries of children.
|
|
*
|
|
* @method
|
|
* @param {HTMLElement} element Element to summarize
|
|
* @returns {Object} Summary of element
|
|
*/
|
|
function getDomElementSummary( element ) {
|
|
var $element = $( element ),
|
|
summary = {
|
|
'type': element.nodeName.toLowerCase(),
|
|
'text': $element.text(),
|
|
'attributes': {},
|
|
'children': []
|
|
},
|
|
i;
|
|
// Gather attributes
|
|
for ( i = 0; i < element.attributes.length; i++ ) {
|
|
summary.attributes[element.attributes[i].name] = element.attributes[i].value;
|
|
}
|
|
// Summarize children
|
|
for ( i = 0; i < element.children.length; i++ ) {
|
|
summary.children.push( getDomElementSummary( element.children[i] ) );
|
|
}
|
|
return summary;
|
|
}
|
|
|
|
QUnit.assert.equalNodeTree = function ( actual, expected, shallow, message ) {
|
|
if ( typeof shallow === 'string' && arguments.length === 3 ) {
|
|
message = shallow;
|
|
shallow = undefined;
|
|
}
|
|
var actualSummary = getNodeTreeSummary( actual, shallow ),
|
|
expectedSummary = getNodeTreeSummary( expected, shallow );
|
|
QUnit.push(
|
|
QUnit.equiv( actualSummary, expectedSummary ), actualSummary, expectedSummary, message
|
|
);
|
|
};
|
|
|
|
QUnit.assert.equalNodeSelection = function ( actual, expected, message ) {
|
|
var actualSummary = getNodeSelectionSummary( actual ),
|
|
expectedSummary = getNodeSelectionSummary( expected );
|
|
for ( i = 0; i < actual.length; i++ ) {
|
|
if ( expected[i] && expected[i].node !== actual[i].node ) {
|
|
QUnit.push( false, actualSummary, expectedSummary,
|
|
message + ' (reference equality for selection[' + i + '].node)'
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
QUnit.push(
|
|
QUnit.equiv( actualSummary, expectedSummary ), actualSummary, expectedSummary, message
|
|
);
|
|
};
|
|
|
|
QUnit.assert.equalDomElement = function ( actual, expected, message ) {
|
|
var actualSummary = getDomElementSummary( actual ),
|
|
expectedSummary = getDomElementSummary( expected );
|
|
QUnit.push(
|
|
QUnit.equiv( actualSummary, expectedSummary ), actualSummary, expectedSummary, message
|
|
);
|
|
};
|
|
|
|
}( QUnit ) );
|