diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 21f95b05..493d01c3 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -4881,7 +4881,10 @@ getJasmineRequireObj().DiffBuilder = function(j$) { ); if (useCustom) { - messages.push(wrapPrettyPrinted(actualCustom, expectedCustom, path)); + const prettyActual = actualCustom || this.prettyPrinter_(actual); + const prettyExpected = + expectedCustom || this.prettyPrinter_(expected); + messages.push(wrapPrettyPrinted(prettyActual, prettyExpected, path)); return false; // don't recurse further } diff --git a/spec/core/matchers/DiffBuilderSpec.js b/spec/core/matchers/DiffBuilderSpec.js index b15d0e2c..f134f214 100644 --- a/spec/core/matchers/DiffBuilderSpec.js +++ b/spec/core/matchers/DiffBuilderSpec.js @@ -161,6 +161,63 @@ describe('DiffBuilder', function() { expect(diffBuilder.getMessage()).toEqual(expectedMsg); }); + it('handles cases where only the expected has a custom object formatter', function() { + const formatter = function(x) { + if (typeof x === 'number') { + return '[number:' + x + ']'; + } + }; + const prettyPrinter = jasmineUnderTest.makePrettyPrinter([formatter]); + const diffBuilder = new jasmineUnderTest.DiffBuilder({ + prettyPrinter: prettyPrinter + }); + + diffBuilder.setRoots('five', 4); + diffBuilder.recordMismatch(); + + expect(diffBuilder.getMessage()).toEqual( + "Expected 'five' to equal [number:4]." + ); + }); + + it('handles cases where only the actual has a custom object formatter', function() { + const formatter = function(x) { + if (typeof x === 'number') { + return '[number:' + x + ']'; + } + }; + const prettyPrinter = jasmineUnderTest.makePrettyPrinter([formatter]); + const diffBuilder = new jasmineUnderTest.DiffBuilder({ + prettyPrinter: prettyPrinter + }); + + diffBuilder.setRoots(5, 'four'); + diffBuilder.recordMismatch(); + + expect(diffBuilder.getMessage()).toEqual( + "Expected [number:5] to equal 'four'." + ); + }); + + it('handles complex cases where only one side has a custom object formatter', function() { + const formatter = function(x) { + if (typeof x === 'number') { + return '[number:' + x + ']'; + } + }; + const prettyPrinter = jasmineUnderTest.makePrettyPrinter([formatter]); + const diffBuilder = new jasmineUnderTest.DiffBuilder({ + prettyPrinter: prettyPrinter + }); + + diffBuilder.setRoots(5, { foo: 'bar', fnord: { graults: ['wombat'] } }); + diffBuilder.recordMismatch(); + + expect(diffBuilder.getMessage()).toEqual( + "Expected [number:5] to equal Object({ foo: 'bar', fnord: Object({ graults: [ 'wombat' ] }) })." + ); + }); + it('builds diffs involving asymmetric equality testers that implement valuesForDiff_ at the root', function() { const prettyPrinter = jasmineUnderTest.makePrettyPrinter([]), diffBuilder = new jasmineUnderTest.DiffBuilder({ diff --git a/src/core/matchers/DiffBuilder.js b/src/core/matchers/DiffBuilder.js index 8a6da6a4..b68a91f4 100644 --- a/src/core/matchers/DiffBuilder.js +++ b/src/core/matchers/DiffBuilder.js @@ -37,7 +37,10 @@ getJasmineRequireObj().DiffBuilder = function(j$) { ); if (useCustom) { - messages.push(wrapPrettyPrinted(actualCustom, expectedCustom, path)); + const prettyActual = actualCustom || this.prettyPrinter_(actual); + const prettyExpected = + expectedCustom || this.prettyPrinter_(expected); + messages.push(wrapPrettyPrinted(prettyActual, prettyExpected, path)); return false; // don't recurse further }