Files
Mofox-Core/scripts/test_version_compatibility.py
2025-06-20 00:02:19 +08:00

217 lines
7.6 KiB
Python
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.

#!/usr/bin/env python3
"""
版本兼容性检查测试脚本
测试版本号标准化、比较和兼容性检查功能
"""
import sys
import os
from src.plugin_system.utils.manifest_utils import VersionComparator
# 添加项目根目录到Python路径
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_root)
def test_version_normalization():
"""测试版本号标准化功能"""
print("🧪 测试版本号标准化...")
test_cases = [
("0.8.0-snapshot.1", "0.8.0"),
("0.8.0-snapshot.2", "0.8.0"),
("0.8.0", "0.8.0"),
("0.9.0-snapshot.1", "0.9.0"),
("1.0.0", "1.0.0"),
("2.1", "2.1.0"),
("3", "3.0.0"),
("", "0.0.0"),
("invalid", "0.0.0"),
]
for input_version, expected in test_cases:
result = VersionComparator.normalize_version(input_version)
status = "" if result == expected else ""
print(f" {status} {input_version} -> {result} (期望: {expected})")
def test_version_comparison():
"""测试版本号比较功能"""
print("\n🧪 测试版本号比较...")
test_cases = [
("0.8.0", "0.9.0", -1), # 0.8.0 < 0.9.0
("0.9.0", "0.8.0", 1), # 0.9.0 > 0.8.0
("1.0.0", "1.0.0", 0), # 1.0.0 == 1.0.0
("0.8.0-snapshot.1", "0.8.0", 0), # 标准化后相等
("1.2.3", "1.2.4", -1), # 1.2.3 < 1.2.4
("2.0.0", "1.9.9", 1), # 2.0.0 > 1.9.9
]
for v1, v2, expected in test_cases:
result = VersionComparator.compare_versions(v1, v2)
status = "" if result == expected else ""
comparison = "<" if expected == -1 else ">" if expected == 1 else "=="
print(f" {status} {v1} {comparison} {v2} (结果: {result})")
def test_version_range_check():
"""测试版本范围检查功能"""
print("\n🧪 测试版本范围检查...")
test_cases = [
("0.8.0", "0.7.0", "0.9.0", True), # 在范围内
("0.6.0", "0.7.0", "0.9.0", False), # 低于最小版本
("1.0.0", "0.7.0", "0.9.0", False), # 高于最大版本
("0.8.0", "0.8.0", "0.8.0", True), # 等于边界
("0.8.0", "", "0.9.0", True), # 只有最大版本限制
("0.8.0", "0.7.0", "", True), # 只有最小版本限制
("0.8.0", "", "", True), # 无版本限制
]
for version, min_ver, max_ver, expected in test_cases:
is_compatible, error_msg = VersionComparator.is_version_in_range(version, min_ver, max_ver)
status = "" if is_compatible == expected else ""
range_str = f"[{min_ver or '无限制'}, {max_ver or '无限制'}]"
print(f" {status} {version} 在范围 {range_str}: {is_compatible}")
if error_msg:
print(f" 错误信息: {error_msg}")
def test_current_version():
"""测试获取当前版本功能"""
print("\n🧪 测试获取当前主机版本...")
try:
current_version = VersionComparator.get_current_host_version()
print(f" ✅ 当前主机版本: {current_version}")
# 验证版本号格式
parts = current_version.split(".")
if len(parts) == 3 and all(part.isdigit() for part in parts):
print(" ✅ 版本号格式正确")
else:
print(" ❌ 版本号格式错误")
except Exception as e:
print(f" ❌ 获取当前版本失败: {e}")
def test_manifest_compatibility():
"""测试manifest兼容性检查"""
print("\n🧪 测试manifest兼容性检查...")
# 模拟manifest数据
test_manifests = [
{"name": "兼容插件", "host_application": {"min_version": "0.1.0", "max_version": "2.0.0"}},
{"name": "版本过高插件", "host_application": {"min_version": "10.0.0", "max_version": "20.0.0"}},
{"name": "版本过低插件", "host_application": {"min_version": "0.1.0", "max_version": "0.2.0"}},
{
"name": "无版本要求插件",
# 没有host_application字段
},
]
# 这里需要导入PluginManager来测试但可能会有依赖问题
# 所以我们直接使用VersionComparator进行测试
current_version = VersionComparator.get_current_host_version()
for manifest in test_manifests:
plugin_name = manifest["name"]
if "host_application" in manifest:
host_app = manifest["host_application"]
min_version = host_app.get("min_version", "")
max_version = host_app.get("max_version", "")
is_compatible, error_msg = VersionComparator.is_version_in_range(current_version, min_version, max_version)
status = "" if is_compatible else ""
print(f" {status} {plugin_name}: {is_compatible}")
if error_msg:
print(f" {error_msg}")
else:
print(f"{plugin_name}: True (无版本要求)")
def test_additional_snapshot_formats():
"""测试额外的snapshot版本格式"""
print("\n🧪 测试额外的snapshot版本格式...")
test_cases = [
# 用户提到的版本格式
("0.8.0-snapshot.1", "0.8.0"),
("0.8.0-snapshot.2", "0.8.0"),
("0.8.0", "0.8.0"),
("0.9.0-snapshot.1", "0.9.0"),
# 边界情况
("1.0.0-snapshot.999", "1.0.0"),
("2.15.3-snapshot.42", "2.15.3"),
("10.5.0-snapshot.1", "10.5.0"),
# 不正确的snapshot格式应该被忽略或正确处理
("0.8.0-snapshot", "0.0.0"), # 无数字后缀应该标准化为0.0.0
("0.8.0-snapshot.abc", "0.0.0"), # 非数字后缀应该标准化为0.0.0
("0.8.0-beta.1", "0.0.0"), # 其他预发布版本应该标准化为0.0.0
]
for input_version, expected in test_cases:
result = VersionComparator.normalize_version(input_version)
status = "" if result == expected else ""
print(f" {status} {input_version} -> {result} (期望: {expected})")
def test_snapshot_version_comparison():
"""测试snapshot版本的比较功能"""
print("\n🧪 测试snapshot版本比较...")
test_cases = [
# snapshot版本与正式版本比较
("0.8.0-snapshot.1", "0.8.0", 0), # 应该相等
("0.8.0-snapshot.2", "0.8.0", 0), # 应该相等
("0.9.0-snapshot.1", "0.8.0", 1), # 应该大于
("0.7.0-snapshot.1", "0.8.0", -1), # 应该小于
# snapshot版本之间比较
("0.8.0-snapshot.1", "0.8.0-snapshot.2", 0), # 都标准化为0.8.0,相等
("0.9.0-snapshot.1", "0.8.0-snapshot.1", 1), # 0.9.0 > 0.8.0
# 边界情况
("1.0.0-snapshot.1", "0.9.9", 1), # 主版本更高
("0.9.0-snapshot.1", "0.8.99", 1), # 次版本更高
]
for version1, version2, expected in test_cases:
result = VersionComparator.compare_versions(version1, version2)
status = "" if result == expected else ""
comparison = "<" if expected < 0 else "==" if expected == 0 else ">"
print(f" {status} {version1} {comparison} {version2} (结果: {result})")
def main():
"""主函数"""
print("🔧 MaiBot插件版本兼容性检查测试")
print("=" * 50)
try:
test_version_normalization()
test_version_comparison()
test_version_range_check()
test_current_version()
test_manifest_compatibility()
test_additional_snapshot_formats()
test_snapshot_version_comparison()
print("\n🎉 所有测试完成!")
except Exception as e:
print(f"\n❌ 测试过程中发生错误: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()