134 lines
4.6 KiB
C#
134 lines
4.6 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|