blob: c49ff926686a96fed4dd8a80b6a44486afa87250 [file] [log] [blame]
/* 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);