diff --git a/spec/core/matchers/toEqualSpec.js b/spec/core/matchers/toEqualSpec.js index 374e003a..aefaf40a 100644 --- a/spec/core/matchers/toEqualSpec.js +++ b/spec/core/matchers/toEqualSpec.js @@ -624,6 +624,99 @@ describe("toEqual", function() { expect(compareEquals(actual, expected).message).toEqual(message); }); + it("reports mismatches between SVG nodes", function () { + var nodeA = this.doc.createElementNS('http://www.w3.org/2000/svg', 'svg'), + nodeB = this.doc.createElementNS('http://www.w3.org/2000/svg', 'svg'); + + nodeA.setAttribute('height', '50'); + nodeB.setAttribute('height', '30'); + + var rect = this.doc.createElementNS('http://www.w3.org/2000/svg', 'rect'); + rect.setAttribute('width', '50'); + nodeA.appendChild(rect); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a = ... to equal .'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + + it("reports whole DOM node when attribute contains > character", function () { + var nodeA = this.doc.createElement('div'), + nodeB = this.doc.createElement('div'); + + nodeA.setAttribute('thing', '>>>'); + nodeB.setAttribute('thing', 'bar'); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a =
to equal
.'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + + it('reports no content when DOM node has multiple empty text nodes', function () { + var nodeA = this.doc.createElement('div'), + nodeB = this.doc.createElement('div'); + + nodeA.appendChild(this.doc.createTextNode('')); + nodeA.appendChild(this.doc.createTextNode('')); + nodeA.appendChild(this.doc.createTextNode('')); + nodeA.appendChild(this.doc.createTextNode('')); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a =
to equal
.'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + + it('reports content when DOM node has non empty text node', function () { + var nodeA = this.doc.createElement('div'), + nodeB = this.doc.createElement('div'); + + nodeA.appendChild(this.doc.createTextNode('Hello Jasmine!')); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a =
...
to equal
.'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + + it('reports empty DOM attributes', function () { + var nodeA = this.doc.createElement('div'), + nodeB = this.doc.createElement('div'); + + nodeA.setAttribute('contenteditable', ''); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a =
to equal
.'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + + it('reports 0 attr value as non empty DOM attribute', function () { + var nodeA = this.doc.createElement('div'), + nodeB = this.doc.createElement('div'); + + nodeA.setAttribute('contenteditable', 0); + + expect(nodeA.isEqualNode(nodeB)).toBe(false); + var actual = {a: nodeA}, + expected = {a: nodeB}, + message = 'Expected $.a =
to equal
.'; + + expect(compareEquals(actual, expected).message).toEqual(message); + }); + it("reports mismatches between a DOM node and a bare Object", function() { var actual = {a: this.doc.createElement('div')}, expected = {a: {}}, diff --git a/src/core/PrettyPrinter.js b/src/core/PrettyPrinter.js index a5abcdd6..39b85e56 100644 --- a/src/core/PrettyPrinter.js +++ b/src/core/PrettyPrinter.js @@ -228,15 +228,29 @@ getJasmineRequireObj().pp = function(j$) { }; PrettyPrinter.prototype.emitDomElement = function(el) { - var closingTag = ''; + var tagName = el.tagName.toLowerCase(), + attrs = el.attributes, + i, + len = attrs.length, + out = '<' + tagName, + attr; - if (el.innerHTML === '') { - this.append(el.outerHTML.replace(closingTag, '')); - } else { - var tagEnd = el.outerHTML.indexOf('>'); - this.append(el.outerHTML.substring(0, tagEnd + 1)); - this.append('...' + closingTag); + for (i = 0; i < len; i++) { + attr = attrs[i]; + out += ' ' + attr.name; + + if (attr.value !== '') { + out += '="' + attr.value + '"'; + } } + + out += '>'; + + if (el.childElementCount !== 0 || el.textContent !== '') { + out += '...'; + } + + this.append(out); }; PrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) {