diff --git a/spec/core/MatchersSpec.js b/spec/core/MatchersSpec.js index 0326b68f..19411df1 100644 --- a/spec/core/MatchersSpec.js +++ b/spec/core/MatchersSpec.js @@ -352,6 +352,33 @@ describe("jasmine.Matchers", function() { }]).toEqual(["a", jasmine.any(Function)])).toPass(); }); + describe("toEqual with an object implementing jasmineMatches", function () { + var matcher; + beforeEach(function () { + matcher = { + jasmineMatches: jasmine.createSpy("jasmineMatches") + }; + }); + + describe("on the left side", function () { + it("uses the jasmineMatches function", function () { + matcher.jasmineMatches.andReturn(false); + expect(match(matcher).toEqual("foo")).toFail(); + matcher.jasmineMatches.andReturn(true); + expect(match(matcher).toEqual("foo")).toPass(); + }); + }); + + describe("on the right side", function () { + it("uses the jasmineMatches function", function () { + matcher.jasmineMatches.andReturn(false); + expect(match("foo").toEqual(matcher)).toFail(); + matcher.jasmineMatches.andReturn(true); + expect(match("foo").toEqual(matcher)).toPass(); + }); + }); + }); + it("toEqual handles circular objects ok", function() { expect(match({foo: "bar", baz: jasmine.undefined}).toEqual({foo: "bar", baz: jasmine.undefined})).toPass(); expect(match({foo:['bar','baz','quux']}).toEqual({foo:['bar','baz','quux']})).toPass(); @@ -953,6 +980,127 @@ describe("jasmine.Matchers", function() { }); }); }); + + describe(".jasmineMatches", function () { + describe("with Object", function () { + beforeEach(function () { + any = jasmine.any(Object); + }); + + it("matches an empty object", function () { + expect(any.jasmineMatches({})).toEqual(true); + }); + + it("matches a newed up object", function () { + expect(any.jasmineMatches(new Object())).toEqual(true); + }); + + it("doesn't match a string", function () { + expect(any.jasmineMatches("")).toEqual(false); + }); + + it("doesn't match a number", function () { + expect(any.jasmineMatches(123)).toEqual(false); + }); + + it("doesn't match a function", function () { + expect(any.jasmineMatches(function () {})).toEqual(false); + }); + }); + + describe("with Function", function () { + beforeEach(function () { + any = jasmine.any(Function); + }); + + it("doesn't match an object", function () { + expect(any.jasmineMatches({})).toEqual(false); + }); + + it("doesn't match a string", function () { + expect(any.jasmineMatches("")).toEqual(false); + }); + + it("doesn't match a number", function () { + expect(any.jasmineMatches(123)).toEqual(false); + }); + + it("matches a function", function () { + expect(any.jasmineMatches(function () {})).toEqual(true); + }); + }); + + describe("with Number", function () { + beforeEach(function () { + any = jasmine.any(Number); + }); + + it("doesn't match an object", function () { + expect(any.jasmineMatches({})).toEqual(false); + }); + + it("doesn't match a string", function () { + expect(any.jasmineMatches("")).toEqual(false); + }); + + it("matches a number", function () { + expect(any.jasmineMatches(123)).toEqual(true); + }); + + it("doesn't match a function", function () { + expect(any.jasmineMatches(function () {})).toEqual(false); + }); + }); + + describe("with String", function () { + beforeEach(function () { + any = jasmine.any(String); + }); + + it("doesn't match an object", function () { + expect(any.jasmineMatches({})).toEqual(false); + }); + + it("matches a string", function () { + expect(any.jasmineMatches("")).toEqual(true); + }); + + it("doesn't match a number", function () { + expect(any.jasmineMatches(123)).toEqual(false); + }); + + it("doesn't match a function", function () { + expect(any.jasmineMatches(function () {})).toEqual(false); + }); + }); + + describe("with some defined 'class'", function () { + function MyClass () {} + beforeEach(function () { + any = jasmine.any(MyClass); + }); + + it("doesn't match an object", function () { + expect(any.jasmineMatches({})).toEqual(false); + }); + + it("doesn't match a string", function () { + expect(any.jasmineMatches("")).toEqual(false); + }); + + it("doesn't match a number", function () { + expect(any.jasmineMatches(123)).toEqual(false); + }); + + it("doesn't match a function", function () { + expect(any.jasmineMatches(function () {})).toEqual(false); + }); + + it("matches an instance of the defined class", function () { + expect(any.jasmineMatches(new MyClass())).toEqual(true); + }); + }); + }); }); describe("all matchers", function() { diff --git a/src/core/Env.js b/src/core/Env.js index e9a672de..4ebc0963 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -230,12 +230,12 @@ jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { return a.getTime() == b.getTime(); } - if (a instanceof jasmine.Matchers.Any) { - return a.matches(b); + if (a.jasmineMatches) { + return a.jasmineMatches(b); } - if (b instanceof jasmine.Matchers.Any) { - return b.matches(a); + if (b.jasmineMatches) { + return b.jasmineMatches(a); } if (a instanceof jasmine.Matchers.ObjectContaining) { diff --git a/src/core/Matchers.js b/src/core/Matchers.js index e2072021..de372575 100644 --- a/src/core/Matchers.js +++ b/src/core/Matchers.js @@ -345,7 +345,7 @@ jasmine.Matchers.Any = function(expectedClass) { this.expectedClass = expectedClass; }; -jasmine.Matchers.Any.prototype.matches = function(other) { +jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { if (this.expectedClass == String) { return typeof other == 'string' || other instanceof String; } diff --git a/src/core/PrettyPrinter.js b/src/core/PrettyPrinter.js index c7845107..a7d283b6 100644 --- a/src/core/PrettyPrinter.js +++ b/src/core/PrettyPrinter.js @@ -23,7 +23,7 @@ jasmine.PrettyPrinter.prototype.format = function(value) { this.emitScalar('null'); } else if (value === jasmine.getGlobal()) { this.emitScalar(''); - } else if (value.hasOwnProperty("jasmineToString")) { + } else if (value.jasmineToString) { this.emitScalar(value.jasmineToString()); } else if (typeof value === 'string') { this.emitString(value);