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(); } }