From 01f1af9224ab2238e29fcbec7fe5be677386b74d Mon Sep 17 00:00:00 2001 From: David Date: Fri, 29 Jun 2018 20:51:10 +0200 Subject: [PATCH 1/2] [Refactor] `selectors`: clean up `matchDirectChild`, `matchGeneralSibling`, `reduceTreeBySelector` --- packages/enzyme/src/selectors.js | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/packages/enzyme/src/selectors.js b/packages/enzyme/src/selectors.js index 97f091aa3..bd451efe5 100644 --- a/packages/enzyme/src/selectors.js +++ b/packages/enzyme/src/selectors.js @@ -304,12 +304,8 @@ function matchGeneralSibling(nodes, predicate, root) { return uniqueReduce((matches, node) => { const parent = findParentNode(root, node); const nodeIndex = parent.rendered.indexOf(node); - parent.rendered.forEach((sibling, i) => { - if (i > nodeIndex && predicate(sibling)) { - matches.push(sibling); - } - }); - return matches; + const youngerSiblings = parent.rendered.slice(nodeIndex + 1); + return matches.concat(youngerSiblings.filter(predicate)); }, nodes); } @@ -320,15 +316,10 @@ function matchGeneralSibling(nodes, predicate, root) { * @param {Function} predicate */ function matchDirectChild(nodes, predicate) { - return uniqueReduce((matches, node) => { - const children = childrenOfNode(node); - children.forEach((child) => { - if (predicate(child)) { - matches.push(child); - } - }); - return matches; - }, nodes); + return uniqueReduce( + (matches, node) => matches.concat(childrenOfNode(node).filter(predicate)), + nodes, + ); } /** @@ -353,11 +344,12 @@ function matchDescendant(nodes, predicate) { * @param {RSTNode} wrapper */ export function reduceTreeBySelector(selector, root) { - let results = []; - if (typeof selector === 'function' || typeof selector === 'object') { - results = treeFilter(root, buildPredicate(selector)); - } else if (typeof selector === 'string') { + return treeFilter(root, buildPredicate(selector)); + } + + let results = []; + if (typeof selector === 'string') { const tokens = safelyGenerateTokens(selector); let index = 0; let token = null; From 0d446f452da0d2067c4e6c2b264978b6fa71ad04 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 29 Jun 2018 20:50:20 +0200 Subject: [PATCH 2/2] [Fix] `selectors`: make general sibling not throw on root --- packages/enzyme-test-suite/test/selector-spec.jsx | 5 +++++ packages/enzyme/src/selectors.js | 3 +++ 2 files changed, 8 insertions(+) diff --git a/packages/enzyme-test-suite/test/selector-spec.jsx b/packages/enzyme-test-suite/test/selector-spec.jsx index 40de175aa..54659c427 100644 --- a/packages/enzyme-test-suite/test/selector-spec.jsx +++ b/packages/enzyme-test-suite/test/selector-spec.jsx @@ -193,6 +193,11 @@ describe('selectors', () => { siblings.map(sibling => expect(sibling.text()).to.not.equal('Top')); }); + it('handles using general siblings on root', () => { + const wrapper = renderMethod(
); + expect(wrapper.find('.foo ~ .bar')).to.have.lengthOf(0); + }); + it('not() pseudo selector', () => { const wrapper = renderMethod((
diff --git a/packages/enzyme/src/selectors.js b/packages/enzyme/src/selectors.js index bd451efe5..71adefc68 100644 --- a/packages/enzyme/src/selectors.js +++ b/packages/enzyme/src/selectors.js @@ -303,6 +303,9 @@ function matchAdjacentSiblings(nodes, predicate, root) { function matchGeneralSibling(nodes, predicate, root) { return uniqueReduce((matches, node) => { const parent = findParentNode(root, node); + if (!parent) { + return matches; + } const nodeIndex = parent.rendered.indexOf(node); const youngerSiblings = parent.rendered.slice(nodeIndex + 1); return matches.concat(youngerSiblings.filter(predicate));