'use strict';

const test = require('ava');
const TTLList = require('./ttl-list');
const moment = require('moment');

test.cb('should emit expire', (t) => {
    const list = new TTLList({
        interval: 20,
        expireAmount: 10,
        expireType: 'milliseconds',
    });

    list.on('expire', (entry) => {
        list.destroy();
        t.true(entry.n === 1);
        t.end();
    });

    list.add({ n: 1 });
});

test.cb('should slice off list', (t) => {
    const list = new TTLList({
        interval: 10,
        expireAmount: 10,
        expireType: 'milliseconds',
    });


    list.add({ n: '1' }, moment().add(1, 'milliseconds'));
    list.add({ n: '2' }, moment().add(50, 'milliseconds'));
    list.add({ n: '3' }, moment().add(200, 'milliseconds'));
    list.add({ n: '4' }, moment().add(300, 'milliseconds'));

    const expired = [];

    list.on('expire', (entry) => {
        // console.timeEnd(entry.n);
        expired.push(entry);
    });

    setTimeout(() => {
        t.true(expired.length === 1);
    }, 30);
    setTimeout(() => {
        t.true(expired.length === 2);
    }, 71);
    setTimeout(() => {
        t.true(expired.length === 3);
    }, 221);
    setTimeout(() => {
        t.true(expired.length === 4);
        list.destroy();
        t.end();
    }, 330);
});

'use strict';

const test = require('ava');
const TTLList = require('./ttl-list');
const moment = require('moment');
const sinon = require('sinon');

test.cb('should emit expire', (t) => {
    const list = new TTLList({
        interval: 20,
        expireAmount: 10,
        expireType: 'milliseconds',
    });

    list.on('expire', (entry) => {
        list.destroy();
        t.true(entry.n === 1);
        t.end();
    });

    list.add({ n: 1 });
});

test.cb('should slice off list', (t) => {
    const clock = sinon.useFakeTimers();

    const list = new TTLList({
        interval: 10,
        expireAmount: 10,
        expireType: 'milliseconds',
    });


    list.add({ n: '1' }, moment().add(1, 'milliseconds'));
    list.add({ n: '2' }, moment().add(50, 'milliseconds'));
    list.add({ n: '3' }, moment().add(200, 'milliseconds'));
    list.add({ n: '4' }, moment().add(300, 'milliseconds'));

    const expired = [];

    list.on('expire', (entry) => {
        // console.timeEnd(entry.n);
        expired.push(entry);
    });

    clock.tick(21);
    t.true(expired.length === 1);

    clock.tick(51);
    t.true(expired.length === 2);

    clock.tick(201);
    t.true(expired.length === 3);

    clock.tick(301);
    t.true(expired.length === 4);

    list.destroy();
    clock.restore();
    sinon.restore();

    t.end();
});

use fake timers for ttl test