feat(ui): centralize retail selection state
This commit is contained in:
parent
c7607f019c
commit
7983309d23
30 changed files with 591 additions and 108 deletions
100
tests/AcDream.Core.Tests/Selection/SelectionStateTests.cs
Normal file
100
tests/AcDream.Core.Tests/Selection/SelectionStateTests.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
using AcDream.Core.Selection;
|
||||
using AcDream.Plugin.Abstractions;
|
||||
|
||||
namespace AcDream.Core.Tests.Selection;
|
||||
|
||||
public sealed class SelectionStateTests
|
||||
{
|
||||
[Fact]
|
||||
public void Select_CommitsOneTransitionAndTracksPreviousLikeRetail()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
var transitions = new List<SelectionTransition>();
|
||||
state.Changed += transitions.Add;
|
||||
|
||||
Assert.True(state.Select(0x50000001u, SelectionChangeSource.World));
|
||||
Assert.True(state.Select(0x50000002u, SelectionChangeSource.Radar));
|
||||
|
||||
Assert.Equal(0x50000002u, state.SelectedObjectId);
|
||||
Assert.Equal(0x50000001u, state.PreviousObjectId);
|
||||
Assert.Equal(0x50000001u, state.PreviousValidObjectId);
|
||||
Assert.Equal(2, transitions.Count);
|
||||
Assert.Equal(SelectionChangeSource.Radar, transitions[1].Source);
|
||||
Assert.Equal(SelectionChangeReason.Selected, transitions[1].Reason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Select_SameObject_IsDeduplicated()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
int changed = 0;
|
||||
state.Changed += _ => changed++;
|
||||
|
||||
Assert.True(state.Select(0x50000001u, SelectionChangeSource.World));
|
||||
Assert.False(state.Select(0x50000001u, SelectionChangeSource.Inventory));
|
||||
|
||||
Assert.Equal(1, changed);
|
||||
Assert.Null(state.PreviousObjectId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SelectPrevious_SwapsCurrentAndPrevious()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
state.Select(0x50000001u, SelectionChangeSource.World);
|
||||
state.Select(0x50000002u, SelectionChangeSource.World);
|
||||
|
||||
Assert.True(state.SelectPrevious());
|
||||
|
||||
Assert.Equal(0x50000001u, state.SelectedObjectId);
|
||||
Assert.Equal(0x50000002u, state.PreviousObjectId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClearRemoved_PreservesRemovedObjectAsPreviousValid()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
SelectionTransition transition = default;
|
||||
state.Changed += value => transition = value;
|
||||
state.Select(0x50000001u, SelectionChangeSource.World);
|
||||
|
||||
Assert.True(state.Clear(
|
||||
SelectionChangeSource.System,
|
||||
SelectionChangeReason.SelectedObjectRemoved));
|
||||
|
||||
Assert.Null(state.SelectedObjectId);
|
||||
Assert.Equal(0x50000001u, state.PreviousObjectId);
|
||||
Assert.Equal(0x50000001u, state.PreviousValidObjectId);
|
||||
Assert.Equal(SelectionChangeReason.SelectedObjectRemoved, transition.Reason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PluginService_UsesSameStateAndEventStream()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
ISelectionService plugin = state;
|
||||
SelectionChangedEvent change = default;
|
||||
plugin.Changed += value => change = value;
|
||||
|
||||
Assert.True(plugin.Select(0x50000001u));
|
||||
|
||||
Assert.Equal(0x50000001u, state.SelectedObjectId);
|
||||
Assert.Equal(0x50000001u, plugin.SelectedObjectId);
|
||||
Assert.Null(change.PreviousObjectId);
|
||||
Assert.Equal(0x50000001u, change.SelectedObjectId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PluginListenerFailure_DoesNotEscapeOrBlockOtherPlugins()
|
||||
{
|
||||
var state = new SelectionState();
|
||||
ISelectionService plugin = state;
|
||||
int delivered = 0;
|
||||
plugin.Changed += _ => throw new InvalidOperationException("plugin failure");
|
||||
plugin.Changed += _ => delivered++;
|
||||
|
||||
Assert.Null(Record.Exception(() => plugin.Select(0x50000001u)));
|
||||
Assert.Equal(1, delivered);
|
||||
Assert.Equal(0x50000001u, state.SelectedObjectId);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue