@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.
196 lines (157 loc) • 6.43 kB
JavaScript
// LongTerm 测试
// 测试基于NeDB的长期记忆实现
const { LongTerm } = require('./LongTerm.js');
const { EngramType } = require('../../engram/interfaces/Engram.js');
const fs = require('fs-extra');
const path = require('path');
describe('LongTerm 长期记忆测试', () => {
let longTerm;
let testDir;
beforeEach(async () => {
// 使用PromptX项目根目录的统一测试输出目录
const projectRoot = path.resolve(process.cwd(), '..');
testDir = path.join(projectRoot, 'test-output', 'long-term', Date.now().toString());
await fs.ensureDir(testDir);
const dbPath = path.join(testDir, 'test.db');
longTerm = new LongTerm(dbPath);
});
afterEach(async () => {
// 清理测试目录
if (testDir && await fs.pathExists(testDir)) {
await fs.remove(testDir);
}
});
describe('remember 功能测试', () => {
test('应该能存储基本的Engram', async () => {
// 准备
const engram = new TestEngram('学习JavaScript异步编程', null, EngramType.ATOMIC);
// 执行
await longTerm.remember(engram);
// 验证 - 通过recall来验证存储成功
const results = await longTerm.recall('JavaScript');
expect(results.length).toBe(1);
expect(results[0].content).toBe('学习JavaScript异步编程');
});
test('应该能更新已存在的Engram(upsert)', async () => {
// 准备 - 相同ID的engram
const id = 'test-id-123';
const engram1 = new TestEngram('原始内容', null, EngramType.ATOMIC, id);
const engram2 = new TestEngram('更新后的内容', null, EngramType.ATOMIC, id);
// 执行
await longTerm.remember(engram1);
await longTerm.remember(engram2);
// 验证 - 应该只有一条记录,且内容已更新
const results = await longTerm.recall('内容');
expect(results.length).toBe(1);
expect(results[0].content).toBe('更新后的内容');
});
test('应该正确提取和索引cues', async () => {
// 准备
const engram = new TestEngram(
'React组件的性能优化技巧',
null,
EngramType.ATOMIC
);
// 执行
await longTerm.remember(engram);
// 验证 - 每个关键词都能检索到
const reactResults = await longTerm.recall('react');
const componentResults = await longTerm.recall('组件');
const performanceResults = await longTerm.recall('性能');
expect(reactResults.length).toBe(1);
expect(componentResults.length).toBe(1);
expect(performanceResults.length).toBe(1);
});
});
describe('recall 功能测试', () => {
beforeEach(async () => {
// 准备测试数据
await longTerm.remember(new TestEngram('前端框架React学习', null, EngramType.ATOMIC));
await longTerm.remember(new TestEngram('Vue组件开发实践', null, EngramType.ATOMIC));
await longTerm.remember(new TestEngram('Angular性能优化', null, EngramType.ATOMIC));
});
test('无cue时应返回所有记忆', async () => {
// 执行
const results = await longTerm.recall();
// 验证
expect(results.length).toBe(3);
});
test('基于cue应返回匹配的记忆', async () => {
// 执行
const results = await longTerm.recall('react');
// 验证
expect(results.length).toBe(1);
expect(results[0].content).toContain('React');
});
test('应该按strength和timestamp排序', async () => {
// 创建新的LongTerm实例,避免受beforeEach影响
const testDir2 = path.join(process.cwd(), '..', 'test-output', 'sort-test');
await fs.ensureDir(testDir2);
const longTerm2 = new LongTerm(path.join(testDir2, 'test.db'));
// 准备 - 添加不同strength的记忆
const strongEngram = new TestEngram('重要的React知识', null, EngramType.ATOMIC);
strongEngram.strength = 0.9;
const weakEngram = new TestEngram('次要的React细节', null, EngramType.ATOMIC);
weakEngram.strength = 0.3;
await longTerm2.remember(strongEngram);
await longTerm2.remember(weakEngram);
// 执行
const results = await longTerm2.recall('react');
// 验证 - 强度高的应该排在前面
expect(results.length).toBe(2);
expect(results[0].content).toContain('重要的');
expect(results[0].strength).toBe(0.9);
// 清理
await fs.remove(testDir2);
});
test('应该支持中文分词', async () => {
// 准备
await longTerm.remember(new TestEngram('深度学习与神经网络', null, EngramType.ATOMIC));
// 执行
const results = await longTerm.recall('神经网络');
// 验证
expect(results.length).toBe(1);
});
});
describe('持久化测试', () => {
test('重启后应该能恢复数据', async () => {
// 准备
const dbPath = path.join(testDir, 'persist.db');
const longTerm1 = new LongTerm(dbPath);
// 第一次写入
await longTerm1.remember(new TestEngram('持久化测试数据', null, EngramType.ATOMIC));
// 创建新实例(模拟重启)
const longTerm2 = new LongTerm(dbPath);
// 验证数据仍然存在
const results = await longTerm2.recall('持久化');
expect(results.length).toBe(1);
expect(results[0].content).toBe('持久化测试数据');
});
});
describe('size 功能测试', () => {
test('应该正确返回记忆数量', async () => {
// 初始为0
expect(await longTerm.size()).toBe(0);
// 添加记忆
await longTerm.remember(new TestEngram('测试1', null));
await longTerm.remember(new TestEngram('测试2', null));
// 验证
expect(await longTerm.size()).toBe(2);
});
});
});
// 测试用的Engram实现
class TestEngram {
constructor(content, schema, type = EngramType.ATOMIC, id = null) {
this.id = id || Date.now().toString() + Math.random();
this.content = content;
this.schema = schema;
this.type = type;
this.timestamp = new Date();
this.strength = 1.0;
}
getId() { return this.id; }
getContent() { return this.content; }
getType() { return this.type; }
getStrength() { return this.strength; }
}