Files
zeling_v2/Assets/Tests/EditMode/AI/UnawareModuleTests.cs
T
joywayerandClaude Opus 5 1c6ce57648 test(enemy): 修正测试名——该用例只验证空 Link 不加边,不涉及单向不可逆
原名 DisguiseThenPatrol_HasNoInternalEdges_DisguiseIsOneWay 承诺了
"伪装态不可逆",但那需要骨架的升级边才能验证(T10 覆盖)。
此用例实际只证明 Link 为空时状态不会自行跑掉,按实测内容改名。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 12:26:42 +08:00

71 lines
2.6 KiB
C#

using NUnit.Framework;
using BaseGames.AI;
using BaseGames.Enemies;
namespace BaseGames.Tests.EditMode.AI
{
public class UnawareModuleTests
{
// 只跑未发现层自身(不挂骨架升级边),验证态、行为与内部边。
static AiRuntime RunAlone(IUnawareModule m, FakeAiContext ctx)
{
var b = new BrainBuilder();
m.Declare(b);
m.Link(b);
b.Entry(m.Entry);
return new AiRuntime(b.Build(), ctx);
}
[Test]
public void SinglePost_OneState_EntryEqualsRest()
{
var m = new SinglePost(LocomotionMode.Patrol);
Assert.AreEqual(1, m.States.Count);
Assert.AreEqual(m.Entry, m.Rest);
var ctx = new FakeAiContext();
RunAlone(m, ctx);
Assert.AreEqual(LocomotionMode.Patrol, ctx.L.CurrentMode);
}
[Test]
public void DisguiseThenPatrol_EntryIsDisguise_RestIsPatrol()
{
var m = new DisguiseThenPatrol();
Assert.AreEqual(DisguiseThenPatrol.Disguise, m.Entry);
Assert.AreEqual(DisguiseThenPatrol.Patrol, m.Rest);
CollectionAssert.AreEquivalent(
new[] { DisguiseThenPatrol.Disguise, DisguiseThenPatrol.Patrol }, m.States);
}
[Test]
public void DisguiseThenPatrol_LinkAddsNoEdges_DisguiseStaysPut()
{
var ctx = new FakeAiContext();
var rt = RunAlone(new DisguiseThenPatrol(), ctx);
Assert.AreEqual(DisguiseThenPatrol.Disguise, rt.CurrentStateName);
for (int i = 0; i < 20; i++) rt.Tick(1f);
// 无内部边:伪装态自己不会跑掉,只能被骨架的升级边带走
Assert.AreEqual(DisguiseThenPatrol.Disguise, rt.CurrentStateName);
Assert.AreEqual(LocomotionMode.Idle, ctx.L.CurrentMode);
}
[Test]
public void AlternatingIdlePatrol_SwitchesOnDwellTimers()
{
var m = new AlternatingIdlePatrol(idleDwell: 2f, patrolDwell: 3f);
var ctx = new FakeAiContext();
var rt = RunAlone(m, ctx);
Assert.AreEqual(AlternatingIdlePatrol.Idle, rt.CurrentStateName);
rt.Tick(1f);
Assert.AreEqual(AlternatingIdlePatrol.Idle, rt.CurrentStateName); // 未到 2s
rt.Tick(1.5f);
Assert.AreEqual(AlternatingIdlePatrol.Patrol, rt.CurrentStateName); // 累计 2.5s ≥ 2s
Assert.AreEqual(LocomotionMode.Patrol, ctx.L.CurrentMode);
rt.Tick(3.5f);
Assert.AreEqual(AlternatingIdlePatrol.Idle, rt.CurrentStateName); // ≥ 3s 回站立
}
}
}