#!/usr/bin/env python3
"""
边界条件和错误处理测试
"""

import os
import sys
import json
import tempfile
import shutil
from pathlib import Path

# 导入要测试的模块
sys.path.insert(0, str(Path(__file__).parent))
from auto_rename_improved import WukongRenamerImproved

def test_edge_cases():
    """测试边界条件"""
    print("🧪 开始边界条件测试")
    print("=" * 50)

    # 创建临时测试目录
    test_dir = Path(tempfile.mkdtemp(prefix="wukong_edge_test_"))
    original_dir = test_dir / "original_file"
    original_dir.mkdir(parents=True)

    try:
        renamer = WukongRenamerImproved(debug=True)
        renamer.base_path = test_dir
        renamer.original_folder = original_dir
        renamer.update_file = test_dir / "update.txt"
        renamer.log_file = test_dir / "rename_log.json"

        # 测试用例1: 空目录
        print("\n📋 测试1: 空目录处理")
        success = renamer.process_files()
        print(f"  结果: {'✅ 正确处理空目录' if not success else '❌ 空目录应该返回失败'}")

        # 测试用例2: 不存在的目录
        print("\n📋 测试2: 不存在的目录")
        renamer.original_folder = test_dir / "nonexistent"
        success = renamer.process_files()
        print(f"  结果: {'✅ 正确处理不存在的目录' if not success else '❌ 应该返回失败'}")

        # 恢复正常目录
        renamer.original_folder = original_dir

        # 创建各种边界情况文件
        edge_case_files = [
            # 正常文件
            "wukong-1.0.0-linux-amd64.deb",
            # 不标准文件名
            "Wukong-Setup-1.0.0.exe",
            "wukong_1.0.0_win64.msi",
            # 复杂版本号
            "wukong-v2.1.0-beta-mac-arm64.dmg",
            "wukong-1.2.3.4-linux-x64.tar.gz",
            # 最新版本标记
            "wukong-latest-win-x64.exe",
            # 元数据文件
            "wukong-1.0.0.blockmap",
            "wukong-1.0.0.sig",
            "wukong-1.0.0.asc",
            # 未知文件
            "random-file.txt",
            "setup.exe",
            # 特殊字符
            "wukong-1.0.0 (final)-linux-amd64.deb",
            "wukong-1.0.0+build.123-mac-arm64.dmg",
        ]

        for filename in edge_case_files:
            (original_dir / filename).write_text(f"content of {filename}")

        print(f"\n📄 创建了 {len(edge_case_files)} 个边界测试文件")

        # 执行处理
        print("\n📋 测试3: 处理边界情况文件")
        success = renamer.process_files()
        print(f"  处理结果: {'✅ 成功' if success else '❌ 失败'}")

        # 检查处理统计
        print(f"\n📊 处理统计:")
        print(f"  成功处理: {renamer.processing_results['success_count']} 个文件")
        print(f"  跳过文件: {renamer.processing_results['skip_count']} 个文件")
        print(f"  错误数量: {len(renamer.processing_results['errors'])} 个")

        # 检查跳过的文件
        if renamer.processing_results['skipped_files']:
            print(f"\n⏭️ 跳过的文件:")
            for skipped in renamer.processing_results['skipped_files']:
                print(f"  - {skipped['filename']}: {skipped['reason']}")

        # 检查错误
        if renamer.processing_results['errors']:
            print(f"\n❌ 错误:")
            for error in renamer.processing_results['errors']:
                print(f"  - {error}")

        return True

    except Exception as e:
        print(f"❌ 测试过程中发生异常: {e}")
        import traceback
        traceback.print_exc()
        return False

    finally:
        # 清理测试环境
        try:
            shutil.rmtree(test_dir)
            print(f"\n🧹 测试环境已清理: {test_dir}")
        except Exception as e:
            print(f"⚠️ 清理测试环境失败: {e}")

def test_error_handling():
    """测试错误处理机制"""
    print("\n🛡️ 开始错误处理测试")
    print("=" * 50)

    # 创建临时测试目录
    test_dir = Path(tempfile.mkdtemp(prefix="wukong_error_test_"))
    original_dir = test_dir / "original_file"
    original_dir.mkdir(parents=True)

    try:
        renamer = WukongRenamerImproved(debug=True)
        renamer.base_path = test_dir
        renamer.original_folder = original_dir
        renamer.update_file = test_dir / "update.txt"
        renamer.log_file = test_dir / "rename_log.json"

        # 测试用例1: 权限错误模拟（创建只读目录）
        print("\n📋 测试1: 权限错误处理")
        readonly_dir = test_dir / "readonly"
        readonly_dir.mkdir()

        try:
            # 在只读目录中创建文件
            test_file = readonly_dir / "test.txt"
            test_file.write_text("test")

            # 尝试移动文件到只读目录
            import stat
            readonly_dir.chmod(stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)  # 只读权限

            renamer.original_folder = readonly_dir
            success = renamer.process_files()
            print(f"  结果: {'✅ 正确处理权限错误' if not success else '⚠️ 可能成功处理了'}")

        except Exception as e:
            print(f"  捕获到预期错误: {e}")
        finally:
            # 恢复权限以便清理
            try:
                readonly_dir.chmod(stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
            except:
                pass

        # 测试用例2: 磁盘空间不足（通过限制文件大小模拟）
        print("\n📋 测试2: 大文件处理")
        renamer.original_folder = original_dir

        # 创建一个大文件（1MB）
        large_file = original_dir / "wukong-1.0.0-linux-amd64.deb"
        large_content = "x" * (1024 * 1024)  # 1MB
        large_file.write_text(large_content)

        success = renamer.process_files()
        print(f"  结果: {'✅ 成功处理大文件' if success else '❌ 大文件处理失败'}")

        # 测试用例3: 符号链接
        print("\n📋 测试3: 符号链接处理")
        link_file = original_dir / "wukong-link-1.0.0-linux-amd64.deb"
        try:
            link_file.symlink_to(large_file)
            print(f"  创建符号链接: {link_file}")

            success = renamer.process_files()
            print(f"  结果: {'✅ 成功处理符号链接' if success else '❌ 符号链接处理失败'}")
        except Exception as e:
            print(f"  符号链接测试跳过: {e}")

        return True

    except Exception as e:
        print(f"❌ 测试过程中发生异常: {e}")
        import traceback
        traceback.print_exc()
        return False

    finally:
        # 清理测试环境
        try:
            shutil.rmtree(test_dir)
            print(f"\n🧹 测试环境已清理: {test_dir}")
        except Exception as e:
            print(f"⚠️ 清理测试环境失败: {e}")

def main():
    """主函数"""
    print("🚀 开始边界条件和错误处理测试")
    print("=" * 60)

    edge_case_success = test_edge_cases()
    error_handling_success = test_error_handling()

    print("\n" + "=" * 60)
    print("📊 测试总结:")
    print(f"  边界条件测试: {'✅ 通过' if edge_case_success else '❌ 失败'}")
    print(f"  错误处理测试: {'✅ 通过' if error_handling_success else '❌ 失败'}")

    overall_success = edge_case_success and error_handling_success
    print(f"  总体结果: {'✨ 全部通过!' if overall_success else '❌ 存在问题'}")

    return 0 if overall_success else 1

if __name__ == "__main__":
    exit(main())