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 DamageModifier_Applies_WhenTypeMatches() { var modifier = new RDamageModifier(EDamageTypes.Normal, 2.0f); var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal)); var result = modifier.TakeDamage(input); AssertFloat(result.Damage.DamageDealt).IsEqual(20.0f); } [TestCase] public void DamageModifier_Ignores_WhenTypeDifferent() { var modifier = new RDamageModifier(EDamageTypes.Fire, 3.0f); var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal)); var result = modifier.TakeDamage(input); AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f); } [TestCase] public void CDamageable_Sums_All_Modifiers() { 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 input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal)); var result = cDamageable.TakeDamage(input); // 10*1.0 + 10*0.5 = 15 AssertFloat(result.Damage.DamageDealt).IsEqual(15.0f); } [TestCase] public void CDamageable_ComputeDamage_DoesNotEmit() { var mod = new RDamageModifier(EDamageTypes.Normal, 2.0f); var cDamageable = new CDamageable(); cDamageable.DamageModifiers = new[] { mod }; var input = new DamageRecord(Vector3.Zero, new RDamage(5.0f, EDamageTypes.Normal)); var result = cDamageable.ComputeDamage(input); AssertFloat(result.Damage.DamageDealt).IsEqual(10.0f); } }