Files
2026-05-31 21:35:12 -07:00

74 lines
3.2 KiB
C#

using NUnit.Framework;
using ProjectM.Server;
using ProjectM.Simulation;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
namespace ProjectM.Tests
{
/// <summary>
/// Plain-Entities test for <see cref="UpgradePickupSystem"/> (server grant). A player overlapping a
/// pickup gets the pickup's modifier appended to its StatModifier buffer and the pickup is destroyed;
/// a player out of range leaves the buffer empty and the pickup alive. The system's ECB plays back
/// immediately (server pattern), so no separate ECB system is needed.
/// </summary>
public class UpgradePickupSystemTests
{
static (World world, Entity player, Entity pickup) MakeWorld(float3 playerPos, float3 pickupPos, float radius)
{
var world = new World("UpgradePickupTestWorld");
var group = world.GetOrCreateSystemManaged<SimulationSystemGroup>();
group.AddSystemToUpdateList(world.GetOrCreateSystem<UpgradePickupSystem>());
group.SortSystems();
var em = world.EntityManager;
var player = em.CreateEntity(typeof(PlayerTag), typeof(StatModifier), typeof(LocalTransform));
em.SetComponentData(player, LocalTransform.FromPosition(playerPos));
var pickup = em.CreateEntity(typeof(UpgradePickup), typeof(HitRadius), typeof(LocalTransform));
em.SetComponentData(pickup, LocalTransform.FromPosition(pickupPos));
em.SetComponentData(pickup, new HitRadius { Value = radius });
em.SetComponentData(pickup, new UpgradePickup
{
Target = (byte)StatTarget.Damage, Op = (byte)ModOp.Flat, Value = 25f, SourceId = 7u
});
return (world, player, pickup);
}
[Test]
public void Overlap_Grants_Modifier_And_Destroys_Pickup()
{
var (world, player, pickup) = MakeWorld(float3.zero, new float3(0.5f, 0f, 0f), 1f);
try
{
world.GetExistingSystemManaged<SimulationSystemGroup>().Update();
var buf = world.EntityManager.GetBuffer<StatModifier>(player);
Assert.AreEqual(1, buf.Length);
Assert.AreEqual((byte)StatTarget.Damage, buf[0].Target);
Assert.AreEqual((byte)ModOp.Flat, buf[0].Op);
Assert.AreEqual(25f, buf[0].Value, 1e-4f);
Assert.AreEqual(7u, buf[0].SourceId);
Assert.IsFalse(world.EntityManager.Exists(pickup), "Pickup should be destroyed after grant.");
}
finally { world.Dispose(); }
}
[Test]
public void Out_Of_Range_Leaves_Buffer_Empty_And_Pickup_Alive()
{
var (world, player, pickup) = MakeWorld(float3.zero, new float3(10f, 0f, 0f), 1f);
try
{
world.GetExistingSystemManaged<SimulationSystemGroup>().Update();
var buf = world.EntityManager.GetBuffer<StatModifier>(player);
Assert.AreEqual(0, buf.Length);
Assert.IsTrue(world.EntityManager.Exists(pickup), "Out-of-range pickup should remain.");
}
finally { world.Dispose(); }
}
}
}