#!/usr/bin/env python3 """ 简化的 CFI 排序测试 - 专注核心功能验证 """ import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from epub_cfi_parser import EpubCFIParser def test_cfi_core_functionality(): """测试 CFI 解析和排序的核心功能""" print("=== CFI 核心功能测试 ===") # 测试用例:模拟真实的 iBooks CFI test_cfis = [ "epubcfi(/6/22[id19]!/4[6LJU0-b41b8d40e3c34c548f1a46585319196c]/40/1,:96,:214)", "epubcfi(/6/18[id17]!/4[5N3C0-b41b8d40e3c34c548f1a46585319196c]/6/1,:128,:219)", "epubcfi(/6/22[id19]!/4[6LJU0-b41b8d40e3c34c548f1a46585319196c]/8/1,:0,:43)", "epubcfi(/6/18[id17]!/4[5N3C0-b41b8d40e3c34c548f1a46585319196c]/10/1,:214,:273)", "epubcfi(/6/22[id19]!/4[6LJU0-b41b8d40e3c34c548f1a46585319196c]/12/1,:0,:17)", ] print("原始顺序:") for i, cfi in enumerate(test_cfis, 1): chapter = EpubCFIParser.extract_chapter_info(cfi) print(f" {i}. {chapter} - {cfi}") # 排序 sorted_cfis = sorted(test_cfis, key=EpubCFIParser.create_sort_key) print("\nCFI 排序后:") for i, cfi in enumerate(sorted_cfis, 1): chapter = EpubCFIParser.extract_chapter_info(cfi) parsed = EpubCFIParser.parse_cfi(cfi) if parsed: spine, local, offset = parsed print(f" {i}. {chapter} - spine={spine} local={local[:3]}... offset={offset}") else: print(f" {i}. {chapter} - 解析失败") # 验证排序正确性 spine_sequence = [] for cfi in sorted_cfis: parsed = EpubCFIParser.parse_cfi(cfi) if parsed and parsed[0]: spine_sequence.append(parsed[0][1]) # 第二个spine数字 is_sorted = all(spine_sequence[i] <= spine_sequence[i+1] for i in range(len(spine_sequence)-1)) print(f"\n✅ 排序验证: {'通过' if is_sorted else '失败'} (spine序列: {spine_sequence})") def test_cfi_edge_cases(): """测试边界情况""" print("\n=== 边界情况测试 ===") edge_cases = [ ("空字符串", ""), ("无效格式", "invalid_cfi"), ("只有spine", "epubcfi(/6/14)"), ("标准格式", "epubcfi(/6/14[chapter]!/4/2:10)"), ("复杂格式", "epubcfi(/6/22[id19]!/4[longid]/40/1,:96,:214)"), ] for name, cfi in edge_cases: parsed = EpubCFIParser.parse_cfi(cfi) sort_key = EpubCFIParser.create_sort_key(cfi) print(f"{name:12}: 解析={'✅' if parsed else '❌'} 排序键长度={len(sort_key)}") def compare_with_simple_sort(): """对比 CFI 排序与简单字符串排序的差异""" print("\n=== 排序方法对比 ===") test_cfis = [ "epubcfi(/6/22!/4:100)", "epubcfi(/6/22!/4:20)", "epubcfi(/6/14!/4:5)", "epubcfi(/6/2!/4:0)", ] # 字符串排序 string_sorted = sorted(test_cfis) print("字符串排序:") for i, cfi in enumerate(string_sorted, 1): print(f" {i}. {cfi}") # CFI 排序 cfi_sorted = sorted(test_cfis, key=EpubCFIParser.create_sort_key) print("\nCFI 语义排序:") for i, cfi in enumerate(cfi_sorted, 1): print(f" {i}. {cfi}") # 比较差异 different = string_sorted != cfi_sorted print(f"\n{'❌ 排序结果不同(符合预期)' if different else '⚠️ 排序结果相同'}") if __name__ == "__main__": test_cfi_core_functionality() test_cfi_edge_cases() compare_with_simple_sort() print(f"\n🎉 CFI 排序功能实现完成!") print("主要改进:") print(" ✅ 按 EPUB CFI 规范解析位置信息") print(" ✅ 正确的文档位置排序(非字符串排序)") print(" ✅ 支持复杂的 CFI 格式和章节提取") print(" ✅ 降级处理(CFI失败时使用物理位置)") print("\n下一步可选优化:") print(" 🔄 优化警告信息显示") print(" 📊 添加排序性能统计") print(" 🔍 支持更多 CFI 变体格式") print(" 💾 缓存解析结果提升性能")