blob: 0a8f68f6b5d811cd883fa5201b74f13256657c53 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="mock_timer.js"></script>
</head>
<body>
<script>
var mockTimer;
/**
* Counter class for tallying the number if times a calback is triggered.
* @constructor
*/
function ClickCounter() {
}
ClickCounter.prototype = {
/**
* Nubmer of times the callback was triggered.
* @type{number}
* @private
*/
clickCount_: 0,
/** Increments click count */
tick: function() {
this.clickCount_++;
},
/**
* Creates a callback function that tracks the number of calls.
* @return {!Function}
*/
createCallback: function() {
var self = this;
return function() {
self.tick();
};
},
/**
* Nubmer of times the callback was triggered.
* @type {number}
*/
get value() {
return this.clickCount_;
}
}
function setUp() {
mockTimer = new MockTimer();
mockTimer.install();
}
function tearDown() {
mockTimer.uninstall();
}
function testSetTimeout() {
var counter = new ClickCounter();
window.setTimeout(counter.createCallback(), 100);
assertEquals(0, counter.value);
mockTimer.tick(50);
assertEquals(0, counter.value);
mockTimer.tick(100);
assertEquals(1, counter.value);
mockTimer.tick(100);
assertEquals(1, counter.value);
}
function testClearTimeout() {
var counter = new ClickCounter();
var t = window.setTimeout(counter.createCallback(), 100);
// Verify that clearing a timeout before the elapsed time does not trigger
// the callback.
window.clearTimeout(t);
mockTimer.tick(200);
assertEquals(0, counter.value);
}
function testSetAndClearInterval() {
var counter = new ClickCounter();
var t = window.setInterval(counter.createCallback(), 100);
// Verify that callback doesn't fire before elapsed interval.
assertEquals(0, counter.value);
mockTimer.tick(50);
// Verify that each elapsed time interval advances the count by 1.
assertEquals(0, counter.value);
mockTimer.tick(100);
assertEquals(1, counter.value);
mockTimer.tick(100);
assertEquals(2, counter.value);
mockTimer.tick(100);
assertEquals(3, counter.value);
// Verify that callbacks stop firing after timer is cleared.
window.clearInterval(t);
mockTimer.tick(100);
assertEquals(3, counter.value);
}
function testInterleavedTimers() {
var results = '';
var createCallback = function(response) {
var label = response;
return function() {
results = results + label;
};
};
// Verify callbacks are properly interleaved.
var t1 = window.setInterval(createCallback('A'), 7);
var t2 = window.setInterval(createCallback('B'), 13);
mockTimer.tick(30);
assertEquals('ABAABA', results);
mockTimer.tick(30);
assertEquals('ABAABAABAABA', results);
window.clearInterval(t1);
window.setTimeout(createCallback('C'), 11);
mockTimer.tick(30);
assertEquals('ABAABAABAABABCB', results);
window.clearInterval(t2);
mockTimer.tick(30);
assertEquals('ABAABAABAABABCB', results);
}
</script>
</body>
</html>