多轮审查评估
This commit is contained in:
133
Assets/Tests/EditMode/StatusEffectTests.cs
Normal file
133
Assets/Tests/EditMode/StatusEffectTests.cs
Normal file
@@ -0,0 +1,133 @@
|
||||
using NUnit.Framework;
|
||||
using BaseGames.Combat.StatusEffects;
|
||||
|
||||
namespace BaseGames.Tests.EditMode
|
||||
{
|
||||
/// <summary>
|
||||
/// StatusEffect 系统单元测试(EditMode,纯 C# 类,无需 MonoBehaviour)。
|
||||
/// 覆盖:叠加规则、互斥规则、阻断规则、到期检测。
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class StatusEffectTests
|
||||
{
|
||||
// ── 叠加规则 ─────────────────────────────────────────────────────────
|
||||
|
||||
[Test]
|
||||
public void FireEffect_MaxStacks_IsOne()
|
||||
{
|
||||
var effect = new FireEffect();
|
||||
Assert.AreEqual(1, effect.MaxStacks);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PoisonEffect_MaxStacks_IsThree()
|
||||
{
|
||||
var effect = new PoisonEffect();
|
||||
Assert.AreEqual(3, effect.MaxStacks);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PoisonEffect_OnStack_IncreasesStackCount()
|
||||
{
|
||||
var effect = new PoisonEffect();
|
||||
effect.OnStack();
|
||||
Assert.AreEqual(2, effect.StackCount);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PoisonEffect_OnStack_ClampsAtMaxStacks()
|
||||
{
|
||||
var effect = new PoisonEffect();
|
||||
for (int i = 0; i < 10; i++) effect.OnStack();
|
||||
Assert.AreEqual(effect.MaxStacks, effect.StackCount);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StaggerEffect_MaxStacks_IsOne()
|
||||
{
|
||||
var effect = new StaggerEffect();
|
||||
Assert.AreEqual(1, effect.MaxStacks);
|
||||
}
|
||||
|
||||
// ── 互斥规则 ─────────────────────────────────────────────────────────
|
||||
|
||||
[Test]
|
||||
public void FireEffect_MutualExclusions_ContainsFreeze()
|
||||
{
|
||||
var effect = new FireEffect();
|
||||
Assert.Contains(StatusEffectType.Freeze, effect.MutualExclusions);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PoisonEffect_MutualExclusions_IsEmpty()
|
||||
{
|
||||
var effect = new PoisonEffect();
|
||||
Assert.IsEmpty(effect.MutualExclusions);
|
||||
}
|
||||
|
||||
// ── 阻断规则 ─────────────────────────────────────────────────────────
|
||||
|
||||
[Test]
|
||||
public void StaggerEffect_BlockedBy_ContainsStun()
|
||||
{
|
||||
var effect = new StaggerEffect();
|
||||
Assert.Contains(StatusEffectType.Stun, effect.BlockedBy);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FireEffect_BlockedBy_IsEmpty()
|
||||
{
|
||||
var effect = new FireEffect();
|
||||
Assert.IsEmpty(effect.BlockedBy);
|
||||
}
|
||||
|
||||
// ── 到期检测 ─────────────────────────────────────────────────────────
|
||||
|
||||
[Test]
|
||||
public void StatusEffect_IsExpired_AfterDurationDepleted()
|
||||
{
|
||||
var effect = new StaggerEffect(0.5f);
|
||||
effect.OnApply(null); // Owner 可为 null,测试纯时间逻辑
|
||||
|
||||
effect.Update(0.3f);
|
||||
Assert.IsFalse(effect.IsExpired);
|
||||
|
||||
effect.Update(0.3f); // 累计 0.6f > 0.5f
|
||||
Assert.IsTrue(effect.IsExpired);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FireEffect_OnStack_RefreshDuration()
|
||||
{
|
||||
var effectA = new FireEffect();
|
||||
effectA.OnApply(null);
|
||||
float initialDuration = effectA.Duration;
|
||||
|
||||
effectA.Update(1.0f); // 消耗部分时间
|
||||
Assert.Less(effectA.Duration, initialDuration);
|
||||
|
||||
effectA.OnStack(); // 重叠施加,应刷新持续时间
|
||||
Assert.AreEqual(initialDuration, effectA.Duration, 0.001f);
|
||||
}
|
||||
|
||||
// ── 类型标识 ─────────────────────────────────────────────────────────
|
||||
|
||||
[Test]
|
||||
public void FireEffect_EffectType_IsFire()
|
||||
{
|
||||
Assert.AreEqual(StatusEffectType.Fire, new FireEffect().EffectType);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PoisonEffect_EffectType_IsPoison()
|
||||
{
|
||||
Assert.AreEqual(StatusEffectType.Poison, new PoisonEffect().EffectType);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StaggerEffect_EffectType_IsStagger()
|
||||
{
|
||||
Assert.AreEqual(StatusEffectType.Stagger, new StaggerEffect().EffectType);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user