diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 5e5bbe7e..e54501e8 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -217,6 +217,10 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { return obj.nodeType > 0; }; + j$.isPromise = function(obj) { + return typeof jasmineGlobal.Promise !== 'undefined' && obj.constructor === jasmineGlobal.Promise; + }; + j$.fnNameFor = function(func) { if (func.name) { return func.name; @@ -2683,6 +2687,12 @@ getJasmineRequireObj().matchersUtil = function(j$) { diffBuilder.record(a, b); return false; } + + var aIsPromise = j$.isPromise(a); + var bIsPromise = j$.isPromise(b); + if (aIsPromise && bIsPromise) { + return a === b; + } // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. diff --git a/spec/core/matchers/matchersUtilSpec.js b/spec/core/matchers/matchersUtilSpec.js index 0214f84d..485d72b4 100644 --- a/spec/core/matchers/matchersUtilSpec.js +++ b/spec/core/matchers/matchersUtilSpec.js @@ -166,6 +166,16 @@ describe("matchersUtil", function() { expect(jasmineUnderTest.matchersUtil.equals(a,b)).toBe(true); }); + + it("passes for equivalent Promises (GitHub issue #1314)", function() { + if (typeof Promise === 'undefined') { return; } + + var p1 = new Promise(function () {}), + p2 = new Promise(function () {}); + + expect(jasmineUnderTest.matchersUtil.equals(p1, p1)).toBe(true); + expect(jasmineUnderTest.matchersUtil.equals(p1, p2)).toBe(false); + }); describe("when running in a browser", function() { function isNotRunningInBrowser() { diff --git a/src/core/base.js b/src/core/base.js index bfd9958f..ea09cb34 100644 --- a/src/core/base.js +++ b/src/core/base.js @@ -87,6 +87,10 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { return obj.nodeType > 0; }; + j$.isPromise = function(obj) { + return typeof jasmineGlobal.Promise !== 'undefined' && obj.constructor === jasmineGlobal.Promise; + }; + j$.fnNameFor = function(func) { if (func.name) { return func.name; diff --git a/src/core/matchers/matchersUtil.js b/src/core/matchers/matchersUtil.js index 07d191e9..235e5a05 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -213,6 +213,12 @@ getJasmineRequireObj().matchersUtil = function(j$) { diffBuilder.record(a, b); return false; } + + var aIsPromise = j$.isPromise(a); + var bIsPromise = j$.isPromise(b); + if (aIsPromise && bIsPromise) { + return a === b; + } // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.