using NUnit.Framework;
using ProjectM.Simulation;
using Unity.Collections;
using Unity.Entities;
namespace ProjectM.Tests
{
///
/// Builds an AbilityDatabaseBlob with BlobBuilder (the same shape the AbilityDatabaseAuthoring baker
/// produces) and verifies the id lookups round-trip values including FixedString names, and that a
/// missing id returns false. Version-independent, no ECS world.
///
public class AbilityDatabaseBlobTests
{
static BlobAssetReference Build()
{
using var builder = new BlobBuilder(Allocator.Temp);
ref var root = ref builder.ConstructRoot();
var abilities = builder.Allocate(ref root.Abilities, 2);
abilities[0] = new AbilityDefBlob
{
Id = (byte)AbilityId.Primary, Damage = 20f, ProjectileSpeed = 25f, Range = 20f,
AutoTargetRange = 12f, AutoTargetConeRadians = 0.6f, CooldownTicks = 12, Name = "Primary"
};
abilities[1] = new AbilityDefBlob
{
Id = (byte)AbilityId.FastLight, Damage = 8f, ProjectileSpeed = 40f, Range = 16f,
AutoTargetRange = 12f, AutoTargetConeRadians = 0.6f, CooldownTicks = 5, Name = "FastLight"
};
var chars = builder.Allocate(ref root.Characters, 1);
chars[0] = new CharacterStatsBlob
{
Id = (byte)CharacterId.Default, MoveSpeed = 6f, TurnRateRadiansPerSec = 12.5f,
MaxHealth = 100f, Name = "Default"
};
return builder.CreateBlobAssetReference(Allocator.Persistent);
}
[Test]
public void TryGetAbility_Hit_Returns_Fields()
{
var blob = Build();
try
{
Assert.IsTrue(blob.Value.TryGetAbility((byte)AbilityId.FastLight, out var def));
Assert.AreEqual(8f, def.Damage, 1e-4f);
Assert.AreEqual(40f, def.ProjectileSpeed, 1e-4f);
Assert.AreEqual(5, def.CooldownTicks);
Assert.AreEqual("FastLight", def.Name.ToString());
}
finally { blob.Dispose(); }
}
[Test]
public void TryGetAbility_Miss_Returns_False()
{
var blob = Build();
try
{
Assert.IsFalse(blob.Value.TryGetAbility((byte)AbilityId.SlowHeavy, out _));
}
finally { blob.Dispose(); }
}
[Test]
public void TryGetCharacter_Hit_Returns_Fields()
{
var blob = Build();
try
{
Assert.IsTrue(blob.Value.TryGetCharacter((byte)CharacterId.Default, out var def));
Assert.AreEqual(6f, def.MoveSpeed, 1e-4f);
Assert.AreEqual(100f, def.MaxHealth, 1e-4f);
Assert.AreEqual("Default", def.Name.ToString());
}
finally { blob.Dispose(); }
}
}
}