61c6ab3fb0
functional tests, unless a whole lot of mock objects are introduced, which isn't entirely out of the question). Uses JsUnit, which is included in this commit.
82 lines
2.8 KiB
JavaScript
82 lines
2.8 KiB
JavaScript
// 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;
|
|
}
|