summaryrefslogtreecommitdiff
path: root/vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js')
-rw-r--r--vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js b/vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js
new file mode 100644
index 00000000..f041c258
--- /dev/null
+++ b/vendor/oojs/oojs-ui/tests/QUnit.assert.equalDomElement.js
@@ -0,0 +1,113 @@
+/*!
+ * A QUnit assertion to compare DOM node trees.
+ *
+ * Adapted from VisualEditor plugin for QUnit. Additionally supports comparing properties to
+ * attributes (for dynamically generated nodes) and order-insensitive comparison of classes on DOM
+ * nodes.
+ *
+ * @copyright 2011-2015 VisualEditor Team and others; see http://ve.mit-license.org
+ * @copyright 2011-2015 OOjs Team and other contributors
+ */
+
+( function ( QUnit ) {
+
+ /**
+ * Build a summary of an HTML element.
+ *
+ * Summaries include node name, text, attributes and recursive summaries of children.
+ * Used for serializing or comparing HTML elements.
+ *
+ * @private
+ * @param {HTMLElement} element Element to summarize
+ * @param {boolean} [includeHtml=false] Include an HTML summary for element nodes
+ * @return {Object} Summary of element.
+ */
+ function getDomElementSummary( element, includeHtml ) {
+ var i, name,
+ summary = {
+ type: element.nodeName.toLowerCase(),
+ // $( '<div><textarea>Foo</textarea></div>' )[0].textContent === 'Foo', which breaks
+ // comparisons :( childNodes are summarized anyway, this would just be a nicety
+ // text: element.textContent,
+ attributes: {},
+ children: []
+ };
+
+ if ( includeHtml && element.nodeType === Node.ELEMENT_NODE ) {
+ summary.html = element.outerHTML;
+ }
+
+ // Gather attributes
+ if ( element.attributes ) {
+ for ( i = 0; i < element.attributes.length; i++ ) {
+ name = element.attributes[ i ].name;
+ if ( name.substr( 0, 5 ) !== 'data-' && name !== 'id' ) {
+ summary.attributes[ name ] = element.attributes[ i ].value;
+ }
+ }
+ }
+
+ // Sort classes
+ if ( summary.attributes.class ) {
+ summary.attributes.class = summary.attributes.class.split( ' ' ).sort().join( ' ' );
+ }
+
+ // Gather certain properties and pretend they are attributes.
+ // Take note of casing differences.
+ if ( element.value !== undefined ) {
+ summary.attributes.value = element.value;
+ }
+ if ( element.readOnly !== undefined ) {
+ summary.attributes.readonly = element.readOnly;
+ }
+ if ( element.checked !== undefined ) {
+ summary.attributes.checked = element.checked;
+ }
+ if ( element.disabled !== undefined ) {
+ summary.attributes.disabled = element.disabled;
+ }
+ if ( element.tabIndex !== undefined ) {
+ summary.attributes.tabindex = element.tabIndex;
+ }
+
+ // Summarize children
+ if ( element.childNodes ) {
+ for ( i = 0; i < element.childNodes.length; i++ ) {
+ summary.children.push( getDomElementSummary( element.childNodes[ i ], includeHtml ) );
+ }
+ }
+
+ // Special handling for textareas, where we only want to account for the content as the 'value'
+ // property, never as childNodes or textContent
+ if ( summary.type === 'textarea' ) {
+ // summary.text = '';
+ summary.children = [];
+ }
+
+ return summary;
+ }
+
+ /**
+ * @method
+ * @static
+ */
+ QUnit.assert.equalDomElement = function ( actual, expected, message, stringify ) {
+ var actualSummary = getDomElementSummary( actual ),
+ expectedSummary = getDomElementSummary( expected ),
+ actualSummaryHtml = getDomElementSummary( actual, true ),
+ expectedSummaryHtml = getDomElementSummary( expected, true );
+
+ // When running with Karma, the objects are not nicely stringified in the output when the test
+ // fails, only showing "Expected: [object Object], Actual: [object Object]" instead. Running
+ // QUnit in browser does this, and stringifying causes double escaping in output.
+ if ( stringify ) {
+ actualSummaryHtml = JSON.stringify( actualSummaryHtml, null, 2 );
+ expectedSummaryHtml = JSON.stringify( expectedSummaryHtml, null, 2 );
+ }
+
+ QUnit.push(
+ QUnit.equiv( actualSummary, expectedSummary ), actualSummaryHtml, expectedSummaryHtml, message
+ );
+ };
+
+}( QUnit ) );