| /* global jasmine */ |
| |
| 'use strict'; |
| |
| (function(jasmine, beforeEach) { |
| |
| var sinon = (typeof require === 'function' && typeof module === 'object') ? require('sinon') : window.sinon, |
| spyMatchers = 'called calledOnce calledTwice calledThrice calledBefore calledAfter calledOn alwaysCalledOn calledWith alwaysCalledWith calledWithExactly alwaysCalledWithExactly calledWithMatch alwaysCalledWithMatch'.split(' '), |
| i = spyMatchers.length, |
| spyMatcherHash = {}, |
| unusualMatchers = { |
| "returned": "toHaveReturned", |
| "alwaysReturned": "toHaveAlwaysReturned", |
| "threw": "toHaveThrown", |
| "alwaysThrew": "toHaveAlwaysThrown" |
| }, |
| |
| createCustomMatcher = function(arg) { |
| return sinon.match(function (val) { |
| return jasmine.getEnv().equals_(val, arg); |
| }); |
| }, |
| |
| getMatcherFunction = function(sinonName, matcherName) { |
| var original = jasmine.Matchers.prototype[matcherName]; |
| return function () { |
| if (jasmine.isSpy(this.actual) && original) { |
| return original.apply(this, arguments); |
| } |
| var sinonProperty = this.actual[sinonName]; |
| var args = Array.prototype.slice.call(arguments); |
| |
| for (var i = 0; i < args.length; i++) { |
| if (args[i] && (typeof args[i].jasmineMatches === 'function' || args[i] instanceof jasmine.Matchers.ObjectContaining)) { |
| args[i] = createCustomMatcher(args[i]); |
| } |
| } |
| |
| return (typeof sinonProperty === 'function') ? sinonProperty.apply(this.actual, args) : sinonProperty; |
| }; |
| }; |
| |
| while(i--) { |
| var sinonName = spyMatchers[i], |
| matcherName = "toHaveBeen" + sinonName.charAt(0).toUpperCase() + sinonName.slice(1); |
| |
| spyMatcherHash[matcherName] = getMatcherFunction(sinonName, matcherName); |
| } |
| |
| for (var j in unusualMatchers) { |
| spyMatcherHash[unusualMatchers[j]] = getMatcherFunction(j, unusualMatchers[j]); |
| } |
| |
| beforeEach(function() { |
| this.addMatchers(spyMatcherHash); |
| }); |
| |
| })(jasmine, beforeEach); |