feat(studio): port character skills tab
This commit is contained in:
parent
4cc565badc
commit
e7e943a580
4 changed files with 634 additions and 45 deletions
|
|
@ -623,6 +623,125 @@ public class CharacterStatControllerTests
|
|||
|
||||
// ── Affordability helpers (GetRaiseCost) ──────────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void SkillsTab_Click_RebuildsListWithRetailBucketsAndRows()
|
||||
{
|
||||
var list = new UiPanel { Width = 300 };
|
||||
var layout = Fake((CharacterStatController.ListBoxId, list));
|
||||
|
||||
CharacterStatController.Bind(layout, SampleData.SampleCharacter,
|
||||
spriteResolve: id => (id, 16, 16));
|
||||
|
||||
ClickTab(layout, left: 92f);
|
||||
|
||||
var headers = list.Children
|
||||
.Where(c => c is UiPanel and not UiClickablePanel)
|
||||
.Select(c => c.Children.OfType<UiText>().First().LinesProvider()[0].Text)
|
||||
.ToList();
|
||||
Assert.Equal(new[]
|
||||
{
|
||||
"Specialized Skills",
|
||||
"Trained Skills",
|
||||
"Useable Untrained Skills",
|
||||
"Unuseable Untrained Skills",
|
||||
}, headers);
|
||||
|
||||
var rows = list.Children.OfType<UiClickablePanel>().ToList();
|
||||
Assert.Equal(12, rows.Count);
|
||||
var rowNames = rows
|
||||
.Select(r => r.Children.OfType<UiText>().ToList()[1].LinesProvider()[0].Text)
|
||||
.ToList();
|
||||
Assert.Equal(new[]
|
||||
{
|
||||
"Melee Defense", "War Magic",
|
||||
"Arcane Lore", "Life Magic", "Missile Weapons",
|
||||
"Healing", "Jump", "Loyalty", "Run",
|
||||
"Alchemy", "Cooking", "Fletching",
|
||||
}, rowNames);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SkillsTab_ClickThenAttributesTab_RestoresAttributeRows()
|
||||
{
|
||||
var list = new UiPanel { Width = 300 };
|
||||
var layout = Fake((CharacterStatController.ListBoxId, list));
|
||||
|
||||
CharacterStatController.Bind(layout, SampleData.SampleCharacter,
|
||||
spriteResolve: id => (id, 16, 16));
|
||||
|
||||
ClickTab(layout, left: 92f);
|
||||
Assert.Equal(12, list.Children.OfType<UiClickablePanel>().Count());
|
||||
|
||||
ClickTab(layout, left: 0f);
|
||||
var rows = list.Children.OfType<UiClickablePanel>().ToList();
|
||||
Assert.Equal(9, rows.Count);
|
||||
Assert.Equal("Strength", rows[0].Children.OfType<UiText>().ToList()[1].LinesProvider()[0].Text);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SkillsTab_SelectWarMagic_ShowsTrainedSkillFooter()
|
||||
{
|
||||
var list = new UiPanel { Width = 300 };
|
||||
var title = new UiText();
|
||||
var l1Label = new UiText();
|
||||
var l1Value = new UiText();
|
||||
var l2Label = new UiText();
|
||||
var l2Value = new UiText();
|
||||
var layout = Fake(
|
||||
(CharacterStatController.ListBoxId, list),
|
||||
(CharacterStatController.FooterTitleId, title),
|
||||
(CharacterStatController.FooterLine1Label, l1Label),
|
||||
(CharacterStatController.FooterLine1Value, l1Value),
|
||||
(CharacterStatController.FooterLine2Label, l2Label),
|
||||
(CharacterStatController.FooterLine2Value, l2Value));
|
||||
|
||||
CharacterStatController.Bind(layout, SampleData.SampleCharacter,
|
||||
spriteResolve: id => (id, 16, 16));
|
||||
|
||||
ClickTab(layout, left: 92f);
|
||||
list.Children.OfType<UiClickablePanel>().ToList()[1].OnClick!();
|
||||
|
||||
Assert.Equal("War Magic: 285", title.LinesProvider()[0].Text);
|
||||
Assert.Equal("Experience To Raise:", l1Label.LinesProvider()[0].Text);
|
||||
Assert.Equal((11_100_000L).ToString("N0"), l1Value.LinesProvider()[0].Text);
|
||||
Assert.Equal("Unassigned Experience:", l2Label.LinesProvider()[0].Text);
|
||||
Assert.Equal((87_757_321_741L).ToString("N0"), l2Value.LinesProvider()[0].Text);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SkillsTab_SelectHealing_ShowsUntrainedSkillFooter()
|
||||
{
|
||||
var list = new UiPanel { Width = 300 };
|
||||
var title = new UiText();
|
||||
var l1Label = new UiText();
|
||||
var l1Value = new UiText();
|
||||
var l2Label = new UiText();
|
||||
var l2Value = new UiText();
|
||||
var btn1 = MakeButton();
|
||||
var layout = Fake(
|
||||
(CharacterStatController.ListBoxId, list),
|
||||
(CharacterStatController.FooterTitleId, title),
|
||||
(CharacterStatController.FooterLine1Label, l1Label),
|
||||
(CharacterStatController.FooterLine1Value, l1Value),
|
||||
(CharacterStatController.FooterLine2Label, l2Label),
|
||||
(CharacterStatController.FooterLine2Value, l2Value),
|
||||
(CharacterStatController.RaiseOneId, btn1));
|
||||
|
||||
CharacterStatController.Bind(layout, SampleData.SampleCharacter,
|
||||
spriteResolve: id => (id, 16, 16));
|
||||
|
||||
ClickTab(layout, left: 92f);
|
||||
list.Children.OfType<UiClickablePanel>().ToList()[5].OnClick!();
|
||||
|
||||
Assert.Equal("Healing", title.LinesProvider()[0].Text);
|
||||
Assert.Equal("Skill Credits To Raise:", l1Label.LinesProvider()[0].Text);
|
||||
Assert.Equal("6", l1Value.LinesProvider()[0].Text);
|
||||
Assert.Equal("Skill Credits Available:", l2Label.LinesProvider()[0].Text);
|
||||
Assert.Equal("96", l2Value.LinesProvider()[0].Text);
|
||||
Assert.True(btn1.Visible);
|
||||
Assert.Equal("Normal", btn1.ActiveState);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetRaiseCost_Index4Focus_Returns110()
|
||||
{
|
||||
|
|
@ -899,6 +1018,15 @@ public class CharacterStatControllerTests
|
|||
|
||||
// ── Helpers ──────────────────────────────────────────────────────────────
|
||||
|
||||
private static void ClickTab(ImportedLayout layout, float left)
|
||||
{
|
||||
var tab = layout.Root.Children.OfType<UiClickablePanel>()
|
||||
.Single(p => System.Math.Abs(p.Left - left) < 0.5f
|
||||
&& System.Math.Abs(p.Top) < 0.5f
|
||||
&& System.Math.Abs(p.Height - 25f) < 0.5f);
|
||||
tab.OnClick!();
|
||||
}
|
||||
|
||||
/// <summary>Manufacture a minimal UiButton with a fake ElementInfo (no dat sprites).</summary>
|
||||
private static UiButton MakeButton()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue