diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 6bf3f02a..b5c2708a 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -2461,11 +2461,13 @@ getJasmineRequireObj().matchersUtil = function(j$) { if (result) { // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(isFunction(aCtor) && (aCtor instanceof aCtor) && - isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; + // or `Array`s from different frames are. + if (className !== '[object Array]') { + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor)) { + return false; + } } // Deep compare objects. for (var key in a) { @@ -3044,5 +3046,5 @@ getJasmineRequireObj().interface = function(jasmine, env) { }; getJasmineRequireObj().version = function() { - return '2.2.0'; + return '2.2.1'; }; diff --git a/spec/core/matchers/matchersUtilSpec.js b/spec/core/matchers/matchersUtilSpec.js index 7ff4ada9..26f8ff61 100644 --- a/spec/core/matchers/matchersUtilSpec.js +++ b/spec/core/matchers/matchersUtilSpec.js @@ -171,6 +171,33 @@ describe("matchersUtil", function() { expect(j$.matchersUtil.equals(a,b)).toBe(true); }); + it("passes for equivalent objects from different vm contexts", function() { + if (typeof require !== 'function') { + return; + } + var vm = require('vm'); + var sandbox = { + obj: null + }; + vm.runInNewContext('obj = {a: 1, b: 2}', sandbox); + + expect(j$.matchersUtil.equals(sandbox.obj, {a: 1, b: 2})).toBe(true); + }); + + it("passes for equivalent arrays from different vm contexts", function() { + if (typeof require !== 'function') { + return; + } + + var vm = require('vm'); + var sandbox = { + arr: null + }; + vm.runInNewContext('arr = [1, 2]', sandbox); + + expect(j$.matchersUtil.equals(sandbox.arr, [1, 2])).toBe(true); + }); + it("passes when Any is used", function() { var number = 3, anyNumber = new j$.Any(Number); diff --git a/src/core/matchers/matchersUtil.js b/src/core/matchers/matchersUtil.js index 49ec1145..ad5097c9 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -167,11 +167,13 @@ getJasmineRequireObj().matchersUtil = function(j$) { if (result) { // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(isFunction(aCtor) && (aCtor instanceof aCtor) && - isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; + // or `Array`s from different frames are. + if (className !== '[object Array]') { + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor)) { + return false; + } } // Deep compare objects. for (var key in a) {