using System;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json.Linq;
namespace NavisworksTransport.UnitTests.Integration
{
///
/// 动画播放控制集成测试(覆盖计划 T13)。
///
/// 验证 PathAnimationManager 播放链路完整:
/// - 播放开始(playing 阶段帧前进)
/// - 暂停生效(paused 阶段帧停止,pauseVerified=true)
/// - 恢复播放(resumed 阶段帧继续前进)
/// - 播放完成(finished 阶段状态 Finished)
///
[TestClass]
[TestCategory("NavisworksIntegration")]
public class AnimationPlaybackControlAutomationTests
{
private const int TestFrameRate = 15;
private const double TestDurationSeconds = 5.0;
[TestMethod]
[Timeout(240000)]
public async Task GroundVirtualObject_PlaybackControl_PauseResumeWork()
{
using (var client = new NavisworksTestAutomationClient())
{
await client.EnsureServiceReadyAsync(TimeSpan.FromSeconds(90)).ConfigureAwait(false);
JObject response = await client.AnimationPlaybackControlAsync(
"Ground",
180,
TestFrameRate,
TestDurationSeconds).ConfigureAwait(false);
Assert.IsTrue(response.Value("ok"), "播放控制序列失败: " + (string)response["error"]);
JObject data = (JObject)response["data"];
// 动画参数
Assert.IsTrue((int)data["totalFrames"] > 0, "总帧数应大于 0");
Assert.AreEqual("自动测试_Ground", (string)data["route"]["name"], "播放控制路径不匹配");
// 暂停验证:暂停期间帧数不变
Assert.IsTrue((bool)data["pauseVerified"], "暂停期间帧数仍在前进");
Assert.AreEqual((int)data["pausedFrame"], (int)data["frameAfterPause"], "暂停后帧数不应变化");
// 各阶段状态
JArray stages = (JArray)data["stages"];
Assert.IsNotNull(stages, "缺少 stages");
Assert.AreEqual(4, stages.Count, "阶段数应为 4(playing/paused/resumed/finished)");
Assert.AreEqual("playing", (string)stages[0]["stage"]);
Assert.AreEqual("paused", (string)stages[1]["stage"]);
Assert.AreEqual("resumed", (string)stages[2]["stage"]);
Assert.AreEqual("finished", (string)stages[3]["stage"]);
// 帧前进:playing < paused < resumed < finished
int playingFrame = (int)stages[0]["frame"];
int pausedFrame = (int)stages[1]["frame"];
int resumedFrame = (int)stages[2]["frame"];
int finishedFrame = (int)stages[3]["frame"];
Assert.IsTrue(playingFrame > 0, "播放开始后帧数应大于 0");
Assert.IsTrue(pausedFrame > playingFrame, "暂停帧应晚于播放开始帧");
Assert.IsTrue(resumedFrame > pausedFrame, "恢复后帧数应前进");
Assert.IsTrue(finishedFrame >= resumedFrame, "完成帧不应早于恢复帧");
// 完成状态
Assert.AreEqual("Finished", (string)stages[3]["state"], "动画最终状态应为 Finished");
}
}
}
}