using Godot; using GdUnit4; using static GdUnit4.Assertions; using Movementtests.interfaces; using Movementtests.systems.damage; namespace Movementtests.tests; [TestSuite, RequireGodotRuntime] public class EnemyUnitTest { [TestCase] public void ComputeDamage_NoComponent_ReturnsZero() { var enemy = new Enemy(); var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal)); var result = enemy.ComputeDamage(input); AssertFloat(result.Damage.DamageDealt).IsEqual(0.0f); } [TestCase] public void TakeDamage_WithCDamageable_AggregatesDamage() { var enemy = new Enemy(); var cDamage = new CDamageable(); cDamage.DamageModifiers = new[] { new RDamageModifier(EDamageTypes.Normal, 1.0f), new RDamageModifier(EDamageTypes.Normal, 2.0f) }; enemy.CDamageable = cDamage; var input = new DamageRecord(Vector3.Zero, new RDamage(10.0f, EDamageTypes.Normal)); var result = enemy.TakeDamage(input); AssertFloat(result.Damage.DamageDealt).IsEqual(30.0f); } [TestCase] public void ReduceHealth_WithCHealth_Decreases() { var enemy = new Enemy(); var health = new CHealth { RHealth = new RHealth(100.0f), CurrentHealth = 100.0f }; enemy.CHealth = health; var input = new DamageRecord(Vector3.Zero, new RDamage(25.0f, EDamageTypes.Normal)); var record = enemy.ReduceHealth(enemy, input); AssertFloat(health.CurrentHealth).IsEqual(75.0f); AssertFloat(record.CurrentHealth).IsEqual(75.0f); } [TestCase] public void Knockback_Register_And_Compute() { var enemy = new Enemy(); var cKnock = new CKnockback { RKnockback = new RKnockback(1.0f) }; enemy.CKnockback = cKnock; enemy.GlobalPosition = Vector3.Zero; cKnock.GlobalPosition = Vector3.Zero; var dmg = new DamageRecord(new Vector3(5, 0, 0), new RDamage(0, EDamageTypes.Normal)); var krec = new KnockbackRecord(dmg, 2.0f); enemy.RegisterKnockback(krec); var k = enemy.ComputeKnockback(); AssertVector(k).IsEqual(new Vector3(-2, 0, 0)); } [TestCase] public void Unstun_ResetsFlag() { var enemy = new Enemy(); enemy.IsStunned = true; enemy.Unstun(); AssertBool(enemy.IsStunned).IsFalse(); } }