123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- var memoizer = require('./..');
- var assert = require('chai').assert;
- describe('lru-memoizer (queueMaxAge)', function () {
- var loadTimes = 0, memoized;
- beforeEach(function () {
- loadTimes = 0;
- });
- function observer() {
- const listeners = [];
- return {
- listen(listener) {
- listeners.push(listener);
- },
- trigger() {
- listeners.forEach(listener => listener());
- }
- }
- }
- it('should create a new queue once expired', function (done) {
- memoized = memoizer({
- load: function (a, b, onResolve, callback) {
- loadTimes++;
- onResolve(() => callback(null, a + b));
- },
- queueMaxAge: 10,
- hash: function (a, b) {
- return a + '-' + b;
- }
- });
- const observer1 = observer();
- const observer2 = observer();
- const observer3 = observer();
- const resolved = [];
- memoized(1, 2, observer1.listen, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('A');
- });
- assert.strictEqual(loadTimes, 1);
- memoized(1, 2, assert.fail, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('B');
- });
- assert.strictEqual(loadTimes, 1);
- setTimeout(() => {
- // previous queue expired, this calls will be added to a new queue.
- memoized(1, 2, observer2.listen, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('C');
- });
- memoized(1, 2, assert.fail, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('D');
- });
- // only one new invocation to load
- assert.strictEqual(loadTimes, 2);
- setTimeout(() => {
- // second queue expired, this calls will be added to a third queue.
- memoized(1, 2, observer3.listen, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('E');
- });
- memoized(1, 2, assert.fail.listen, function (err, result) {
- assert.isNull(err);
- assert.strictEqual(result, 3);
- resolved.push('F');
- });
- assert.strictEqual(loadTimes, 3);
- observer1.trigger();
- setImmediate(() => {
- // first queue was resolved
- assert.deepEqual(['A', 'B'], resolved);
- observer3.trigger();
- setImmediate(() => {
- // third queue was resolved
- assert.deepEqual(['A', 'B', 'E', 'F'], resolved);
- observer2.trigger();
- setImmediate(() => {
- // second queue was resolved
- assert.deepEqual(['A', 'B', 'E', 'F', 'C', 'D'], resolved);
- done();
- });
- });
- });
- }, 100);
- }, 100);
- });
- });
|