From 0183acc6822ad5f13e20a690418e0b1707a33d82 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Wed, 4 Jun 2025 18:04:40 -0700 Subject: [PATCH] Fix diff building when only one side has a custom object formatter Fixes #2061 --- lib/jasmine-core/jasmine.js | 5 ++- spec/core/matchers/DiffBuilderSpec.js | 57 +++++++++++++++++++++++++++ src/core/matchers/DiffBuilder.js | 5 ++- 3 files changed, 65 insertions(+), 2 deletions(-) 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 }