mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-12-01 17:36:35 +00:00
cddb3f1b39
As jQuery hash problems in some cases converting HTML, it is easier just to store the original DOM elements. The bulk of this commit is fixing the tests as although we have an assertion for comparing DOM elements, we don't have one for comparing objects or arrays which may contain DOM elements. ve.js * copyObject & copyArray fixed to run cloneNode(true) on any item of type Node. * Added callback function so an object/array can be copied with modifications. ve.qunit.js * Added deepEqualWithDomElements: Using the new copyObect/Array callback, we can copy the incoming object and convert any nodes to node summaries, then just run the normal deep equal comparison. ve.dm.AlienNodes.js * Instead of storing HMTL we store cloned DOM elements which we can send straight back to the converter without any processing. ve.dm.example.js * Updated tests to expect DOM elements instead of HTML. ve.dm.Converter.test.js * Updated tests to use deepEqualWithDomElements Bug: 47737 Change-Id: I3df8f49b170c31da9610129d53cf8cb65dd5d5f8
209 lines
5.4 KiB
JavaScript
209 lines
5.4 KiB
JavaScript
/*!
|
|
* VisualEditor plugin for QUnit.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
( function ( QUnit ) {
|
|
|
|
QUnit.config.requireExpects = true;
|
|
|
|
/**
|
|
* Plugin for QUnit.
|
|
*
|
|
* @class ve.QUnit
|
|
* @extends 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
|
|
* @private
|
|
* @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(),
|
|
'element': node.element
|
|
},
|
|
numChildren;
|
|
|
|
if ( node.children !== undefined ) {
|
|
numChildren = node.children.length;
|
|
if ( !shallow ) {
|
|
summary.children = [];
|
|
for ( i = 0; i < numChildren; 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
|
|
* @private
|
|
* @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,
|
|
'parentOuterRange': selection[i].parentOuterRange
|
|
} );
|
|
}
|
|
}
|
|
return summary;
|
|
}
|
|
|
|
/**
|
|
* Builds a summary of an HTML element.
|
|
*
|
|
* Summaries include node name, text, attributes and recursive summaries of children.
|
|
*
|
|
* @method
|
|
* @private
|
|
* @param {HTMLElement} element Element to summarize
|
|
* @returns {Object} Summary of element.
|
|
*/
|
|
function getDomElementSummary( element ) {
|
|
var i,
|
|
$element = $( element ),
|
|
summary = {
|
|
'type': element.nodeName.toLowerCase(),
|
|
'text': $element.text(),
|
|
'attributes': {},
|
|
'children': []
|
|
};
|
|
|
|
// Gather attributes
|
|
if ( element.attributes ) {
|
|
for ( i = 0; i < element.attributes.length; i++ ) {
|
|
summary.attributes[element.attributes[i].name] = element.attributes[i].value;
|
|
}
|
|
}
|
|
// Summarize children
|
|
if ( element.childNodes ) {
|
|
for ( i = 0; i < element.childNodes.length; i++ ) {
|
|
if ( element.childNodes[i].nodeType !== Node.TEXT_NODE ) {
|
|
summary.children.push( getDomElementSummary( element.childNodes[i] ) );
|
|
}
|
|
}
|
|
}
|
|
return summary;
|
|
}
|
|
|
|
/**
|
|
* Callback for ve.copyArray/Object to convert nodes to a comparable summary
|
|
*
|
|
* @method
|
|
* @private
|
|
* @param {Object} value Value in the object/array
|
|
* @returns {Object} DOM element summary if value is a node, otherwise just the value
|
|
*/
|
|
function convertDomElements( value ) {
|
|
if ( value instanceof Node ) {
|
|
return getDomElementSummary( value );
|
|
}
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* Assertion helpers for VisualEditor test suite.
|
|
* @class ve.QUnit.assert
|
|
*/
|
|
|
|
/**
|
|
* Assert that summaries of two node trees are equal.
|
|
* @method
|
|
* @static
|
|
*/
|
|
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
|
|
);
|
|
};
|
|
|
|
/**
|
|
* @method
|
|
* @static
|
|
*/
|
|
QUnit.assert.equalNodeSelection = function ( actual, expected, message ) {
|
|
var i,
|
|
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
|
|
);
|
|
};
|
|
|
|
/**
|
|
* @method
|
|
* @static
|
|
*/
|
|
QUnit.assert.equalDomElement = function ( actual, expected, message ) {
|
|
var actualSummary = getDomElementSummary( actual ),
|
|
expectedSummary = getDomElementSummary( expected );
|
|
|
|
QUnit.push(
|
|
QUnit.equiv( actualSummary, expectedSummary ), actualSummary, expectedSummary, message
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Assert that two objects which may contain dom elements are equal.
|
|
* @method
|
|
* @static
|
|
*/
|
|
QUnit.assert.deepEqualWithDomElements = function ( actual, expected, message ) {
|
|
// Recursively copy objects or arrays, converting any dom elements found to comparable summaries
|
|
actual = ve.isArray( actual ) ? ve.copyArray( actual, convertDomElements ) : ve.copyObject( actual, convertDomElements );
|
|
expected = ve.isArray( expected ) ? ve.copyArray( expected, convertDomElements ) : ve.copyObject( expected, convertDomElements );
|
|
|
|
QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
|
|
};
|
|
|
|
}( QUnit ) );
|