EG/demo/test_packaging.py
2025-12-12 16:16:15 +08:00

220 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
# -*- coding: utf-8 -*-
"""
打包功能测试脚本
测试项目管理器的打包功能是否按照Panda3D官方标准正常工作
"""
import sys
import os
import tempfile
import shutil
# 添加项目路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from project.project_manager import ProjectManager
from main import MyWorld
def test_packaging():
"""测试打包功能"""
print("=== Panda3D 标准打包功能测试 ===\n")
# 创建临时项目用于测试
temp_dir = tempfile.mkdtemp(prefix="panda3d_package_test_")
print(f"创建临时测试项目: {temp_dir}")
try:
# 设置测试项目结构
test_project_path = os.path.join(temp_dir, "TestProject")
scenes_path = os.path.join(test_project_path, "scenes")
os.makedirs(scenes_path)
# 创建项目管理器不需要完整的world对象
project_manager = ProjectManager(None)
project_manager.current_project_path = test_project_path
# 创建一个简单的测试场景文件
scene_file = os.path.join(scenes_path, "scene.bam")
# 创建一个空的BAM文件用于测试
print("创建测试场景文件...")
try:
# 创建一个最小的场景文件
with open(scene_file, 'wb') as f:
# 写入一个最小的Panda3D BAM文件头只是为了测试
f.write(b'BAM\x00') # 最简单的BAM文件标识
print("✓ 测试场景文件创建成功")
except Exception as e:
print(f"✗ 测试场景文件创建失败: {e}")
return False
# 测试打包文件创建
build_dir = os.path.join(test_project_path, "build")
print(f"\n创建打包文件到: {build_dir}")
project_manager._createStandardBuildFiles(build_dir, test_project_path, scene_file)
# 检查生成的文件
main_py = os.path.join(build_dir, "main.py")
setup_py = os.path.join(build_dir, "setup.py")
scene_bam = os.path.join(build_dir, "scene.bam")
success = True
if os.path.exists(main_py):
print("✓ main.py 创建成功")
# 检查文件内容
with open(main_py, 'r', encoding='utf-8') as f:
content = f.read()
if "TestProject" in content:
print(" - 项目名称正确替换")
else:
print(" ✗ 项目名称替换失败")
success = False
else:
print("✗ main.py 创建失败")
success = False
if os.path.exists(setup_py):
print("✓ setup.py 创建成功")
# 检查配置内容
with open(setup_py, 'r', encoding='utf-8') as f:
content = f.read()
if "build_apps" in content and "gui_apps" in content:
print(" - 包含标准打包配置")
else:
print(" ✗ 缺少标准打包配置")
success = False
else:
print("✗ setup.py 创建失败")
success = False
if os.path.exists(scene_bam):
print("✓ scene.bam 复制成功")
else:
print("✗ scene.bam 复制失败")
success = False
# 显示生成的文件内容概要
print(f"\n=== 生成的文件概要 ===")
for filename in os.listdir(build_dir):
filepath = os.path.join(build_dir, filename)
size = os.path.getsize(filepath)
print(f" {filename}: {size} bytes")
# 检查setup.py的关键配置
print(f"\n=== setup.py 配置检查 ===")
if os.path.exists(setup_py):
with open(setup_py, 'r', encoding='utf-8') as f:
content = f.read()
checks = [
("APP_NAME", "应用程序名称"),
("build_apps", "构建应用配置"),
("gui_apps", "GUI应用配置"),
("include_patterns", "文件包含模式"),
("plugins", "Panda3D插件"),
("platforms", "目标平台"),
]
for check, desc in checks:
if check in content:
print(f"{desc} 配置正确")
else:
print(f"{desc} 配置缺失")
success = False
print(f"\n=== 测试结果 ===")
if success:
print("✓ 所有打包文件创建成功!")
print("✓ 配置符合Panda3D官方标准")
print("\n可以手动运行以下命令进行实际打包:")
print(f" cd {build_dir}")
print(f" python setup.py bdist_apps")
return True
else:
print("✗ 打包文件创建存在问题")
return False
except Exception as e:
print(f"测试过程中出现错误: {str(e)}")
import traceback
traceback.print_exc()
return False
finally:
# 清理临时文件
try:
shutil.rmtree(temp_dir)
print(f"\n清理临时文件: {temp_dir}")
except Exception as e:
print(f"清理临时文件失败: {str(e)}")
def test_setup_validation():
"""验证setup.py文件的语法正确性"""
print("\n=== setup.py 语法验证 ===")
# 创建临时目录
temp_dir = tempfile.mkdtemp(prefix="setup_validation_")
try:
# 创建项目管理器实例不需要完整的world对象
project_manager = ProjectManager(None)
# 生成setup.py文件
project_manager._createStandardSetupFile(temp_dir, "ValidationTest")
setup_file = os.path.join(temp_dir, "setup.py")
if not os.path.exists(setup_file):
print("✗ setup.py 文件未生成")
return False
# 检查Python语法
print("检查Python语法...")
try:
with open(setup_file, 'r', encoding='utf-8') as f:
code = f.read()
# 编译代码检查语法
compile(code, setup_file, 'exec')
print("✓ Python语法正确")
except SyntaxError as e:
print(f"✗ Python语法错误: {e}")
return False
print("✓ setup.py 验证通过")
return True
except Exception as e:
print(f"验证过程出错: {str(e)}")
return False
finally:
try:
shutil.rmtree(temp_dir)
except:
pass
if __name__ == "__main__":
print("Panda3D 标准打包功能测试\n")
# 运行测试
test1_result = test_packaging()
test2_result = test_setup_validation()
print(f"\n=== 最终测试结果 ===")
print(f"打包文件创建测试: {'通过' if test1_result else '失败'}")
print(f"setup.py语法验证: {'通过' if test2_result else '失败'}")
if test1_result and test2_result:
print("\n🎉 所有测试通过!新的打包功能工作正常。")
print("📦 现在可以使用标准的Panda3D打包流程了。")
else:
print("\n❌ 部分测试失败,需要检查配置。")