feat(mosstank): add VTank-style automation PoC
This commit is contained in:
parent
f6fe0f2a4f
commit
4e6e9bc9d9
212 changed files with 49462 additions and 416 deletions
|
|
@ -4,6 +4,79 @@ namespace AcDream.App.Tests.UI;
|
|||
|
||||
public class MarkupDocumentTests
|
||||
{
|
||||
private sealed class EditorBinding
|
||||
{
|
||||
public string Draft { get; private set; } = "initial";
|
||||
public string Submitted { get; private set; } = string.Empty;
|
||||
public string Selected { get; private set; } = "First";
|
||||
public int SelectedIndex { get; private set; }
|
||||
public IReadOnlyList<string> Choices => ["First", "Second"];
|
||||
public IReadOnlyList<uint> ChoiceColors => [0xFF0000u, 0x00FF00u];
|
||||
public Action<string> ChangeDraft => value => Draft = value;
|
||||
public Action<string> SubmitDraft => value => Submitted = value;
|
||||
public Action<string> SelectChoice => value => Selected = value;
|
||||
public Action<int> SelectIndex => value => SelectedIndex = value;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FieldAndMenuBindEditablePluginState()
|
||||
{
|
||||
const string xml = """
|
||||
<panel x="0" y="0" w="240" h="120">
|
||||
<field x="4" y="4" w="120" h="20" text="{Draft}"
|
||||
onchange="{ChangeDraft}" onsubmit="{SubmitDraft}" />
|
||||
<menu x="4" y="32" w="120" h="20" items="{Choices}"
|
||||
selected="{Selected}" onchange="{SelectChoice}" />
|
||||
<list x="132" y="4" w="100" h="40" items="{Choices}"
|
||||
colors="{ChoiceColors}"
|
||||
selected="{SelectedIndex}" onchange="{SelectIndex}" />
|
||||
</panel>
|
||||
""";
|
||||
var binding = new EditorBinding();
|
||||
|
||||
UiNineSlicePanel panel = MarkupDocument.Build(
|
||||
xml,
|
||||
binding,
|
||||
_ => (1u, 32, 32));
|
||||
|
||||
UiField field = Assert.IsType<UiField>(panel.Children[0]);
|
||||
UiMenu menu = Assert.IsType<UiMenu>(panel.Children[1]);
|
||||
UiMarkupList list = Assert.IsType<UiMarkupList>(panel.Children[2]);
|
||||
field.SetText("named profile");
|
||||
field.OnSubmit?.Invoke(field.Text);
|
||||
menu.OnSelect?.Invoke("Second");
|
||||
list.OnEvent(new UiEvent
|
||||
{
|
||||
Type = UiEventType.MouseDown,
|
||||
Data2 = 19,
|
||||
});
|
||||
|
||||
Assert.Equal("named profile", binding.Draft);
|
||||
Assert.Equal("named profile", binding.Submitted);
|
||||
Assert.Equal("Second", binding.Selected);
|
||||
Assert.Equal(1, binding.SelectedIndex);
|
||||
Assert.Equal(2, menu.Items.Count);
|
||||
Assert.Equal([0xFF0000u, 0x00FF00u], list.ItemColorsSource());
|
||||
Assert.False(menu.OpenUpward);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ControlIdAndNameBecomeStablePluginControlNames()
|
||||
{
|
||||
const string xml = """
|
||||
<panel x="0" y="0" w="200" h="80">
|
||||
<button id="ById" x="4" y="4" w="80" h="20" text="One" />
|
||||
<label name="ByName" x="4" y="28" text="Two" />
|
||||
</panel>
|
||||
""";
|
||||
|
||||
UiNineSlicePanel panel = MarkupDocument.Build(
|
||||
xml, new object(), _ => (1u, 32, 32));
|
||||
|
||||
Assert.Equal("ById", panel.Children[0].Name);
|
||||
Assert.Equal("ByName", panel.Children[1].Name);
|
||||
}
|
||||
|
||||
private sealed class FakeBinding
|
||||
{
|
||||
public float HealthPercent => 0.5f;
|
||||
|
|
@ -82,6 +155,14 @@ public class MarkupDocumentTests
|
|||
public string Status { get; set; } = "idle";
|
||||
public Action Go => () => Clicks++;
|
||||
public Action? Missing => null;
|
||||
public bool CanGo { get; set; } = true;
|
||||
public bool OptionsSelected { get; set; } = true;
|
||||
public bool OptionsVisible { get; set; } = true;
|
||||
public bool CombatEnabled { get; set; }
|
||||
public float AttackPower { get; private set; } = 0.5f;
|
||||
public Action ShowOptions => () => OptionsSelected = true;
|
||||
public Action ToggleCombat => () => CombatEnabled = !CombatEnabled;
|
||||
public Action<float> SetAttackPower => value => AttackPower = value;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -148,4 +229,89 @@ public class MarkupDocumentTests
|
|||
var label = Assert.IsType<UiLabel>(panel.Children[0]);
|
||||
Assert.Equal("MossTank", label.TextSource!());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_ProjectsBoundEnabledAndButtonColors()
|
||||
{
|
||||
const string xml =
|
||||
"<panel x=\"0\" y=\"0\" w=\"100\" h=\"60\">" +
|
||||
"<button x=\"0\" y=\"0\" w=\"50\" h=\"20\" text=\"Go\" " +
|
||||
"onclick=\"{Go}\" enabled=\"{CanGo}\" " +
|
||||
"background=\"#FF112233\" border=\"#FF445566\"/>" +
|
||||
"</panel>";
|
||||
var binding = new ButtonBinding();
|
||||
UiNineSlicePanel panel = MarkupDocument.Build(
|
||||
xml, binding, _ => ((uint)1, 32, 32));
|
||||
var button = Assert.IsType<UiSimpleButton>(panel.Children[0]);
|
||||
|
||||
Assert.NotNull(button.EnabledSource);
|
||||
Assert.True(button.EnabledSource!());
|
||||
binding.CanGo = false;
|
||||
Assert.False(button.EnabledSource!());
|
||||
Assert.Equal(new System.Numerics.Vector4(
|
||||
0x11 / 255f, 0x22 / 255f, 0x33 / 255f, 1f),
|
||||
button.BackgroundColor);
|
||||
Assert.Equal(new System.Numerics.Vector4(
|
||||
0x44 / 255f, 0x55 / 255f, 0x66 / 255f, 1f),
|
||||
button.BorderColor);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_RuntimeTooltipUsesRetailPopupLocatorAndLiveBinding()
|
||||
{
|
||||
const string xml =
|
||||
"<panel x=\"0\" y=\"0\" w=\"100\" h=\"60\">" +
|
||||
"<button x=\"0\" y=\"0\" w=\"50\" h=\"20\" text=\"Go\" " +
|
||||
"tooltip=\"{Status}\"/>" +
|
||||
"</panel>";
|
||||
var binding = new ButtonBinding();
|
||||
UiNineSlicePanel panel = MarkupDocument.Build(
|
||||
xml, binding, _ => ((uint)1, 32, 32));
|
||||
var button = Assert.IsType<UiSimpleButton>(panel.Children[0]);
|
||||
|
||||
Assert.Equal("idle", button.GetTooltipText());
|
||||
Assert.True(button.AuthoredTooltipEnabled);
|
||||
Assert.Equal(0x10000397u, button.AuthoredTooltipRootElementId);
|
||||
Assert.Equal(0x21000041u, button.AuthoredTooltipLayoutDid);
|
||||
|
||||
binding.Status = "casting";
|
||||
Assert.Equal("casting", button.GetTooltipText());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_NestedGroupTabToggleAndSliderStayLiveAndInteractive()
|
||||
{
|
||||
const string xml =
|
||||
"<panel x=\"0\" y=\"0\" w=\"300\" h=\"180\">" +
|
||||
"<tab x=\"4\" y=\"4\" w=\"60\" h=\"18\" text=\"Options\" " +
|
||||
"selected=\"{OptionsSelected}\" onclick=\"{ShowOptions}\"/>" +
|
||||
"<group x=\"4\" y=\"28\" w=\"280\" h=\"140\" visible=\"{OptionsVisible}\">" +
|
||||
"<toggle x=\"2\" y=\"2\" w=\"140\" h=\"20\" text=\"Enable Combat\" " +
|
||||
"checked=\"{CombatEnabled}\" onclick=\"{ToggleCombat}\"/>" +
|
||||
"<slider x=\"2\" y=\"30\" w=\"140\" h=\"16\" value=\"{AttackPower}\" " +
|
||||
"onchange=\"{SetAttackPower}\"/>" +
|
||||
"</group></panel>";
|
||||
var binding = new ButtonBinding();
|
||||
|
||||
UiNineSlicePanel panel = MarkupDocument.Build(
|
||||
xml,
|
||||
binding,
|
||||
_ => ((uint)1, 16, 16));
|
||||
|
||||
var tab = Assert.IsType<UiMarkupTabButton>(panel.Children[0]);
|
||||
var group = Assert.IsType<UiPanel>(panel.Children[1]);
|
||||
var toggle = Assert.IsType<UiMarkupToggle>(group.Children[0]);
|
||||
var slider = Assert.IsType<UiScrollbar>(group.Children[1]);
|
||||
Assert.True(tab.IsSelected);
|
||||
Assert.True(group.VisibleSource!());
|
||||
Assert.False(toggle.IsChecked);
|
||||
|
||||
toggle.OnEvent(new UiEvent { Type = UiEventType.Click });
|
||||
Assert.True(binding.CombatEnabled);
|
||||
Assert.True(toggle.IsChecked);
|
||||
|
||||
slider.ScalarChanged!(0.78f);
|
||||
Assert.Equal(0.78f, binding.AttackPower);
|
||||
Assert.Equal(0.78f, slider.ScalarPositionSource!());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue