feat(enemy): 新增 IEnemyBody 身体几何权威接口与 EnemyBody 实现(+14 纯函数单测)
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
using NUnit.Framework;
|
||||
using BaseGames.Enemies;
|
||||
|
||||
namespace BaseGames.Tests.EditMode.Enemies
|
||||
{
|
||||
/// <summary>
|
||||
/// EnemyBody 方向相关纯函数测试(无场景依赖)。
|
||||
/// 这三个函数的左右符号最易写反,故对两个方向与边界相等情形都做断言。
|
||||
/// </summary>
|
||||
public class EnemyBodyTests
|
||||
{
|
||||
// 身体占据 [2, 4],中心 3,半宽 1
|
||||
const float MinX = 2f, MaxX = 4f;
|
||||
|
||||
[Test]
|
||||
public void FrontEdge_Right_IsMaxX()
|
||||
=> Assert.AreEqual(MaxX, EnemyBody.FrontEdge(MinX, MaxX, 1f));
|
||||
|
||||
[Test]
|
||||
public void FrontEdge_Left_IsMinX()
|
||||
=> Assert.AreEqual(MinX, EnemyBody.FrontEdge(MinX, MaxX, -1f));
|
||||
|
||||
[Test]
|
||||
public void FrontEdge_ZeroDir_TreatedAsRight()
|
||||
=> Assert.AreEqual(MaxX, EnemyBody.FrontEdge(MinX, MaxX, 0f));
|
||||
|
||||
[Test]
|
||||
public void RearEdge_Right_IsMinX()
|
||||
=> Assert.AreEqual(MinX, EnemyBody.RearEdge(MinX, MaxX, 1f));
|
||||
|
||||
[Test]
|
||||
public void RearEdge_Left_IsMaxX()
|
||||
=> Assert.AreEqual(MaxX, EnemyBody.RearEdge(MinX, MaxX, -1f));
|
||||
|
||||
[Test]
|
||||
public void RearEdge_ZeroDir_TreatedAsRight()
|
||||
=> Assert.AreEqual(MinX, EnemyBody.RearEdge(MinX, MaxX, 0f));
|
||||
|
||||
// ── BodyPassed:向右 ─────────────────────────────────────────────
|
||||
[Test]
|
||||
public void BodyPassed_Right_NotReached_False()
|
||||
=> Assert.IsFalse(EnemyBody.BodyPassed(MinX, MaxX, 5f, 1f)); // 目标在身体右侧外
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Right_OverlappingTarget_False()
|
||||
=> Assert.IsFalse(EnemyBody.BodyPassed(MinX, MaxX, 3f, 1f)); // 目标仍在身体内,未整体越过
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Right_ExactlyAtRearEdge_True()
|
||||
=> Assert.IsTrue(EnemyBody.BodyPassed(MinX, MaxX, 2f, 1f)); // 后缘恰好等于目标 = 已越过
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Right_FullyPassed_True()
|
||||
=> Assert.IsTrue(EnemyBody.BodyPassed(MinX, MaxX, 1f, 1f));
|
||||
|
||||
// ── BodyPassed:向左 ─────────────────────────────────────────────
|
||||
[Test]
|
||||
public void BodyPassed_Left_NotReached_False()
|
||||
=> Assert.IsFalse(EnemyBody.BodyPassed(MinX, MaxX, 1f, -1f)); // 目标在身体左侧外
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Left_OverlappingTarget_False()
|
||||
=> Assert.IsFalse(EnemyBody.BodyPassed(MinX, MaxX, 3f, -1f));
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Left_ExactlyAtRearEdge_True()
|
||||
=> Assert.IsTrue(EnemyBody.BodyPassed(MinX, MaxX, 4f, -1f)); // 后缘(max)恰好等于目标
|
||||
|
||||
[Test]
|
||||
public void BodyPassed_Left_FullyPassed_True()
|
||||
=> Assert.IsTrue(EnemyBody.BodyPassed(MinX, MaxX, 5f, -1f));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user