Home Reference Source Test

test/generic/utils/LRUMap.spec.js

describe('LRUMap', () => {

    it('does can store key-value pairs', () => {
        const lru = new LRUMap(10);

        // Fill map.
        for (let i=0; i<10; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        // Check contents.
        for (let i=0; i<10; ++i) {
            expect(lru.get(`key${i}`)).toEqual(`value${i}`);
        }
    });

    it('evicts old entries', () => {
        const lru = new LRUMap(2);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        expect(lru.size).toBe(2);

        // Check contents.
        for (let i=0; i<3; ++i) {
            expect(lru.has(`key${i}`)).toEqual(i > 0);
        }
    });

    it('does not evict recently accessed entries', () => {
        const lru = new LRUMap(2);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
            if (i === 1) {
                lru.get(`key0`);
            }
        }

        expect(lru.size).toBe(2);

        // Check contents.
        for (let i=0; i<3; ++i) {
            expect(lru.has(`key${i}`)).toEqual(i !== 1);
        }
    });

    it('has a working iterator', () => {
        const lru = new LRUMap(3);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
            if (i === 1) {
                lru.get(`key0`);
            }
        }

        // Check contents.
        for (const [key, value] of lru) {
            expect(key.startsWith('key')).toEqual(true);
            expect(value.startsWith('value')).toEqual(true);
        }
    });

    it('can evict multiple entries', () => {
        const lru = new LRUMap(3);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        lru.evict(2);

        expect(lru.size).toBe(1);

        // Check contents.
        for (const [key, value] of lru) {
            expect(key).toEqual('key2');
            expect(value).toEqual('value2');
        }
    });

    it('can be cleared', () => {
        const lru = new LRUMap(3);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        lru.clear();

        expect(lru.size).toBe(0);

        // Check contents.
        for (const [key, value] of lru) {
            expect(true).toBe(false);
        }
        expect(true).toBe(true);
    });

    it('does not exceed maxSize', () => {
        const lru = new LRUMap(3);

        // Fill map.
        for (let i=0; i<4; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        expect(lru.size).toBe(3);
        expect(lru.has('test')).toBe(false);
        for (let i=0; i<4; ++i) {
            expect(lru.has(`key${i}`)).toBe(i !== 0);
        }
    });

    it('works with empty LRU maps', () => {
        const lru = new LRUMap(0);

        // Fill map.
        for (let i=0; i<3; ++i) {
            lru.set(`key${i}`, `value${i}`);
        }

        // Check contents.
        expect(lru.size).toBe(0);
    });
});