From 5f429fcb37fc10ebeeaacae6ddf48d6078ede1c6 Mon Sep 17 00:00:00 2001 From: Sheel Choksi Date: Sun, 20 Oct 2013 21:58:16 -0700 Subject: [PATCH] Re-enable CustomMatchersSpec and update for current version of custom matchers --- spec/core/CustomMatchersSpec.js | 222 ++++++++++++++++++-------------- src/core/Env.js | 2 +- 2 files changed, 128 insertions(+), 96 deletions(-) diff --git a/spec/core/CustomMatchersSpec.js b/spec/core/CustomMatchersSpec.js index 55676d19..9f449aa2 100644 --- a/spec/core/CustomMatchersSpec.js +++ b/spec/core/CustomMatchersSpec.js @@ -1,95 +1,127 @@ -////TODO: matchers should be add-able to the env, not to the spec. -//describe("Custom Matchers", function() { -// var env; -// var fakeTimer; -// -// beforeEach(function() { -// env = new jasmine.Env(); -// }); -// -// it("should be easy to add more matchers local to a spec, suite, etc.", function() { -// var spec1, spec2, spec1Matcher, spec2Matcher; -// var suite = env.describe('some suite', function() { -// env.beforeEach(function() { -// this.addMatchers({ -// matcherForSuite: function(expected) { -// this.message = "matcherForSuite: actual: " + this.actual + "; expected: " + expected; -// return true; -// } -// }); -// }); -// -// spec1 = env.it('spec with an expectation').runs(function () { -// this.addMatchers({ -// matcherForSpec: function(expected) { -// this.message = "matcherForSpec: actual: " + this.actual + "; expected: " + expected; -// return true; -// } -// }); -// spec1Matcher = this.expect("xxx"); -// }); -// -// spec2 = env.it('spec with failing expectation').runs(function () { -// spec2Matcher = this.expect("yyy"); -// }); -// }); -// -// suite.execute(); -// -// spec1Matcher.matcherForSuite("expected"); -// expect(spec1Matcher.message).toEqual("matcherForSuite: actual: xxx; expected: expected"); -// spec1Matcher.matcherForSpec("expected"); -// expect(spec1Matcher.message).toEqual("matcherForSpec: actual: xxx; expected: expected"); -// -// spec2Matcher.matcherForSuite("expected"); -// expect(spec2Matcher.message).toEqual("matcherForSuite: actual: yyy; expected: expected"); -// expect(spec2Matcher.matcherForSpec).toBe(jasmine.undefined); -// }); -// -// it("should generate messages with the same rules as for regular matchers when this.report() is not called", function() { -// var spec; -// var suite = env.describe('some suite', function() { -// spec = env.it('spec with an expectation').runs(function () { -// this.addMatchers({ -// toBeTrue: function() { -// return this.actual === true; -// } -// }); -// this.expect(true).toBeTrue(); -// this.expect(false).toBeTrue(); -// }); -// }); -// -// suite.execute(); -// -// var results = spec.results().getItems(); -// expect(results[0].message).toEqual("Passed."); -// expect(results[1].message).toEqual("Expected false to be true."); -// }); -// -// it("should pass args", function() { -// var matcherCallArgs = []; -// var spec; -// var suite = env.describe('some suite', function() { -// spec = env.it('spec with an expectation').runs(function () { -// this.addMatchers({ -// toBeTrue: function() { -// matcherCallArgs.push(jasmine.util.argsToArray(arguments)); -// return this.actual === true; -// } -// }); -// this.expect(true).toBeTrue(); -// this.expect(false).toBeTrue('arg'); -// this.expect(true).toBeTrue('arg1', 'arg2'); -// }); -// }); -// -// suite.execute(); -// var results = spec.results().getItems(); -// expect(results[0].expected).toEqual(jasmine.undefined); -// expect(results[1].expected).toEqual('arg'); -// expect(results[2].expected).toEqual(['arg1', 'arg2']); -// -// expect(matcherCallArgs).toEqual([[], ['arg'], ['arg1', 'arg2']]); -// }); -//}); +describe("Custom Matchers (Integration)", function() { + var env; + var fakeTimer; + + beforeEach(function() { + env = new j$.Env(); + }); + + it("allows adding more matchers local to a spec", function(done) { + env.it('spec defining a custom matcher', function() { + env.addMatchers({ + matcherForSpec: function() { + return { + compare: function(actual, expected) { + return { pass: false, message: "matcherForSpec: actual: " + actual + "; expected: " + expected }; + } + } + } + }); + + env.expect("zzz").matcherForSpec("yyy"); + }); + + env.it("spec without custom matcher defined", function() { + expect(env.expect("zzz").matcherForSpec).toBeUndefined(); + }); + + var specDoneSpy = jasmine.createSpy("specDoneSpy"); + var expectations = function() { + var firstSpecResult = specDoneSpy.calls.first().args[0]; + expect(firstSpecResult.status).toEqual("failed"); + expect(firstSpecResult.failedExpectations[0].message).toEqual("matcherForSpec: actual: zzz; expected: yyy"); + done(); + }; + env.addReporter({ specDone:specDoneSpy, jasmineDone: expectations}); + + env.execute(); + }); + + it("passes the spec if the custom matcher passes", function(done) { + env.addMatchers({ + toBeReal: function() { + return { compare: function() { return { pass: true }; } }; + } + }); + + env.it("spec using custom matcher", function() { + env.expect(true).toBeReal(); + }); + + var specExpectations = function(result) { + expect(result.status).toEqual('passed'); + }; + + env.addReporter({ specDone: specExpectations, jasmineDone: done }); + env.execute(); + }); + + it("generates messages with the same rules as built in matchers absent a custom message", function(done) { + env.addMatchers({ + toBeReal: function() { + return { + compare: function() { + return { pass: false }; + } + } + } + }); + + env.it('spec with an expectation', function() { + env.expect("a").toBeReal(); + }); + + var specExpectations = function(result) { + expect(result.failedExpectations[0].message).toEqual("Expected 'a' to be real."); + }; + + env.addReporter({ specDone: specExpectations, jasmineDone: done }); + env.execute(); + }); + + it("passes the expected and actual arguments to the comparison function", function(done) { + var argumentSpy = jasmine.createSpy("argument spy").and.returnValue({ pass: true }); + env.addMatchers({ + toBeReal: function() { + return { compare: argumentSpy }; + } + }); + + env.it('spec with an expectation', function () { + env.expect(true).toBeReal(); + env.expect(true).toBeReal("arg"); + env.expect(true).toBeReal("arg1", "arg2"); + }); + + var specExpectations = function() { + expect(argumentSpy).toHaveBeenCalledWith(true); + expect(argumentSpy).toHaveBeenCalledWith(true, "arg"); + expect(argumentSpy).toHaveBeenCalledWith(true, "arg1", "arg2"); + }; + + env.addReporter({ specDone: specExpectations, jasmineDone: done }); + env.execute(); + }); + + it("passes the jasmine utility and current equality matchers to the expectation factory", function(done) { + var matcherFactory = function() { return { compare: function() { return {pass: true}; }}; }, + argumentSpy = jasmine.createSpy("argument spy").and.returnValue(matcherFactory), + customEqualityFn = function() { return true; }; + + env.addCustomEqualityTester(customEqualityFn); + env.addMatchers({ + toBeReal: argumentSpy + }); + + env.it("spec with expectation", function() { + env.expect(true).toBeReal(); + }); + + var specExpectations = function() { + expect(argumentSpy).toHaveBeenCalledWith(j$.matchersUtil, [customEqualityFn]); + }; + + env.addReporter({ specDone: specExpectations, jasmineDone: done }); + env.execute(); + }); +}); diff --git a/src/core/Env.js b/src/core/Env.js index 4df5a0e1..914ebf8a 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -169,7 +169,7 @@ getJasmineRequireObj().Env = function(j$) { function specResultCallback(result) { removeAllSpies(); j$.Expectation.resetMatchers(); - customEqualityTesters.length = 0; + customEqualityTesters = []; self.currentSpec = null; self.reporter.specDone(result); }