acdream/tests
Erik 5318adbb30 fix(vtank): slice 7 round D item 3 — VTank's full 26-recall table
Owner live report 2026-09-07: "Under Route, Add recall is missing a
lot of recalls that VTank has and they do not work in routes yet."
RouteRecallKind's old 4-entry model (Lifestone/Marketplace/
PrimaryPortal/SecondaryPortal) is replaced with VTank's real
cmbRecallType table: 26 castable recall spells from metaf's own
NRecall table (metaf_monolithic.py:10981-11008) plus Marketplace
Recall, VTank's one entry with no spell (issued as /marketplace).

Deviation (no refs/vtank/ checkout in this worktree to confirm VTank's
real combo layout directly): the old Lifestone member, which issued
"/lifestone" as a slash command, is DROPPED rather than kept alongside
the new spell-based LifestoneRecall (1635) — VTank's real combo has
ONE "Lifestone Recall" entry and it is a real castable spell, so
keeping both would show two menu rows reading "Lifestone Recall" with
different behavior. Marketplace is the one member kept as a slash
command per the explicit "keep ours" instruction. PrimaryPortal/
SecondaryPortal are renamed to PrimaryPortalRecall/SecondaryPortalRecall
and now use their real spell ids (48, 2647) instead of the old runtime
KnownSelfBuffs name lookup. This reshuffles the enum's underlying
ordinals; the one place that mattered (MossTankRouteProfileStore's
legacy pre-cutover JSON migration DTO, which stores Recall as a raw
int) already guards with Enum.IsDefined and is documented as a
migration-only path for not-yet-migrated files — its fallback default
moved from the deleted Lifestone to PrimaryPortalRecall.

Changes:
- RouteRecallKind: 26 named members in VTank's own combo order (values
  are plain sequential indices, not spell ids, so Enum.GetNames/
  GetValues — which sort by underlying VALUE — reproduce that order)
  plus Marketplace appended last.
- RouteWaypoint.RecallDisplayName: VTank's exact label text per kind.
- RouteWaypoint.SpellIdForRecall (new): the real spell id per kind
  (Marketplace = 0, the existing "no spell" sentinel).
- NavigationController.SubmitRecall: unchanged fast path (RecallSpellId
  != 0 -> cast) now covers every recall added through the UI; the
  fallback for a waypoint with no recorded id resolves through
  SpellIdForRecall instead of the old runtime spell-name lookup, and
  Marketplace still falls through to "/marketplace".
- MossTankPanel.AddRouteRecallCore: populates RecallSpellId AND
  RecallSpellName on the new waypoint (matching what a metaf import or
  the binary .nav loader already produces), so a waypoint added from
  the Route tab's own combo executes identically to one round-tripped
  through a real route file.
- mosstank.xml: the recall <menu> comment updated; rows 4->7 now that
  scrolling through 27 entries is real, not grammar-only.

Tests added (NavigationTests.cs, MetafSerializerTests.cs):
- RouteRecallKindListsVTanksTwentySixRecallsInOrderPlusMarketplaceLast
  (the 26-entry order via Enum.GetNames).
- RecallNameAndSpellIdTablesAgree (27-case Theory: name<->id both ways;
  RouteRecallKind is internal so the Theory parameter is the public int
  ordinal, cast back inside the method — a public method cannot expose
  an internal-typed parameter, CS0051).
- RecallWaypointWithNonZeroSpellIdCastsThatSpell /
  RecallWaypointForMarketplaceSubmitsTheSlashCommandNotACast (execution,
  via a new FakeMagic tracking fake — FakeAutomation.Magic is now
  settable instead of always NoOpAutomationSurface).
- RecallNodeRoundTripsByNameAndResolvesTheRealSpellIdFromTheCatalog
  (three recalls through SaveNav/TryLoadNav with a new FakeSpellCatalog
  that actually knows the spells, proving both the name AND the
  resolved id survive the .af round trip).

Mutations shown to fail, then reverted: swapping the first two enum
members failed the order test; reducing SubmitRecall to `return false`
failed both execution tests (no cast recorded, "/marketplace" not
submitted).

Verified: dotnet build AcDream.slnx -c Release green; MossTank suite
713/713 (682 -> 713, 31 new tests); App markup/plugin filter 242/242
(unchanged).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 16:54:37 +02:00
..
AcDream.App.Tests merge(vt): bring in retail scrollbar chrome + resizable/anchor markup 2026-09-07 16:01:51 +02:00
AcDream.Bake.Tests Optimize prepared asset package v2 2026-08-27 20:09:09 +02:00
AcDream.Cli.Tests build: make release restore reproducible 2026-08-18 10:29:00 +02:00
AcDream.Content.Tests fix(rendering): carry retail SetSurface state to detail draws 2026-09-05 02:03:13 +02:00
AcDream.Core.Net.Tests fix: complete retail parity stability pass 2026-08-28 20:01:39 +02:00
AcDream.Core.Tests fix(vt): F host-composed VtankProfiles storage replaces raw path string 2026-09-06 23:03:04 +02:00
AcDream.Core.Tests.Fixtures.HelloPlugin feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Headless.Tests test(headless): the console's unknown-verb pin follows AD-124 — chat scroll, not SpewBox 2026-09-07 08:27:39 +02:00
AcDream.Launcher.Core.Tests fix(rendering): carry retail SetSurface state to detail draws 2026-09-05 02:03:13 +02:00
AcDream.Launcher.Core.Tests.Fixtures.ConsolelessSupervisorParent build: make release restore reproducible 2026-08-18 10:29:00 +02:00
AcDream.Launcher.Core.Tests.Fixtures.ConsoleSignalChild build: make release restore reproducible 2026-08-18 10:29:00 +02:00
AcDream.Launcher.Core.Tests.Fixtures.InstallLeaseHolder feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Launcher.Tests Optimize prepared asset package v2 2026-08-27 20:09:09 +02:00
AcDream.Platform.Tests feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Plugin.Tests.Fixtures.HostPlugin feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Plugin.Tests.Fixtures.InvalidRenderPackInternal feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Plugin.Tests.Fixtures.InvalidRenderPackMultiple feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Plugins.MossTank.Tests fix(vtank): slice 7 round D item 3 — VTank's full 26-recall table 2026-09-07 16:54:37 +02:00
AcDream.RenderPackValidator.Tests feat(render): shader ABI v2 - AtmosphericFrame gains clock/wind blocks; caster pass binds it (Campaign VM VM6a) 2026-08-23 00:30:02 +02:00
AcDream.Runtime.Tests fix #363/#367: route unknown-command refusals to chat, not SpewBox 2026-09-07 08:22:06 +02:00
AcDream.UI.Abstractions.Tests fix #363: route plugin system text to the chat window, not SpewBox 2026-09-07 08:22:22 +02:00
Fixtures/campaign-la feat(plugins): enforce apiVersion; launcher plugins default ON with "none" opt-out 2026-08-20 21:28:04 +02:00
Directory.Build.props fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
TestCultureInitializer.cs fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00