From 18de4ed2e68c25f9fff9983d996b024704183801 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sat, 7 Jul 2018 09:18:26 -0700 Subject: [PATCH] [Fix] `shallow`: `.equals()`: flatten children when comparing Fixes #1347 --- .../test/ShallowWrapper-spec.jsx | 29 +++++++++++++++++++ packages/enzyme/package.json | 1 + packages/enzyme/src/Utils.js | 13 +++++---- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx index 0895b7cd1..b25d04854 100644 --- a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx @@ -425,6 +425,35 @@ describe('shallow', () => { expect(shallow().equals()).to.equal(false); }); }); + + it('flattens arrays of children to compare', () => { + class TwoChildren extends React.Component { + render() { + return ( +
+
+
+
+ ); + } + } + + class TwoChildrenOneArrayed extends React.Component { + render() { + return ( +
+
+ {[
]} +
+ ); + } + } + const twoChildren = shallow(); + const twoChildrenOneArrayed = shallow(); + + expect(twoChildren.equals(twoChildrenOneArrayed.getElement())).to.equal(true); + expect(twoChildrenOneArrayed.equals(twoChildren.getElement())).to.equal(true); + }); }); describe('.hostNodes()', () => { diff --git a/packages/enzyme/package.json b/packages/enzyme/package.json index 1f5ae114f..8314b8138 100644 --- a/packages/enzyme/package.json +++ b/packages/enzyme/package.json @@ -34,6 +34,7 @@ "author": "Leland Richardson ", "license": "MIT", "dependencies": { + "array.prototype.flat": "^1.2.1", "cheerio": "^1.0.0-rc.2", "function.prototype.name": "^1.0.3", "has": "^1.0.1", diff --git a/packages/enzyme/src/Utils.js b/packages/enzyme/src/Utils.js index 20e295f30..bc7d49cf8 100644 --- a/packages/enzyme/src/Utils.js +++ b/packages/enzyme/src/Utils.js @@ -4,6 +4,8 @@ import is from 'object-is'; import entries from 'object.entries'; import functionName from 'function.prototype.name'; import has from 'has'; +import flat from 'array.prototype.flat'; + import configuration from './configuration'; import validateAdapter from './validateAdapter'; import { childrenOfNode } from './RSTTraversal'; @@ -72,11 +74,12 @@ function internalChildrenCompare(a, b, lenComp, isLoose) { if (!Array.isArray(a) && !Array.isArray(b)) { return nodeCompare(a, b, lenComp); } - if (!a && !b) return true; - if (a.length !== b.length) return false; - if (a.length === 0 && b.length === 0) return true; - for (let i = 0; i < a.length; i += 1) { - if (!nodeCompare(a[i], b[i], lenComp)) return false; + const flatA = flat(a, Infinity); + const flatB = flat(b, Infinity); + if (flatA.length !== flatB.length) return false; + if (flatA.length === 0 && flatB.length === 0) return true; + for (let i = 0; i < flatA.length; i += 1) { + if (!nodeCompare(flatA[i], flatB[i], lenComp)) return false; } return true; }