@promptx/cli
Version:
DPML-powered AI prompt framework - Revolutionary AI-First CLI system based on Deepractice Prompt Markup Language. Build sophisticated AI agents with structured prompts, memory systems, and execution frameworks.
274 lines (214 loc) • 9.28 kB
JavaScript
// MemoryService.test.js - 记忆服务 TDD 测试
// 极简设计:只有 remember 和 recall 两个核心方法
describe('MemoryService 极简测试', () => {
let MemoryService;
let Engram;
let EngramType;
let memoryService;
beforeAll(() => {
// 动态导入
try {
MemoryService = require('./MemoryService').MemoryService;
} catch (e) {
MemoryService = null;
}
Engram = require('../engram/Engram').Engram;
EngramType = require('../engram/interfaces/Engram').EngramType;
});
beforeEach(() => {
if (MemoryService) {
memoryService = new MemoryService();
}
});
afterEach(() => {
// 清理内存中的数据,避免测试间干扰
if (memoryService) {
memoryService = null;
}
});
describe('1. 基本功能测试', () => {
test('remember() - 保存单个记忆', async () => {
if (!MemoryService) return;
const engram = new Engram('测试记忆内容', null, EngramType.ATOMIC);
memoryService.remember(engram);
const results = await await memoryService.recall();
expect(results).toHaveLength(1);
expect(results[0].getContent()).toBe('测试记忆内容');
});
test('remember() - 保存多个记忆', async () => {
if (!MemoryService) return;
const memories = [
new Engram('JavaScript异步编程', null, EngramType.ATOMIC),
new Engram('React组件设计', null, EngramType.ATOMIC),
new Engram('Node.js后端开发', null, EngramType.ATOMIC)
];
memories.forEach(m => memoryService.remember(m));
const results = await memoryService.recall();
expect(results).toHaveLength(3);
});
test('recall() - 无参数返回所有记忆', async () => {
if (!MemoryService) return;
memoryService.remember(new Engram('记忆1', null));
memoryService.remember(new Engram('记忆2', null));
const results = await memoryService.recall();
expect(results).toHaveLength(2);
expect(results.map(r => r.getContent())).toContain('记忆1');
expect(results.map(r => r.getContent())).toContain('记忆2');
});
test('recall() - 根据线索检索记忆', async () => {
if (!MemoryService) return;
memoryService.remember(new Engram('JavaScript Promise用法', null));
memoryService.remember(new Engram('Python异步编程', null));
memoryService.remember(new Engram('JavaScript async/await', null));
const jsResults = await memoryService.recall('JavaScript');
expect(jsResults).toHaveLength(2);
expect(jsResults.every(r => r.getContent().includes('JavaScript'))).toBe(true);
});
test('recall() - 大小写不敏感搜索', async () => {
if (!MemoryService) return;
memoryService.remember(new Engram('React组件开发', null));
const results1 = await memoryService.recall('react');
const results2 = await memoryService.recall('REACT');
const results3 = await memoryService.recall('React');
expect(results1).toHaveLength(1);
expect(results2).toHaveLength(1);
expect(results3).toHaveLength(1);
});
});
describe('2. 短期-长期记忆协作', () => {
test('短期记忆溢出时自动转移到长期记忆', async () => {
if (!MemoryService) return;
// 填充超过短期记忆容量(假设为7)
for (let i = 0; i < 10; i++) {
memoryService.remember(new Engram(`记忆${i}`, null));
}
// 等待异步巩固完成
await new Promise(resolve => setTimeout(resolve, 100));
// 所有记忆都应该能被检索到
const results = await memoryService.recall();
expect(results).toHaveLength(10);
// 验证所有记忆都存在
const contents = results.map(r => r.getContent());
for (let i = 0; i < 10; i++) {
expect(contents).toContain(`记忆${i}`);
}
});
test('重要记忆优先保留', async () => {
if (!MemoryService) return;
// 创建不同重要性的记忆
const importantMemory = new Engram('重要:系统架构决策', null);
importantMemory.strength = 1.0;
const normalMemory = new Engram('普通:今日会议记录', null);
normalMemory.strength = 0.5;
memoryService.remember(importantMemory);
memoryService.remember(normalMemory);
// 填充大量普通记忆
for (let i = 0; i < 20; i++) {
const m = new Engram(`临时记忆${i}`, null);
m.strength = 0.3;
memoryService.remember(m);
}
// 等待异步巩固完成
await new Promise(resolve => setTimeout(resolve, 50));
// 重要记忆应该还能被检索到
const results = await memoryService.recall('系统架构');
expect(results).toHaveLength(1);
expect(results[0].getContent()).toContain('系统架构决策');
});
});
describe('3. 边界情况处理', () => {
test('空记忆库的recall返回空数组', async () => {
if (!MemoryService) return;
const results = await memoryService.recall();
expect(results).toEqual([]);
});
test('recall空字符串返回所有记忆', async () => {
if (!MemoryService) return;
memoryService.remember(new Engram('测试内容', null));
const results = await memoryService.recall('');
expect(results).toHaveLength(1);
});
test('recall不存在的关键词返回空数组', async () => {
if (!MemoryService) return;
memoryService.remember(new Engram('JavaScript编程', null));
memoryService.remember(new Engram('Python开发', null));
const results = await memoryService.recall('Ruby');
expect(results).toEqual([]);
});
});
describe('4. 性能和容量测试', () => {
test('处理大量记忆的性能', async () => {
if (!MemoryService) return;
const startTime = Date.now();
// 添加1000个记忆
for (let i = 0; i < 1000; i++) {
memoryService.remember(new Engram(`性能测试记忆${i}`, null));
}
// 记忆存储应该在合理时间内完成(<100ms)
const storeTime = Date.now() - startTime;
expect(storeTime).toBeLessThan(100);
// 检索性能测试
const searchStart = Date.now();
const results = await memoryService.recall('测试记忆500');
const searchTime = Date.now() - searchStart;
expect(searchTime).toBeLessThan(50);
expect(results.length).toBeGreaterThan(0);
});
});
describe('5. 集成场景测试', () => {
test('模拟真实使用场景:学习过程', async () => {
if (!MemoryService) return;
// 模拟学习JavaScript的过程
const learningPath = [
'变量声明:let, const, var的区别',
'函数定义:箭头函数vs普通函数',
'异步编程:Promise基础',
'异步编程:async/await用法',
'React基础:组件和Props',
'React进阶:Hooks使用',
'Node.js:事件循环机制',
'性能优化:防抖和节流',
'TypeScript:类型系统入门'
];
// 模拟逐步学习
learningPath.forEach((topic, index) => {
const engram = new Engram(topic, null);
// 越早学的内容强度越低(模拟遗忘)
engram.strength = 1.0 - (index * 0.1);
memoryService.remember(engram);
});
// 检索异步编程相关内容
const asyncResults = await memoryService.recall('异步');
expect(asyncResults).toHaveLength(2);
// 检索React相关内容
const reactResults = await memoryService.recall('React');
expect(reactResults).toHaveLength(2);
// 检索所有内容
const allResults = await memoryService.recall();
expect(allResults.length).toBeGreaterThanOrEqual(9);
});
test('模拟对话场景:上下文记忆', async () => {
if (!MemoryService) return;
// 模拟一段对话的记忆
const conversation = [
{ role: 'user', content: '帮我设计一个用户认证系统' },
{ role: 'assistant', content: '使用JWT token进行无状态认证' },
{ role: 'user', content: '如何处理token刷新?' },
{ role: 'assistant', content: '实现refresh token机制,设置不同过期时间' },
{ role: 'user', content: '安全性如何保证?' },
{ role: 'assistant', content: 'HTTPS传输,token加密存储,防止XSS和CSRF攻击' }
];
// 存储对话记忆
conversation.forEach(turn => {
const content = `${turn.role}: ${turn.content}`;
memoryService.remember(new Engram(content, null));
});
// 检索认证相关对话
const authResults = await memoryService.recall('认证');
expect(authResults.length).toBeGreaterThan(0);
// 检索安全相关内容
const securityResults = await memoryService.recall('安全');
expect(securityResults.length).toBeGreaterThan(0);
});
});
});