basic tests for a wider variety of files
This commit is contained in:
59
tests/components/DamageComponentUnitTest.cs
Normal file
59
tests/components/DamageComponentUnitTest.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
1
tests/components/DamageComponentUnitTest.cs.uid
Normal file
1
tests/components/DamageComponentUnitTest.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://db6rva7uccppc
|
||||
56
tests/components/HealthComponentUnitTest.cs
Normal file
56
tests/components/HealthComponentUnitTest.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using Godot;
|
||||
using GdUnit4;
|
||||
using static GdUnit4.Assertions;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.systems.damage;
|
||||
|
||||
namespace Movementtests.tests;
|
||||
|
||||
[TestSuite, RequireGodotRuntime]
|
||||
public class HealthComponentUnitTest
|
||||
{
|
||||
[TestCase]
|
||||
public void ReadyInitializesCurrentHealth()
|
||||
{
|
||||
var cHealth = new CHealth();
|
||||
cHealth.RHealth = new RHealth(150.0f);
|
||||
// Simulate Godot ready
|
||||
cHealth._Ready();
|
||||
AssertFloat(cHealth.CurrentHealth).IsEqual(150.0f);
|
||||
}
|
||||
|
||||
[TestCase]
|
||||
public void ReduceHealthDecreasesAndDoesNotDeplete()
|
||||
{
|
||||
var cHealth = new CHealth();
|
||||
cHealth.RHealth = new RHealth(100.0f);
|
||||
cHealth.CurrentHealth = 100.0f;
|
||||
|
||||
var damage = new DamageRecord(Vector3.Zero, new RDamage(25.0f, EDamageTypes.Normal));
|
||||
var record = cHealth.ReduceHealth(source: null!, damageRecord: damage);
|
||||
|
||||
AssertFloat(cHealth.CurrentHealth).IsEqual(75.0f);
|
||||
AssertFloat(record.CurrentHealth).IsEqual(75.0f);
|
||||
AssertFloat(record.PreviousHealth).IsEqual(100.0f);
|
||||
AssertFloat(record.MaxHealth).IsEqual(100.0f);
|
||||
}
|
||||
|
||||
[TestCase]
|
||||
public void ReduceHealthTriggersDepletionToZero()
|
||||
{
|
||||
var cHealth = new CHealth();
|
||||
cHealth.RHealth = new RHealth(50.0f);
|
||||
cHealth.CurrentHealth = 50.0f;
|
||||
|
||||
bool depleted = false;
|
||||
cHealth.HealthDepleted += _ => depleted = true;
|
||||
|
||||
var damage = new DamageRecord(Vector3.Zero, new RDamage(100.0f, EDamageTypes.Normal));
|
||||
var record = cHealth.ReduceHealth(source: null!, damageRecord: damage);
|
||||
|
||||
AssertBool(depleted).IsTrue();
|
||||
AssertFloat(cHealth.CurrentHealth).IsEqual(0.0f);
|
||||
AssertFloat(record.CurrentHealth).IsEqual(-50.0f);
|
||||
AssertFloat(record.MaxHealth).IsEqual(50.0f);
|
||||
}
|
||||
}
|
||||
1
tests/components/HealthComponentUnitTest.cs.uid
Normal file
1
tests/components/HealthComponentUnitTest.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bd52i51hncgmf
|
||||
31
tests/components/KnockbackComponentUnitTest.cs
Normal file
31
tests/components/KnockbackComponentUnitTest.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using Godot;
|
||||
using GdUnit4;
|
||||
using static GdUnit4.Assertions;
|
||||
using Movementtests.interfaces;
|
||||
|
||||
namespace Movementtests.tests;
|
||||
|
||||
[TestSuite, RequireGodotRuntime]
|
||||
public class KnockbackComponentUnitTest
|
||||
{
|
||||
[TestCase]
|
||||
public void RegisterAndComputeKnockback_Works_And_Resets()
|
||||
{
|
||||
var cKnock = new CKnockback();
|
||||
cKnock.RKnockback = new RKnockback(2.0f);
|
||||
cKnock.GlobalPosition = Vector3.Zero;
|
||||
|
||||
var damage = new DamageRecord(new Vector3(10, 0, 0), new RDamage(0, Movementtests.systems.damage.EDamageTypes.Normal));
|
||||
var record = new KnockbackRecord(damage, 1.5f);
|
||||
|
||||
cKnock.RegisterKnockback(record);
|
||||
var force = cKnock.ComputeKnockback();
|
||||
|
||||
// Direction from source(10,0,0) to target(0,0,0) is (-1,0,0), scaled by modifier(2) and multiplier(1.5) => (-3,0,0)
|
||||
AssertVector(force).IsEqual(new Vector3(-3, 0, 0));
|
||||
|
||||
// Second call returns zero since internal state resets
|
||||
var second = cKnock.ComputeKnockback();
|
||||
AssertVector(second).IsEqual(Vector3.Zero);
|
||||
}
|
||||
}
|
||||
1
tests/components/KnockbackComponentUnitTest.cs.uid
Normal file
1
tests/components/KnockbackComponentUnitTest.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bv0eionbgbig5
|
||||
32
tests/components/MovementSystemUnitTest.cs
Normal file
32
tests/components/MovementSystemUnitTest.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using Godot;
|
||||
using GdUnit4;
|
||||
using static GdUnit4.Assertions;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.scenes.movement;
|
||||
|
||||
namespace Movementtests.tests;
|
||||
|
||||
[TestSuite, RequireGodotRuntime]
|
||||
public class MovementSystemUnitTest
|
||||
{
|
||||
[TestCase]
|
||||
public void GroundedMovement_Accelerates_And_Applies_Gravity()
|
||||
{
|
||||
var move = new CGroundedMovement();
|
||||
move.RMovement = new RMovement(speed: 10.0f, acceleration: 1.0f, gravityModifier: 0.5f, targetHeight: 0.0f);
|
||||
move.WallInFrontRayCast = new RayCast3D();
|
||||
move.GlobalPosition = Vector3.Zero;
|
||||
|
||||
var inputs = new MovementInputs(
|
||||
Velocity: Vector3.Zero,
|
||||
TargetLocation: new Vector3(10, 0, 0),
|
||||
isOnFloor: false,
|
||||
gravity: Vector3.Down * 9.8f,
|
||||
delta: 1.0
|
||||
);
|
||||
|
||||
var v = move.ComputeVelocity(inputs);
|
||||
|
||||
AssertVector(v).IsEqualApprox(new Vector3(10, -4.9f, 0), new Vector3(0.0001f, 0.0001f, 0.0001f));
|
||||
}
|
||||
}
|
||||
1
tests/components/MovementSystemUnitTest.cs.uid
Normal file
1
tests/components/MovementSystemUnitTest.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cofj5s4x74ay
|
||||
Reference in New Issue
Block a user