Resolve stacked thrown weapons versus separately equipped missile ammo exactly like gmToolbarUI, normalize a zero stack to one, and refresh the authored missile indicator from equipment and stack events. Keep the decision in pure Core with retained and real-DAT conformance coverage. Co-Authored-By: Codex <codex@openai.com>
65 lines
2 KiB
C#
65 lines
2 KiB
C#
using AcDream.Core.Items;
|
|
|
|
namespace AcDream.Core.Tests.Items;
|
|
|
|
public sealed class ToolbarAmmoPolicyTests
|
|
{
|
|
[Fact]
|
|
public void StackableMissileWeapon_isItsOwnAmmo()
|
|
{
|
|
var thrown = Item(1u, EquipMask.MissileWeapon, stack: 7, maxStack: 25);
|
|
var separateAmmo = Item(2u, EquipMask.MissileAmmo, stack: 80, maxStack: 100);
|
|
|
|
ToolbarAmmoPolicy.Result result = ToolbarAmmoPolicy.Resolve(
|
|
new[] { thrown, separateAmmo });
|
|
|
|
Assert.Equal(new ToolbarAmmoPolicy.Result(1u, 7), result);
|
|
}
|
|
|
|
[Fact]
|
|
public void NonStackableLauncher_usesSeparateAmmoSlot()
|
|
{
|
|
var bow = Item(1u, EquipMask.MissileWeapon, stack: 1, maxStack: 1);
|
|
var arrows = Item(2u, EquipMask.MissileAmmo, stack: 42, maxStack: 100);
|
|
|
|
ToolbarAmmoPolicy.Result result = ToolbarAmmoPolicy.Resolve(
|
|
new[] { bow, arrows });
|
|
|
|
Assert.Equal(new ToolbarAmmoPolicy.Result(2u, 42), result);
|
|
}
|
|
|
|
[Fact]
|
|
public void MissingAmmo_isHidden_andWireZeroStackDisplaysOne()
|
|
{
|
|
Assert.Equal(default, ToolbarAmmoPolicy.Resolve(Array.Empty<ClientObject>()));
|
|
|
|
var arrows = Item(3u, EquipMask.MissileAmmo, stack: 0, maxStack: 100);
|
|
Assert.Equal(
|
|
new ToolbarAmmoPolicy.Result(3u, 1),
|
|
ToolbarAmmoPolicy.Resolve(new[] { arrows }));
|
|
}
|
|
|
|
[Fact]
|
|
public void FirstIntersectingInventoryPlacementWins()
|
|
{
|
|
var first = Item(1u, EquipMask.MissileAmmo | EquipMask.Held, stack: 10, maxStack: 100);
|
|
var second = Item(2u, EquipMask.MissileAmmo, stack: 20, maxStack: 100);
|
|
|
|
Assert.Equal(
|
|
new ToolbarAmmoPolicy.Result(1u, 10),
|
|
ToolbarAmmoPolicy.Resolve(new[] { first, second }));
|
|
}
|
|
|
|
private static ClientObject Item(
|
|
uint id,
|
|
EquipMask location,
|
|
int stack,
|
|
int maxStack)
|
|
=> new()
|
|
{
|
|
ObjectId = id,
|
|
CurrentlyEquippedLocation = location,
|
|
StackSize = stack,
|
|
StackSizeMax = maxStack,
|
|
};
|
|
}
|