using System;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json.Linq;
namespace NavisworksTransport.UnitTests.Integration
{
///
/// 检测记录持久化集成测试(覆盖计划 T10)。
///
/// 验证碰撞检测记录正确落库并可查询:
/// - 动画产生的检测记录 ID 有效
/// - 从数据库重新加载后:关联路径、动画参数(帧率/时长)、虚拟物体模式、物体名一致
///
/// 动画参数(15fps/5s)与测试执行参数一致,验证参数链完整贯穿到持久化层。
///
[TestClass]
[TestCategory("NavisworksIntegration")]
public class DetectionRecordPersistenceAutomationTests
{
private const int TestFrameRate = 15;
private const double TestDurationSeconds = 5.0;
[TestMethod]
[Timeout(240000)]
public async Task DetectionRecord_GeneratedByAnimation_PersistedAndReloadable()
{
using (var client = new NavisworksTestAutomationClient())
{
await client.EnsureServiceReadyAsync(TimeSpan.FromSeconds(90)).ConfigureAwait(false);
// 1. 生成一次 Ground 虚拟物体动画(15fps/5s)
JObject animationResponse = await client.RunCollisionTestAsync(
"Ground",
240,
frameRate: TestFrameRate,
durationSeconds: TestDurationSeconds).ConfigureAwait(false);
Assert.IsTrue(animationResponse.Value("ok"), "碰撞测试失败: " + (string)animationResponse["error"]);
JObject data = (JObject)animationResponse["data"];
JObject route = (JObject)data["route"];
int detectionRecordId = (int)data["animation"]["detectionRecordId"];
Assert.IsTrue(detectionRecordId > 0, "检测记录 ID 无效");
// 2. 从数据库重新加载检测记录
JObject recordResponse = await client.GetDetectionRecordAsync(detectionRecordId).ConfigureAwait(false);
Assert.IsTrue(recordResponse.Value("ok"), "查询检测记录失败: " + (string)recordResponse["error"]);
JObject record = (JObject)recordResponse["data"];
// 记录 ID 匹配
Assert.AreEqual(detectionRecordId, (int)record["id"], "检测记录 ID 不匹配");
// 关联路径
Assert.AreEqual((string)route["id"], (string)record["routeId"], "检测记录关联路径 ID 不匹配");
Assert.IsFalse(string.IsNullOrWhiteSpace((string)record["testName"]), "检测记录测试名为空");
// 动画参数持久化(与测试执行参数一致)
Assert.AreEqual(TestFrameRate, (int)record["frameRate"], "检测记录帧率不匹配");
Assert.AreEqual(TestDurationSeconds, (double)record["durationSeconds"], 1e-6, "检测记录时长不匹配");
// 虚拟物体模式与物体信息
Assert.IsTrue((bool)record["isVirtualObject"], "检测记录应标记为虚拟物体模式");
Assert.IsFalse(string.IsNullOrWhiteSpace((string)record["animatedObjectName"]), "检测记录缺少物体名");
// 碰撞计数非负
Assert.IsTrue((int)record["collisionCount"] >= 0, "碰撞计数不能为负");
}
}
}
}