From d4743b1021aa7037b2f3faa89070e7ece0413c51 Mon Sep 17 00:00:00 2001 From: Jake Holland Date: Sun, 11 Aug 2024 12:16:17 +0100 Subject: [PATCH] Add missing state call in diff calculation --- jiff.js | 2 +- test/jiff-test.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/jiff.js b/jiff.js index 65669e7..270d7d8 100644 --- a/jiff.js +++ b/jiff.js @@ -202,7 +202,7 @@ function lcsToJsonPatch(a1, a2, path, state, lcsMatrix) { * @returns {object} updated diff state */ function appendValueChanges(a, b, path, state) { - if(a !== b) { + if(state.hash(a) !== state.hash(b)) { if(state.invertible) { state.patch.push({ op: 'test', path: path, value: a }); } diff --git a/test/jiff-test.js b/test/jiff-test.js index 14fd84a..7d9c3e2 100644 --- a/test/jiff-test.js +++ b/test/jiff-test.js @@ -120,6 +120,60 @@ buster.testCase('jiff', { } } } + }, + 'with custom hash function': { + 'primitives as elements': { + 'should generate an empty patch when elements are equal': function() { + var patch = jiff.diff([1, 'a', true], [1, 'a', true], { + hash: function (a) { + return JSON.stringify(a) + '_SUFFIX'; + } + }); + assert.equals(patch.length, 0); + } + }, + 'arrays as elements': { + 'should generate an empty patch when elements are equal': function() { + var patch = jiff.diff([['a'], ['b'], ['c']], [['a'], ['b'], ['c']], { + hash: function (a) { + return JSON.stringify(a) + '_SUFFIX'; + } + }); + assert.equals(patch.length, 0); + } + }, + 'objects as elements': { + 'object keys with consistent order': { + 'should generate an empty patch when elements are equal': function() { + var patch = jiff.diff([{a: 'a', b: 'b', c: 'c'}], [{a: 'a', b: 'b', c: 'c'}], { + hash: function (a) { + return JSON.stringify(a) + '_SUFFIX'; + } + }); + assert.equals(patch.length, 0); + } + }, + 'object keys with inconsistent order': { + 'should generate a non empty patch even though elements are equal': function() { + var patch = jiff.diff([{b: 'b', c: 'c', a: 'a'}], [{a: 'a', b: 'b', c: 'c'}], { + hash: function (a) { + return JSON.stringify(a) + '_SUFFIX'; + } + }); + refute.equals(patch.length, 0); + } + } + }, + 'when custom hash ignores value': function() { + var patch = jiff.diff([1], [2], { + invertible: false, + hash: function (a) { + return typeof a; + } + }); + + assert.equals(patch.length, 0); + } } },