angular-scroll-animate
Version:
An Angular.js directive which allows you to perform any javascript actions (in the controller, or on the element) when an element is scrolled into, or out of, the users viewport, without any other dependencies.
59 lines (46 loc) • 2.01 kB
JavaScript
/* global jasmine */
;
(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);