summaryrefslogtreecommitdiffstats
path: root/spec/lib/RAFPlugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/RAFPlugin.js')
-rw-r--r--spec/lib/RAFPlugin.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/spec/lib/RAFPlugin.js b/spec/lib/RAFPlugin.js
new file mode 100644
index 0000000..fefdda6
--- /dev/null
+++ b/spec/lib/RAFPlugin.js
@@ -0,0 +1,82 @@
+/**
+ * Jasmine RequestAnimationFrame: a set of helpers for testing funcionality
+ * that uses requestAnimationFrame under the Jasmine BDD framework for JavaScript.
+ */
+;(function() {
+
+ var index = 0,
+ callbacks = [];
+
+ function MockRAF(global) {
+ this.realRAF = global.requestAnimationFrame,
+ this.realCAF = global.cancelAnimationFrame,
+ this.realPerf = global.performance,
+ this.nextTime = 0
+
+ var _this = this
+
+ /**
+ * Mock for window.requestAnimationFrame
+ */
+ this.mockRAF = function(fn) {
+ if (typeof fn !== 'function') {
+ throw new Error('You should pass a function to requestAnimationFrame');
+ }
+
+ callbacks[index++] = fn;
+
+ return index;
+ };
+
+ /**
+ * Mock for window.cancelAnimationFrame
+ */
+ this.mockCAF = function(requestID) {
+ callbacks.splice(requestID, 1)
+ };
+
+ this.mockPerf = {
+ now: function () {
+ return _this.nextTime
+ }
+ }
+
+ /**
+ * Install request animation frame mocks.
+ */
+ this.install = function() {
+ global.requestAnimationFrame = _this.mockRAF;
+ global.cancelAnimationFrame = _this.mockCAF;
+ global.performance = _this.mockPerf;
+ };
+
+ /**
+ * Uninstall request animation frame mocks.
+ */
+ this.uninstall = function() {
+ global.requestAnimationFrame = _this.realRAF;
+ global.cancelAnimationFrame = _this.realCAF;
+ global.performance = _this.realPerf;
+ };
+
+ /**
+ * Simulate animation frame readiness.
+ */
+ this.tick = function(dt) {
+ _this.nextTime += (dt || 1)
+
+ var fns = callbacks, fn, i;
+
+ callbacks = [];
+ index = 0;
+
+ for (i in fns) {
+ fn = fns[i];
+ fn(_this.nextTime);
+ }
+ };
+ }
+
+
+ jasmine.RequestAnimationFrame = new MockRAF(window);
+}());