""" STT Python绑定测试脚本 这个脚本测试STT Python绑定的基本功能。 """ import sys import os import tempfile import unittest # 尝试导入STT模块 try: import stt STT_AVAILABLE = True except ImportError as e: print(f"警告: 无法导入STT模块 - {e}") print("请确保已经构建并安装了STT Python绑定") STT_AVAILABLE = False stt = None class TestSttBinding(unittest.TestCase): """STT绑定测试类""" @classmethod def setUpClass(cls): """测试类设置""" if not STT_AVAILABLE: raise unittest.SkipTest("STT模块不可用") # 创建临时目录用于测试输出 cls.temp_dir = tempfile.mkdtemp() print(f"测试临时目录: {cls.temp_dir}") @classmethod def tearDownClass(cls): """测试类清理""" if hasattr(cls, 'temp_dir') and os.path.exists(cls.temp_dir): # 清理临时文件 import shutil shutil.rmtree(cls.temp_dir) print(f"清理临时目录: {cls.temp_dir}") def test_module_import(self): """测试模块导入""" self.assertIsNotNone(stt, "STT模块应该可用") self.assertTrue(hasattr(stt, 'SttGenerator'), "应该包含SttGenerator类") self.assertTrue(hasattr(stt, 'create_stt'), "应该包含create_stt函数") self.assertTrue(hasattr(stt, 'WGS84'), "应该包含WGS84常量") def test_generator_creation(self): """测试生成器创建""" generator = stt.SttGenerator() self.assertIsNotNone(generator, "应该能够创建生成器实例") # 测试基本方法存在 self.assertTrue(hasattr(generator, 'set_tree_depth'), "应该有set_tree_depth方法") self.assertTrue(hasattr(generator, 'set_reference_system'), "应该有set_reference_system方法") self.assertTrue(hasattr(generator, 'run'), "应该有run方法") self.assertTrue(hasattr(generator, 'run_full'), "应该有run_full方法") def test_basic_generation(self): """测试基本生成功能""" generator = stt.SttGenerator() # 设置基本参数 generator.set_tree_depth(2, 4) # 使用较小的深度进行快速测试 generator.set_reference_system("WGS84") # 创建输出文件路径 output_file = os.path.join(self.temp_dir, "test_basic.msh") # 运行生成 result = generator.run(output_file) # 检查结果 self.assertEqual(result, 0, "生成应该成功返回0") # 检查输出文件是否存在 if os.path.exists(output_file): file_size = os.path.getsize(output_file) print(f"生成文件大小: {file_size} 字节") self.assertGreater(file_size, 0, "输出文件应该非空") else: print("警告: 输出文件未生成,这可能是因为生成器需要更多参数") def test_quick_creation(self): """测试快速创建功能""" output_file = os.path.join(self.temp_dir, "test_quick.msh") # 使用便利函数 info = stt.create_stt( min_depth=2, max_depth=4, reference_system="Earth", output_file=output_file ) # 检查返回信息 self.assertIsInstance(info, dict, "应该返回字典信息") self.assertEqual(info['min_depth'], 2, "最小深度应该正确") self.assertEqual(info['max_depth'], 4, "最大深度应该正确") self.assertEqual(info['reference_system'], "Earth", "参考系统应该正确") self.assertEqual(info['output_file'], output_file, "输出文件应该正确") # 检查文件生成 if os.path.exists(output_file): file_size = os.path.getsize(output_file) print(f"快速创建文件大小: {file_size} 字节") self.assertGreater(file_size, 0, "输出文件应该非空") def test_custom_reference_system(self): """测试自定义参考系统""" generator = stt.SttGenerator() # 测试预设系统 generator.set_reference_system("WGS84") generator.set_reference_system("Earth") generator.set_reference_system("Moon") # 测试自定义半径 generator.set_pole_equator_radius(6378137.0, 6356752.3) # WGS84参数 # 设置其他参数 generator.set_tree_depth(2, 3) generator.set_icosahedron_orient(0.0, 90.0) # 运行测试 output_file = os.path.join(self.temp_dir, "test_custom.msh") result = generator.run(output_file) self.assertEqual(result, 0, "自定义参考系统生成应该成功") def test_module_constants(self): """测试模块常量""" self.assertEqual(stt.WGS84, "WGS84", "WGS84常量应该正确") self.assertEqual(stt.EARTH, "Earth", "Earth常量应该正确") self.assertEqual(stt.MOON, "Moon", "Moon常量应该正确") def test_module_info(self): """测试模块信息""" info = stt.get_info() self.assertIsInstance(info, dict, "应该返回字典信息") self.assertIn('version', info, "应该包含版本信息") self.assertIn('author', info, "应该包含作者信息") print("模块信息:") for key, value in info.items(): print(f" {key}: {value}") def test_advanced_parameters(self): """测试高级参数""" generator = stt.SttGenerator() # 设置参数 generator.set_tree_depth(2, 4) generator.set_reference_system("WGS84") generator.set_icosahedron_orient(0.0, 90.0) # 使用完整参数运行 params = { "output_msh": os.path.join(self.temp_dir, "test_advanced.msh"), "output_vertex": os.path.join(self.temp_dir, "vertices.txt"), "output_triangle_center": os.path.join(self.temp_dir, "centers.txt"), "output_neighbor": os.path.join(self.temp_dir, "neighbors.txt") } result = generator.run_full(params) self.assertEqual(result, 0, "高级参数生成应该成功") # 检查生成的文件 for key, filename in params.items(): if os.path.exists(filename): file_size = os.path.getsize(filename) print(f"{key} 文件大小: {file_size} 字节") def test_error_handling(self): """测试错误处理""" generator = stt.SttGenerator() # 测试无效参数(应该不会崩溃) try: generator.set_tree_depth(-1, 10) # 无效深度 generator.set_reference_system("InvalidSystem") # 这些调用应该能够处理而不会崩溃 except Exception as e: print(f"错误处理测试: {e}") def run_basic_tests(): """运行基本测试""" print("运行STT Python绑定基本测试...") if not STT_AVAILABLE: print("错误: STT模块不可用,无法运行测试") return False # 创建简单的测试 try: print("1. 测试模块导入...") generator = stt.SttGenerator() print(" ✓ 模块导入成功") print("2. 测试基本功能...") generator.set_tree_depth(2, 3) generator.set_reference_system("WGS84") print(" ✓ 基本设置成功") print("3. 测试快速创建...") info = stt.create_stt(2, 3, "Earth", "test.msh") print(f" ✓ 快速创建成功: {info}") print("4. 测试模块信息...") info = stt.get_info() print(f" ✓ 模块信息: {info['version']}") print("基本测试通过!") return True except Exception as e: print(f"测试失败: {e}") import traceback traceback.print_exc() return False def main(): """主函数""" print("STT Python绑定测试") print("=" * 30) # 运行基本测试 if run_basic_tests(): print("\n运行完整单元测试...") unittest.main(argv=[''], exit=False, verbosity=2) else: print("\n基本测试失败,跳过完整测试") sys.exit(1) if __name__ == "__main__": main()