'update'
This commit is contained in:
116
test_cfi_simple.py
Normal file
116
test_cfi_simple.py
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/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(" 💾 缓存解析结果提升性能")
|
||||
Reference in New Issue
Block a user