220 lines
7.4 KiB
Python
220 lines
7.4 KiB
Python
#!/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❌ 部分测试失败,需要检查配置。") |