from router_system.cache import RouterCache def test_semantic_lookup_after_many_entries(): """多条目下语义命中正确(范数预计算 + 单遍扫描的回归)。""" c = RouterCache(similarity_threshold=0.5) for i in range(50): c.put(f"完全不相关的查询主题编号{i}关于烹饪的意见", {"response": f"r{i}"}) c.put("用 Python 实现快速排序函数", {"response": "code-answer"}) level, got = c.get("用 Python 实现快速排序的函数写法") # 相似但不完全相同 assert level in ("semantic", "exact") assert got["response"] == "code-answer" def test_promotion_clears_semantic_state(): """提升为精确缓存后,语义列表与范数索引无残留。""" c = RouterCache(promote_frequency=2) c.put("查询甲", {"response": "a"}) first = c.get("查询甲") # 相似度=1.0 计 exact,hits 达阈值即提升 assert first is not None and first[0] == "exact" second = c.get("查询甲") assert second is not None and second[0] == "exact" assert c.stats()["exact_size"] == 1 assert c.stats()["semantic_size"] == 0 assert len(c._sem_norms) == 0 def test_semantic_eviction_clears_norms(): """语义缓存满员淘汰最旧条目时,向量与范数索引同步清理。""" c = RouterCache(max_semantic=2) c.put("查询一", {"response": "1"}) c.put("查询二", {"response": "2"}) c.put("查询三", {"response": "3"}) # 淘汰查询一 assert len(c._semantic) == 2 assert len(c._sem_vecs) == 2 assert len(c._sem_norms) == 2 assert c.get("查询一") is None def test_exact_hit(): c = RouterCache() result = {"response": "hello", "domain": "general"} assert c.get("query") is None c.put("query", result) level, got = c.get("query") assert level == "exact" assert got["response"] == "hello" def test_semantic_hit(): c = RouterCache(semantic_enabled=True, similarity_threshold=0.5) c.put("?python?????", {"response": "code", "domain": "code"}) # ?????????? L2 hit = c.get("?python????????") assert hit is not None assert hit[0] == "semantic" def test_promote_to_exact(): c = RouterCache(promote_frequency=3) result = {"response": "x", "domain": "general"} c.put("query", result) # ?????? 3 ? ? ??????? for _ in range(3): hit = c.get("query") assert hit is not None assert c.stats()["exact_size"] == 1 def test_stats(): c = RouterCache() c.put("q", {"response": "r"}) c.get("q") c.get("q") c.get("miss") s = c.stats() assert s["exact_hits"] == 2 assert s["misses"] == 1