/* 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);