Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 101 additions & 13 deletions test/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -390,22 +390,66 @@
var counter = 0;
var incr = function(){ counter++; };
var throttledIncr = _.throttle(incr, 100);
var origNowFunc = _.now;
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;

throttledIncr();
assert.strictEqual(counter, 1);
_.now = function() {
return new Date(2013, 0, 1, 1, 1, 1);
};
assert.strictEqual(counter, 1, 'incr was called immediately');

Date.prototype.getTime = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}
Date.now = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 2);
assert.strictEqual(counter, 2, 'incr was throttled successfully, with tampered system time');
done();
_.now = origNowFunc;
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
}, 200);
});

QUnit.test('throttle continues to function after system time is not accessible (or in invalid format)', function(assert) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow!

assert.expect(3);
var done = assert.async();
var counter = 0;
var incr = function(){ counter++; };
var throttledIncr = _.throttle(incr, 100);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;
var originalValueOfFunc = Date.prototype.valueOf;

throttledIncr();
assert.strictEqual(counter, 1, 'incr was called immediately');

Date.prototype.valueOf = function() {
return null;
}
Date.prototype.getTime = function() {
return null;
}
Date.now = function() {
return null;
}

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 2, 'incr was throttled successfully, with tampered system time');
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
Date.prototype.valueOf = originalValueOfFunc;
}, 200);

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 3, 'incr was throttled successfully, after system time method restoration');
done();
}, 400);
});

QUnit.test('throttle re-entrant', function(assert) {
assert.expect(2);
var done = assert.async();
Expand Down Expand Up @@ -542,26 +586,70 @@
assert.expect(2);
var done = assert.async();
var counter = 0;
var origNowFunc = _.now;
var debouncedIncr = _.debounce(function(){
counter++;
}, 100, true);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;

debouncedIncr();
assert.strictEqual(counter, 1, 'incr was called immediately');

_.now = function() {
return new Date(2013, 0, 1, 1, 1, 1);
};
Date.prototype.getTime = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}
Date.now = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 2, 'incr was debounced successfully');
assert.strictEqual(counter, 2, 'incr was debounced successfully, with tampered system time');
done();
_.now = origNowFunc;
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
}, 200);
});

QUnit.test('debounce after system time is is not accessible (or in invalid format)', function(assert) {
assert.expect(3);
var done = assert.async();
var counter = 0;
var debouncedIncr = _.debounce(function(){
counter++;
}, 100, true);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;
var originalValueOfFunc = Date.prototype.valueOf;

debouncedIncr();
assert.strictEqual(counter, 1, 'incr was called immediately');

Date.prototype.valueOf = function() {
return null;
};
Date.prototype.getTime = function() {
return null;
};
Date.now = function() {
return null;
};

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 2, 'incr was debounced successfully, with tampered system time');
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
Date.prototype.valueOf = originalValueOfFunc;
}, 200);

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 3, 'incr was debounced successfully, after system time method restoration');
done();
}, 400);
});

QUnit.test('debounce re-entrant', function(assert) {
assert.expect(2);
var done = assert.async();
Expand Down