From 0bd636b5d2e903856b80375b4f07f504a60a1c1e Mon Sep 17 00:00:00 2001 From: David Diederich Date: Fri, 30 Aug 2019 01:09:53 -0400 Subject: [PATCH] Updated arrayContaining to require actual values to be arrays If the actual value of a test was a string, this was matching against arrays that contained the strings. This was due to the use of the contains matcher, which against string looks for substrings, when it was intended to look for array elements. --- spec/core/asymmetric_equality/ArrayContainingSpec.js | 6 ++++++ src/core/asymmetric_equality/ArrayContaining.js | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/spec/core/asymmetric_equality/ArrayContainingSpec.js b/spec/core/asymmetric_equality/ArrayContainingSpec.js index 778eca43..30b5aaad 100644 --- a/spec/core/asymmetric_equality/ArrayContainingSpec.js +++ b/spec/core/asymmetric_equality/ArrayContainingSpec.js @@ -31,6 +31,12 @@ describe("ArrayContaining", function() { expect(containing.asymmetricMatch(["bar"])).toBe(false); }); + it("does not match when the actual is not an array", function() { + var containing = new jasmineUnderTest.ArrayContaining(["foo"]); + + expect(containing.asymmetricMatch("foo")).toBe(false); + }); + it("jasmineToStrings itself", function() { var containing = new jasmineUnderTest.ArrayContaining([]); diff --git a/src/core/asymmetric_equality/ArrayContaining.js b/src/core/asymmetric_equality/ArrayContaining.js index b39fb857..92a85ed0 100644 --- a/src/core/asymmetric_equality/ArrayContaining.js +++ b/src/core/asymmetric_equality/ArrayContaining.js @@ -8,6 +8,13 @@ getJasmineRequireObj().ArrayContaining = function(j$) { throw new Error('You must provide an array to arrayContaining, not ' + j$.pp(this.sample) + '.'); } + // If the actual parameter is not an array, we can fail immediately, since it couldn't + // possibly be an "array containing" anything. However, we also want an empty sample + // array to match anything, so we need to double-check we aren't in that case + if (!j$.isArray_(other) && this.sample.length > 0) { + return false; + } + for (var i = 0; i < this.sample.length; i++) { var item = this.sample[i]; if (!j$.matchersUtil.contains(other, item, customTesters)) {