Files
Partner/src/test/java/memory/InsertTest.java
slhafzjw a83cf26f40 - 更新了WebSocket服务器的启动逻辑
- 发现了agent, websocket, interactionHub之间的循环引用导致IDEA调试出错问题,通过exclude解决
- 实现了CoreModel的execute执行逻辑,并且系统提示词将动态拼接以适应不同模块
- 移动EvaluatedSlice至shared/memory包下,避免层级混淆
- 提取清洗json方法至独立的工具类
- 将agent通过InputReceiver接口暴露至socketServer,而非直接交给其完整实例
- 调整模块加载时机->InteractionHub加载时进行加载
- 调整MemoryGraph中userDialogMap的结构,换用以用户id为主键
- 初步进行测试,记忆更新逻辑暂未实现
2025-04-25 23:08:01 +08:00

165 lines
6.5 KiB
Java
Raw 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.
package memory;
import org.junit.Before;
import org.junit.Test;
import work.slhaf.agent.core.memory.MemoryGraph;
import work.slhaf.agent.core.memory.node.MemoryNode;
import work.slhaf.agent.core.memory.node.TopicNode;
import work.slhaf.agent.core.memory.pojo.MemorySlice;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.*;
public class InsertTest {
private MemoryGraph memoryGraph;
private final String testId = "test_insert";
@Before
public void setUp() {
memoryGraph = new MemoryGraph(testId);
memoryGraph.setTopicNodes(new HashMap<>());
memoryGraph.setExistedTopics(new HashMap<>());
}
@Test
public void testInsertMemory_NewRootTopic() throws IOException, ClassNotFoundException {
// 准备测试数据
List<String> topicPath = new LinkedList<>(Arrays.asList("Programming", "Java", "Collections"));
MemorySlice slice = createTestMemorySlice("slice1");
// 执行测试
memoryGraph.insertMemory(topicPath, slice);
// 验证结果
assertTrue(memoryGraph.getTopicNodes().containsKey("Programming"));
TopicNode programmingNode = memoryGraph.getTopicNodes().get("Programming");
assertTrue(programmingNode.getTopicNodes().containsKey("Java"));
TopicNode javaNode = programmingNode.getTopicNodes().get("Java");
assertTrue(javaNode.getTopicNodes().containsKey("Collections"));
TopicNode collectionsNode = javaNode.getTopicNodes().get("Collections");
assertEquals(1, collectionsNode.getMemoryNodes().size());
MemoryNode memoryNode = collectionsNode.getMemoryNodes().get(0);
assertEquals(LocalDate.now(), memoryNode.getLocalDate());
assertEquals(1, memoryNode.loadMemorySliceList().size());
assertEquals(slice, memoryNode.loadMemorySliceList().get(0));
}
@Test
public void testInsertMemory_ExistingTopicPath() throws IOException, ClassNotFoundException {
// 准备初始数据
List<String> topicPath1 = new LinkedList<>(Arrays.asList("Programming", "Java", "Collections"));
MemorySlice slice1 = createTestMemorySlice("slice1");
memoryGraph.insertMemory(topicPath1, slice1);
// 插入第二个记忆片段到相同路径
List<String> topicPath2 = new LinkedList<>(Arrays.asList("Programming", "Java", "Collections"));
MemorySlice slice2 = createTestMemorySlice("slice2");
memoryGraph.insertMemory(topicPath2, slice2);
// 验证结果
TopicNode collectionsNode = memoryGraph.getTopicNodes().get("Programming")
.getTopicNodes().get("Java")
.getTopicNodes().get("Collections");
assertEquals(1, collectionsNode.getMemoryNodes().size()); // 同一天应该只有一个MemoryNode
assertEquals(2, collectionsNode.getMemoryNodes().get(0).loadMemorySliceList().size()); // 但有两个MemorySlice
}
@Test
public void testInsertMemory_DifferentDays() throws IOException, ClassNotFoundException {
// 准备测试数据
List<String> topicPath = new LinkedList<>(Arrays.asList("Math", "Algebra"));
MemorySlice slice1 = createTestMemorySlice("slice1");
MemorySlice slice2 = createTestMemorySlice("slice2");
// 第一次插入
memoryGraph.insertMemory(topicPath, slice1);
// 模拟第二天
MemoryNode firstNode = memoryGraph.getTopicNodes().get("Math")
.getTopicNodes().get("Algebra")
.getMemoryNodes().get(0);
firstNode.setLocalDate(LocalDate.now().minusDays(1));
// 第二次插入
memoryGraph.insertMemory(topicPath, slice2);
// 验证结果
TopicNode algebraNode = memoryGraph.getTopicNodes().get("Math")
.getTopicNodes().get("Algebra");
assertEquals(2, algebraNode.getMemoryNodes().size()); // 应该有两个MemoryNode
}
@Test
public void testInsertMemory_PartialExistingPath() throws IOException, ClassNotFoundException {
// 准备初始数据 - 创建部分路径
List<String> topicPath1 = new LinkedList<>(Arrays.asList("Science", "Physics"));
MemorySlice slice1 = createTestMemorySlice("slice1");
memoryGraph.insertMemory(topicPath1, slice1);
// 插入到已存在路径的扩展路径
List<String> topicPath2 = new LinkedList<>(Arrays.asList("Science", "Physics", "Mechanics"));
MemorySlice slice2 = createTestMemorySlice("slice2");
memoryGraph.insertMemory(topicPath2, slice2);
// 验证结果
TopicNode physicsNode = memoryGraph.getTopicNodes().get("Science")
.getTopicNodes().get("Physics");
assertTrue(physicsNode.getTopicNodes().containsKey("Mechanics"));
assertEquals(1, physicsNode.getMemoryNodes().size()); // Physics节点有自己的记忆
assertEquals(1, physicsNode.getTopicNodes().get("Mechanics").getMemoryNodes().size()); // Mechanics节点也有记忆
}
private MemorySlice createTestMemorySlice(String id) {
MemorySlice slice = new MemorySlice();
slice.setMemoryId(id);
// 可以设置其他必要属性
return slice;
}
@Test
public void testSerializationConsistency() throws IOException, ClassNotFoundException {
// 构造 MemorySlice
MemorySlice slice = new MemorySlice();
slice.setMemoryId("001");
List<String> topicPath = Arrays.asList("生活", "学习", "Java");
// 插入 memory
memoryGraph.insertMemory(topicPath, slice);
memoryGraph.serialize();
// 反序列化
MemoryGraph loadedGraph = MemoryGraph.getInstance(testId);
// 校验topic 是否存在
assertNotNull(loadedGraph.getTopicNodes().get("生活"));
TopicNode lifeNode = loadedGraph.getTopicNodes().get("生活");
assertNotNull(lifeNode.getTopicNodes().get("学习"));
TopicNode studyNode = lifeNode.getTopicNodes().get("学习");
assertNotNull(studyNode.getTopicNodes().get("Java"));
TopicNode javaNode = studyNode.getTopicNodes().get("Java");
// 校验:是否存在 MemoryNode
assertFalse(javaNode.getMemoryNodes().isEmpty());
// 校验MemorySlice 内容一致
MemorySlice deserializedSlice = javaNode.getMemoryNodes().get(0).loadMemorySliceList().get(0);
assertEquals("001", deserializedSlice.getMemoryId());
}
}