102 lines
3.7 KiB
C#
102 lines
3.7 KiB
C#
using Godot;
|
|
using GdUnit4;
|
|
using static GdUnit4.Assertions;
|
|
using Movementtests.interfaces;
|
|
using Movementtests.systems.damage;
|
|
|
|
namespace Movementtests.tests;
|
|
|
|
[TestSuite, RequireGodotRuntime]
|
|
public class DamageComponentUnitTest
|
|
{
|
|
[TestCase]
|
|
public void DamageModifierAppliesWhenTypeMatches()
|
|
{
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var modifier = new RDamageModifier(EDamageTypes.Normal, 2.0f);
|
|
var signalTriggered = false;
|
|
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var result = modifier.TakeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(20.0f);
|
|
AssertBool(signalTriggered).IsTrue();
|
|
}
|
|
|
|
[TestCase]
|
|
public void DamageModifierIgnoresWhenTypeDifferent()
|
|
{
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var modifier = new RDamageModifier(EDamageTypes.Fire, 3.0f);
|
|
var signalTriggered = false;
|
|
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var result = modifier.TakeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f);
|
|
AssertBool(signalTriggered).IsFalse(); // No damage actually taken
|
|
}
|
|
|
|
[TestCase]
|
|
public void DamageableSumsAllModifiers()
|
|
{
|
|
var mod1 = new RDamageModifier(EDamageTypes.Normal, 1.0f);
|
|
var mod2 = new RDamageModifier(EDamageTypes.Normal, 0.5f);
|
|
|
|
var damageable = new CDamageable();
|
|
damageable.DamageModifiers = new[] { mod1, mod2 };
|
|
var signalTriggered = false;
|
|
damageable.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var result = damageable.TakeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(15.0f);
|
|
AssertBool(signalTriggered).IsTrue();
|
|
}
|
|
|
|
[TestCase]
|
|
public void ComputeDamageModifierAppliesWhenTypeMatches()
|
|
{
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var modifier = new RDamageModifier(EDamageTypes.Normal, 2.0f);
|
|
var signalTriggered = false;
|
|
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var result = modifier.ComputeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(20.0f);
|
|
AssertBool(signalTriggered).IsFalse();
|
|
}
|
|
[TestCase]
|
|
public void ComputeDamageModifierIgnoresWhenTypeDifferent()
|
|
{
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var modifier = new RDamageModifier(EDamageTypes.Fire, 3.0f);
|
|
var signalTriggered = false;
|
|
modifier.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var result = modifier.ComputeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f);
|
|
AssertBool(signalTriggered).IsFalse();
|
|
}
|
|
[TestCase]
|
|
public void ComputeDamageableSumsAllModifiers()
|
|
{
|
|
var mod1 = new RDamageModifier(EDamageTypes.Normal, 1.0f);
|
|
var mod2 = new RDamageModifier(EDamageTypes.Normal, 0.5f);
|
|
|
|
var cDamageable = new CDamageable();
|
|
cDamageable.DamageModifiers = new[] { mod1, mod2 };
|
|
var signalTriggered = false;
|
|
cDamageable.DamageTaken += (_, _) => signalTriggered = true;
|
|
|
|
var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal));
|
|
var result = cDamageable.ComputeDamage(input);
|
|
|
|
AssertFloat(result.Damage.DamageDealt).IsEqual(15.0f);
|
|
AssertBool(signalTriggered).IsFalse();
|
|
}
|
|
}
|