Files
zeling_v2/Assets/Tests/EditMode/StatusEffectTests.cs
2026-05-13 09:19:54 +08:00

134 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}