- 按文件哈希区分当前八路工程和历史 Amesim 基准,修复测试与清单中的旧路径。 - 四路审计从 JSON 按需生成 XML,八路新增只核对模式,并显式使用 UTF-8 与 LF。 - 将缺失高刚度夹具的测试替换为当前八路完整 BDF 运行,明确未恢复原 RK45 专项覆盖。 - 更新前端大型工程测试、历史活动回放入口、数据说明、现行规范和相关报告。 验证:全量后台 374 项通过、1 项条件跳过;前端 11 项通过、历史独立服务用例 1 项跳过;四路八路 AME 审计通过。 环境、缓存和运行产物保持忽略;本次未实施工程 JSON 字段精简。
81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from unittest.mock import Mock
|
|
|
|
from app.simulation.paths import HISTORICAL_MQL8_AME_PATH
|
|
from app.simulation.reporting.amesim_results import (
|
|
_resolve_result_members,
|
|
load_test_mql_amesim_results,
|
|
)
|
|
|
|
|
|
TEST_MQL_AME = HISTORICAL_MQL8_AME_PATH
|
|
|
|
|
|
class AmesimResultsTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls.results = load_test_mql_amesim_results(TEST_MQL_AME)
|
|
|
|
def test_reads_binary_results_shape(self) -> None:
|
|
self.assertEqual(self.results.point_count, 1002)
|
|
self.assertEqual(self.results.saved_variable_count, 1116)
|
|
self.assertEqual(len(self.results.variables), 1278)
|
|
self.assertEqual(len(self.results.final_values_by_data_path), 1100)
|
|
|
|
def test_time_axis_matches_amesim_simulation(self) -> None:
|
|
self.assertAlmostEqual(self.results.times[0], 0.0)
|
|
self.assertAlmostEqual(self.results.times[1], 0.01)
|
|
self.assertAlmostEqual(self.results.times[-1], 10.0)
|
|
|
|
def test_variable_mapping_preserves_data_paths(self) -> None:
|
|
self.assertEqual(self.results.saved_variable_indices[:2], (0, 1))
|
|
self.assertEqual(self.results.variables[0].data_path, "temp3@pn_c1_8")
|
|
self.assertEqual(self.results.variables[1].data_path, "press3@pn_c1_8")
|
|
self.assertIn("vvol1@pn_brp2_8", self.results.series_by_data_path)
|
|
self.assertIn("vol1@pn_brp2_8", self.results.series_by_data_path)
|
|
|
|
def test_series_values_match_known_amesim_samples(self) -> None:
|
|
temp3 = self.results.series("temp3@pn_c1_8")
|
|
press3 = self.results.series("press3@pn_c1_8")
|
|
self.assertAlmostEqual(temp3[0], 293.15)
|
|
self.assertAlmostEqual(press3[0], -1300.0)
|
|
self.assertAlmostEqual(temp3[-1], self.results.final_value("temp3@pn_c1_8"))
|
|
self.assertAlmostEqual(press3[-1], self.results.final_value("press3@pn_c1_8"))
|
|
|
|
def test_window_loader_keeps_one_sample_after_stop(self) -> None:
|
|
results = load_test_mql_amesim_results(TEST_MQL_AME, time_stop_s=0.04)
|
|
|
|
self.assertEqual(results.point_count, 6)
|
|
self.assertAlmostEqual(results.times[-2], 0.04)
|
|
self.assertAlmostEqual(results.times[-1], 0.05)
|
|
self.assertEqual(
|
|
len(results.series("temp@pn_c1_8")),
|
|
results.point_count,
|
|
)
|
|
self.assertEqual(results.final_values_by_data_path, {})
|
|
|
|
def test_auto_detects_renamed_result_members(self) -> None:
|
|
archive = Mock()
|
|
archive.getnames.return_value = (
|
|
"renamed_model_.var",
|
|
"renamed_model_.results",
|
|
"renamed_model_.sim",
|
|
)
|
|
|
|
pair = _resolve_result_members(
|
|
archive,
|
|
var_member=None,
|
|
results_member=None,
|
|
)
|
|
|
|
self.assertEqual(
|
|
pair,
|
|
("renamed_model_.var", "renamed_model_.results"),
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|