Bind queued actions and pending inventory requests to exact live incarnations, separate optimistic placement from authoritative responses, and serialize retail-style inventory ownership across UI surfaces. Co-authored-by: OpenAI Codex <codex@openai.com>
95 lines
2.4 KiB
C#
95 lines
2.4 KiB
C#
using AcDream.App.Input;
|
|
|
|
namespace AcDream.App.Tests.Input;
|
|
|
|
public sealed class OutboundInteractionQueueTests
|
|
{
|
|
[Fact]
|
|
public void Drain_PreservesInputOrder()
|
|
{
|
|
var queue = new OutboundInteractionQueue();
|
|
var actual = new List<string>();
|
|
|
|
queue.Enqueue(() => actual.Add("use-corpse"));
|
|
queue.Enqueue(() => actual.Add("pickup-item"));
|
|
|
|
queue.Drain();
|
|
|
|
Assert.Equal(new[] { "use-corpse", "pickup-item" }, actual);
|
|
Assert.Equal(0, queue.Count);
|
|
}
|
|
|
|
[Fact]
|
|
public void Drain_ReentrantEnqueueWaitsForNextFrame()
|
|
{
|
|
var queue = new OutboundInteractionQueue();
|
|
var actual = new List<string>();
|
|
queue.Enqueue(() =>
|
|
{
|
|
actual.Add("first");
|
|
queue.Enqueue(() => actual.Add("next-frame"));
|
|
});
|
|
|
|
queue.Drain();
|
|
|
|
Assert.Equal(new[] { "first" }, actual);
|
|
Assert.Equal(1, queue.Count);
|
|
|
|
queue.Drain();
|
|
|
|
Assert.Equal(new[] { "first", "next-frame" }, actual);
|
|
Assert.Equal(0, queue.Count);
|
|
}
|
|
|
|
[Fact]
|
|
public void Clear_DropsPendingSessionActions()
|
|
{
|
|
var queue = new OutboundInteractionQueue();
|
|
bool invoked = false;
|
|
queue.Enqueue(() => invoked = true);
|
|
|
|
queue.Clear();
|
|
queue.Drain();
|
|
|
|
Assert.False(invoked);
|
|
}
|
|
|
|
[Fact]
|
|
public void Drain_ReentrantClearStopsTheCapturedBatch()
|
|
{
|
|
var queue = new OutboundInteractionQueue();
|
|
var actual = new List<string>();
|
|
queue.Enqueue(() =>
|
|
{
|
|
actual.Add("first");
|
|
queue.Clear();
|
|
});
|
|
queue.Enqueue(() => actual.Add("stale"));
|
|
|
|
queue.Drain();
|
|
|
|
Assert.Equal(new[] { "first" }, actual);
|
|
Assert.Equal(0, queue.Count);
|
|
}
|
|
|
|
[Fact]
|
|
public void Drain_ReentrantClearAndEnqueueDefersTheNewEpoch()
|
|
{
|
|
var queue = new OutboundInteractionQueue();
|
|
var actual = new List<string>();
|
|
queue.Enqueue(() =>
|
|
{
|
|
actual.Add("first");
|
|
queue.Clear();
|
|
queue.Enqueue(() => actual.Add("new-session"));
|
|
});
|
|
queue.Enqueue(() => actual.Add("stale"));
|
|
|
|
queue.Drain();
|
|
Assert.Equal(new[] { "first" }, actual);
|
|
Assert.Equal(1, queue.Count);
|
|
|
|
queue.Drain();
|
|
Assert.Equal(new[] { "first", "new-session" }, actual);
|
|
}
|
|
}
|