jasmine/test/jsUnitMockTimeout.js
2009-03-01 05:34:00 -08:00

82 lines
2.8 KiB
JavaScript
Executable File

// Mock setTimeout, clearTimeout
// Contributed by Pivotal Computer Systems, www.pivotalsf.com
var Clock = {
timeoutsMade: 0,
scheduledFunctions: {},
nowMillis: 0,
reset: function() {
this.scheduledFunctions = {};
this.nowMillis = 0;
this.timeoutsMade = 0;
},
tick: function(millis) {
var oldMillis = this.nowMillis;
var newMillis = oldMillis + millis;
this.runFunctionsWithinRange(oldMillis, newMillis);
this.nowMillis = newMillis;
},
runFunctionsWithinRange: function(oldMillis, nowMillis) {
var scheduledFunc;
var funcsToRun = [];
for (var timeoutKey in this.scheduledFunctions) {
scheduledFunc = this.scheduledFunctions[timeoutKey];
if (scheduledFunc != undefined &&
scheduledFunc.runAtMillis >= oldMillis &&
scheduledFunc.runAtMillis <= nowMillis) {
funcsToRun.push(scheduledFunc);
this.scheduledFunctions[timeoutKey] = undefined;
}
}
if (funcsToRun.length > 0) {
funcsToRun.sort(function(a, b) {
return a.runAtMillis - b.runAtMillis;
});
for (var i = 0; i < funcsToRun.length; ++i) {
try {
this.nowMillis = funcsToRun[i].runAtMillis;
funcsToRun[i].funcToCall();
if (funcsToRun[i].recurring) {
Clock.scheduleFunction(funcsToRun[i].timeoutKey,
funcsToRun[i].funcToCall,
funcsToRun[i].millis,
true);
}
} catch(e) {
}
}
this.runFunctionsWithinRange(oldMillis, nowMillis);
}
},
scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
Clock.scheduledFunctions[timeoutKey] = {
runAtMillis: Clock.nowMillis + millis,
funcToCall: funcToCall,
recurring: recurring,
timeoutKey: timeoutKey,
millis: millis
};
}
};
function setTimeout(funcToCall, millis) {
Clock.timeoutsMade = Clock.timeoutsMade + 1;
Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, false);
return Clock.timeoutsMade;
}
function setInterval(funcToCall, millis) {
Clock.timeoutsMade = Clock.timeoutsMade + 1;
Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, true);
return Clock.timeoutsMade;
}
function clearTimeout(timeoutKey) {
Clock.scheduledFunctions[timeoutKey] = undefined;
}
function clearInterval(timeoutKey) {
Clock.scheduledFunctions[timeoutKey] = undefined;
}