Make character UI retries transactional
This commit is contained in:
parent
aeac874dab
commit
1dd5706e15
6 changed files with 352 additions and 42 deletions
|
|
@ -542,6 +542,110 @@ public sealed class RetailDialogFactoryTests
|
|||
Assert.True(factory.CloseDialog(later));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PriorityRequest_PreemptsOrdinaryRetryAndPreservesOrdinaryFifo()
|
||||
{
|
||||
var root = new UiRoot { Width = 800f, Height = 600f };
|
||||
bool waitsAvailable = false;
|
||||
using var factory = new RetailDialogFactory(root, type =>
|
||||
type == RetailDialogType.Wait && !waitsAvailable
|
||||
? null
|
||||
: BuildDialogLayout(type));
|
||||
|
||||
uint failed = factory.MakeWait("failed ordinary");
|
||||
uint later = factory.MakeWait("later ordinary");
|
||||
uint priority = factory.MakeDialog(
|
||||
Priority(RetailDialogData.Message("priority")));
|
||||
|
||||
Assert.Equal(1, factory.ActiveCount);
|
||||
Assert.Equal(1, factory.RetryCount);
|
||||
Assert.Equal(1, factory.PendingCount);
|
||||
Assert.Equal("priority", MessageFromAnyDialog(root.Modal!));
|
||||
|
||||
Assert.True(factory.CloseDialog(priority));
|
||||
Assert.Equal(0, factory.ActiveCount);
|
||||
Assert.Equal(1, factory.RetryCount);
|
||||
Assert.Equal(1, factory.PendingCount);
|
||||
|
||||
waitsAvailable = true;
|
||||
factory.Tick();
|
||||
Assert.Equal("failed ordinary", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(failed));
|
||||
Assert.Equal("later ordinary", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(later));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FailedPriority_RetriesAheadOfRestoredActiveAndQueuedDialog()
|
||||
{
|
||||
var root = new UiRoot { Width = 800f, Height = 600f };
|
||||
bool priorityAvailable = false;
|
||||
using var factory = new RetailDialogFactory(root, type =>
|
||||
type == RetailDialogType.Message && !priorityAvailable
|
||||
? null
|
||||
: BuildDialogLayout(type));
|
||||
|
||||
uint active = factory.MakeWait("active");
|
||||
uint queued = factory.MakeWait("queued");
|
||||
uint priority = factory.MakeDialog(
|
||||
Priority(RetailDialogData.Message("priority")));
|
||||
|
||||
Assert.Equal(1, factory.ActiveCount);
|
||||
Assert.Equal(1, factory.RetryCount);
|
||||
Assert.Equal(1, factory.PendingCount);
|
||||
Assert.Equal("active", MessageFromAnyDialog(root.Modal!));
|
||||
|
||||
priorityAvailable = true;
|
||||
factory.Tick();
|
||||
|
||||
Assert.Equal(1, factory.ActiveCount);
|
||||
Assert.Equal(0, factory.RetryCount);
|
||||
Assert.Equal(2, factory.PendingCount);
|
||||
Assert.Equal("priority", MessageFromAnyDialog(root.Modal!));
|
||||
|
||||
Assert.True(factory.CloseDialog(priority));
|
||||
Assert.Equal("active", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.Equal(1, factory.PendingCount);
|
||||
Assert.True(factory.CloseDialog(active));
|
||||
Assert.Equal("queued", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(queued));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MultipleRetries_NewestPriorityFirstThenOlderPriorityThenOrdinaryFifo()
|
||||
{
|
||||
var root = new UiRoot { Width = 800f, Height = 600f };
|
||||
bool available = false;
|
||||
using var factory = new RetailDialogFactory(root, type =>
|
||||
!available ? null : BuildDialogLayout(type));
|
||||
|
||||
uint ordinary = factory.MakeWait("ordinary");
|
||||
uint later = factory.MakeWait("later");
|
||||
uint olderPriority = factory.MakeDialog(
|
||||
Priority(RetailDialogData.Message("older priority")));
|
||||
uint newerPriority = factory.MakeDialog(Priority(
|
||||
RetailDialogData.ConfirmationTextInput("newer priority")));
|
||||
|
||||
Assert.Equal(0, factory.ActiveCount);
|
||||
Assert.Equal(3, factory.RetryCount);
|
||||
Assert.Equal(1, factory.PendingCount);
|
||||
|
||||
available = true;
|
||||
factory.Tick();
|
||||
|
||||
Assert.Equal(1, factory.ActiveCount);
|
||||
Assert.Equal(2, factory.RetryCount);
|
||||
Assert.Equal("newer priority", MessageFromAnyDialog(root.Modal!));
|
||||
|
||||
Assert.True(factory.CloseDialog(newerPriority));
|
||||
Assert.Equal("older priority", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(olderPriority));
|
||||
Assert.Equal("ordinary", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(ordinary));
|
||||
Assert.Equal("later", MessageFromAnyDialog(root.Modal!));
|
||||
Assert.True(factory.CloseDialog(later));
|
||||
}
|
||||
|
||||
private static RetailDialogFactory CreateFactory(
|
||||
UiRoot root,
|
||||
List<ImportedLayout> layouts)
|
||||
|
|
@ -575,6 +679,11 @@ public sealed class RetailDialogFactoryTests
|
|||
.LinesProvider()
|
||||
.Select(static line => line.Text));
|
||||
|
||||
private static RetailDialogData Priority(RetailDialogData data) =>
|
||||
data.Set(RetailDialogProperty.Priority, true)
|
||||
.Set(RetailDialogProperty.QueueKey,
|
||||
RetailDialogFactory.DefaultQueueKey);
|
||||
|
||||
internal static ImportedLayout BuildDialogLayout(RetailDialogType type)
|
||||
{
|
||||
uint rootId = RetailDialogFactory.RootElementId(type);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue