140 lines
4.2 KiB
C#
140 lines
4.2 KiB
C#
using AcDream.App.UI;
|
|
using AcDream.App.UI.Layout;
|
|
using AcDream.Core.Items;
|
|
using AcDream.Core.Spells;
|
|
|
|
namespace AcDream.App.Tests.UI.Layout;
|
|
|
|
public sealed class ItemCooldownUiControllerTests
|
|
{
|
|
[Fact]
|
|
public void Shared_group_updates_existing_and_future_UIItems_from_one_clock()
|
|
{
|
|
var objects = new ClientObjectTable();
|
|
objects.AddOrUpdate(new ClientObject
|
|
{
|
|
ObjectId = 0x5001u,
|
|
CooldownId = 42u,
|
|
CooldownDuration = 30d,
|
|
});
|
|
|
|
var spellbook = new Spellbook();
|
|
spellbook.OnEnchantmentAdded(new ActiveEnchantmentRecord(
|
|
SpellId: 0x802Au,
|
|
LayerId: 1u,
|
|
Duration: 30d,
|
|
CasterGuid: 0u,
|
|
Bucket: Spellbook.CooldownBucket,
|
|
StartTime: 100d));
|
|
|
|
double now = 112.5d;
|
|
var root = new UiPanel();
|
|
var list = new UiItemList();
|
|
list.Cell.SetItem(0x5001u, 99u);
|
|
root.AddChild(list);
|
|
uint[] sprites = Enumerable.Range(1, 10)
|
|
.Select(index => 0x06000000u + (uint)index)
|
|
.ToArray();
|
|
|
|
ItemCooldownUiController controller = ItemCooldownUiController.Bind(
|
|
root,
|
|
spellbook,
|
|
objects,
|
|
() => now,
|
|
new ItemCooldownAssets(sprites));
|
|
|
|
Assert.Equal(sprites[5], list.Cell.ActiveCooldownSprite());
|
|
|
|
var future = new UiItemSlot();
|
|
future.SetItem(0x5001u, 100u);
|
|
list.AddItem(future);
|
|
Assert.Equal(sprites[5], future.ActiveCooldownSprite());
|
|
|
|
now = 129.999d;
|
|
controller.Tick();
|
|
Assert.Equal(sprites[0], list.Cell.ActiveCooldownSprite());
|
|
|
|
now = 130d;
|
|
controller.Tick();
|
|
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
|
|
Assert.Equal(0, spellbook.ActiveCount);
|
|
}
|
|
|
|
[Fact]
|
|
public void Hidden_ancestor_removes_list_from_retail_heartbeat_scope()
|
|
{
|
|
var objects = new ClientObjectTable();
|
|
objects.AddOrUpdate(new ClientObject
|
|
{
|
|
ObjectId = 0x5001u,
|
|
CooldownId = 42u,
|
|
CooldownDuration = 30d,
|
|
});
|
|
var spellbook = new Spellbook();
|
|
spellbook.OnEnchantmentAdded(new ActiveEnchantmentRecord(
|
|
SpellId: 0x802Au,
|
|
LayerId: 1u,
|
|
Duration: 30d,
|
|
CasterGuid: 0u,
|
|
Bucket: Spellbook.CooldownBucket,
|
|
StartTime: 100d));
|
|
var root = new UiPanel();
|
|
var window = new UiPanel();
|
|
var list = new UiItemList();
|
|
list.Cell.SetItem(0x5001u, 99u);
|
|
root.AddChild(window);
|
|
window.AddChild(list);
|
|
uint[] sprites = Enumerable.Range(1, 10)
|
|
.Select(index => 0x06000000u + (uint)index)
|
|
.ToArray();
|
|
ItemCooldownUiController controller = ItemCooldownUiController.Bind(
|
|
root,
|
|
spellbook,
|
|
objects,
|
|
() => 112.5d,
|
|
new ItemCooldownAssets(sprites));
|
|
Assert.Equal(sprites[5], list.Cell.ActiveCooldownSprite());
|
|
|
|
window.Visible = false;
|
|
controller.Tick();
|
|
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
|
|
|
|
window.Visible = true;
|
|
controller.Tick();
|
|
Assert.Equal(sprites[5], list.Cell.ActiveCooldownSprite());
|
|
}
|
|
|
|
[Fact]
|
|
public void Empty_cooldown_registry_skips_clock_and_item_walk()
|
|
{
|
|
var objects = new ClientObjectTable();
|
|
objects.AddOrUpdate(new ClientObject
|
|
{
|
|
ObjectId = 0x5001u,
|
|
CooldownId = 42u,
|
|
CooldownDuration = 30d,
|
|
});
|
|
var spellbook = new Spellbook();
|
|
var root = new UiPanel();
|
|
var list = new UiItemList();
|
|
list.Cell.SetItem(0x5001u, 99u);
|
|
root.AddChild(list);
|
|
int clockReads = 0;
|
|
ItemCooldownUiController controller = ItemCooldownUiController.Bind(
|
|
root,
|
|
spellbook,
|
|
objects,
|
|
() =>
|
|
{
|
|
clockReads++;
|
|
return 100d;
|
|
},
|
|
new ItemCooldownAssets(
|
|
Enumerable.Range(1, 10).Select(index => (uint)index).ToArray()));
|
|
|
|
controller.Tick();
|
|
|
|
Assert.Equal(0, clockReads);
|
|
Assert.Equal(0u, list.Cell.ActiveCooldownSprite());
|
|
}
|
|
}
|