zurvan
Version:
A library for simulating time in Node.js
139 lines (124 loc) • 4.38 kB
JavaScript
;
var TimeUnit = require('../TimeUnit');
var zurvan = require('../zurvan');
var assert = require('assert');
describe('zurvan', function() {
describe('under special configuration', function() {
it('runs at arbitrary time since process startup', function() {
return zurvan
.interceptTimers({ timeSinceStartup: 4 })
.then(function() {
assert.equal(4, process.uptime());
assert.deepEqual([4, 0], process.hrtime());
return zurvan.releaseTimers();
})
.then(function() {
return zurvan.interceptTimers({ timeSinceStartup: [100, 132587951] });
})
.then(function() {
assert(Math.abs(100.132587951 - process.uptime()) < 1e-12);
assert.deepEqual([100, 132587951], process.hrtime());
return zurvan.releaseTimers();
})
.then(function() {
return zurvan.interceptTimers({
timeSinceStartup: TimeUnit.microseconds(12e8 + 100)
});
})
.then(function() {
assert(Math.abs(1200.0001 - process.uptime()) < 1e-12);
assert.deepEqual([1200, 100000], process.hrtime());
return zurvan.releaseTimers();
})
.then(function() {
return zurvan.interceptTimers({ timeSinceStartup: [0, 1e10] });
})
.then(function() {
assert.equal(10, process.uptime());
assert.deepEqual([10, 0], process.hrtime());
return zurvan.releaseTimers();
});
});
it('runs at any required system time', function() {
return zurvan
.interceptTimers({ systemTime: Date.UTC(2015, 0, 5) })
.then(function() {
var nowDate = new Date();
assert.equal(nowDate.toISOString(), '2015-01-05T00:00:00.000Z');
assert.equal(0, process.uptime());
return zurvan.releaseTimers();
})
.then(function() {
return zurvan.interceptTimers({
systemTime: new Date(Date.UTC(2010, 5, 6))
});
})
.then(function() {
var nowDate = new Date();
assert.equal(nowDate.toISOString(), '2010-06-06T00:00:00.000Z');
assert.equal(0, process.uptime());
return zurvan.releaseTimers();
})
.then(function() {
return zurvan.interceptTimers({
systemTime: new Date(Date.UTC(1999, 9, 8, 15)).toString(),
timeSinceStartup: TimeUnit.seconds(45)
});
})
.then(function() {
var nowDate = new Date();
assert(nowDate.toISOString(), '1999-10-08T15:00:00.000Z');
assert.equal(45, process.uptime());
return zurvan.releaseTimers();
});
});
it('throws on invalid clearTimeout/clearInterval request', function() {
return zurvan
.interceptTimers({ throwOnInvalidClearTimer: true })
.then(function() {
assert.throws(function() {
clearTimeout(undefined);
}, /undefined/);
assert.throws(function() {
clearInterval(3);
}, /3/);
assert.throws(function() {
clearInterval({});
}, /{}/);
assert.throws(function() {
clearInterval(function() {
var t;
});
}, /var t;/);
assert.throws(function() {
clearTimeout({ uid: 3 });
});
var trickyRef = {
uid: 1
};
trickyRef.ref = trickyRef;
assert.throws(function() {
clearTimeout(trickyRef);
}, /not easily serializable/);
return zurvan.releaseTimers();
});
});
it('throws on invalid clearTimeout from setInterval and vice versa', function() {
return zurvan
.interceptTimers({ throwOnInvalidClearTimer: true })
.then(function() {
var timeoutId = setTimeout(function() {}, 100);
assert.throws(function() {
clearInterval(timeoutId);
}, /was not issued/);
clearTimeout(timeoutId);
var intervalId = setInterval(function() {}, 100);
assert.throws(function() {
clearTimeout(intervalId);
}, /was not issued/);
clearInterval(intervalId);
return zurvan.releaseTimers();
});
});
});
});