Files
Notes/tests/unit/lru-cache.test.js
2026-10-16 16:34:15 +08:00

80 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// P2-6(audit):main/ai.js 的 pickOpenAITokenConfig / joinUrl 每次调用重复
// 正则解析。AI 流式期间同 model / 同 baseURL 反复命中,加 LRU 缓存省 CPU。
//
// 设计:main/lru-cache.js 通用 createLruCache({ maxSize }) →
// get(key) / set(key, value) / has(key) / size
// - Map 迭代序 = 插入序;get 命中时 delete+set 提到最新(LRU 语义)
// - set 超 maxSize 时删最老(Map 第一个键)
// - maxSize 默认 64
import { describe, it, expect } from 'vitest';
const { createLruCache } = require('../../main/lru-cache.js');
describe('createLruCache —— P2-6 通用 LRU', () => {
it('set/get 往返', () => {
const c = createLruCache({ maxSize: 4 });
c.set('a', 1);
expect(c.get('a')).toBe(1);
expect(c.has('a')).toBe(true);
expect(c.get('missing')).toBeUndefined();
expect(c.has('missing')).toBe(false);
});
it('超 maxSize 删最老的键', () => {
const c = createLruCache({ maxSize: 2 });
c.set('a', 1);
c.set('b', 2);
c.set('c', 3); // a 应被挤掉
expect(c.has('a')).toBe(false);
expect(c.has('b')).toBe(true);
expect(c.has('c')).toBe(true);
expect(c.size).toBe(2);
});
it('get 命中提到最新,延缓被淘汰', () => {
const c = createLruCache({ maxSize: 2 });
c.set('a', 1);
c.set('b', 2);
c.get('a'); // a 提最新,b 变老
c.set('c', 3); // 挤掉 b 而非 a
expect(c.has('a')).toBe(true);
expect(c.has('b')).toBe(false);
});
it('重复 set 同键覆盖值且不增 size', () => {
const c = createLruCache({ maxSize: 2 });
c.set('a', 1);
c.set('a', 2);
expect(c.get('a')).toBe(2);
expect(c.size).toBe(1);
});
it('重复 set 同键视为「使用」,提到最新', () => {
const c = createLruCache({ maxSize: 2 });
c.set('a', 1);
c.set('b', 2);
c.set('a', 9); // a 提最新
c.set('c', 3); // 挤掉 b
expect(c.get('a')).toBe(9);
expect(c.has('b')).toBe(false);
});
it('默认 maxSize=64', () => {
const c = createLruCache();
for (let i = 0; i < 70; i++) c.set('k' + i, i);
expect(c.size).toBe(64);
expect(c.has('k0')).toBe(false);
expect(c.has('k69')).toBe(true);
});
it('值可以是对象 / undefined 以外的任意类型', () => {
const c = createLruCache({ maxSize: 4 });
const obj = { x: 1 };
c.set('o', obj);
c.set('n', null);
expect(c.get('o')).toBe(obj);
expect(c.get('n')).toBeNull();
expect(c.has('n')).toBe(true);
});
});