feat(chargen): Campaign CC slice CC7 — end-to-end create flow + connected checklist
Create button un-ghosts: retail's exact gate (gmCharacterManagementUI:: UpdateButtons @0x004ec240, roster count < allowed slot count) ported into RuntimeCharacterSelectionButtons.CanCreate; the button's OnClick opens the chargen screen through the same CharacterCreationUiController.Open() seam the ACDREAM_OPEN_CHARGEN=1 dev path already used. Exit/Back confirm on chargen needed no new return-path code — character-management is never hidden while chargen is open on top of it — verified end-to-end by a new cross-controller test rather than left as an inspection claim. Full-flow test coverage: a new comprehensive test decodes every 0xF656 field (including the trailing checksum, recomputed via the production CharacterCreate.ComputeChecksum) against a fully populated creation (heritage/gender/all appearance slots/template/explicit skill command/ town/name); a new Theory drives the remaining six 0xF643 rejection codes through the real wire decode path, closing the gap between the already-covered isolated state-machine Theory and an actual WorldSession round trip. Launcher payload cycle: two new tests drive a real Runtime create/reject through the real SessionStatusWriter (wired exactly as LiveSessionRuntimeFactory/HeadlessSessionHost do in production) and read the result back with the real Launcher.Core StatusFileTailer/ StatusEventParser — closing the one gap CC2's own per-layer tests never reached. No gap was found in production wiring itself: GameWindow already constructs a real, non-null SessionStatusWriter for both hosts. Also fixes 4 pre-existing LiveSessionControllerTests assertions that compared a full RuntimeCharacterSelectionButtons record and would have failed once CanCreate started being computed; corrects register row AP-211 to reflect that its own predicted resolution (the Create-button gate landing) has now happened — both layers are intentionally kept as retail-matching enforcement plus defense-in-depth, not one superseding the other. Adds docs/research/2026-08-16-campaign-cc-test-script.md, the user's connected-gate script covering both the launcher and dev-shortcut launch paths, the six-page create flow, every Finish outcome, and the known cosmetic/behavioral divergences (AP-212/213/215/216/217/218/219/220/222/ 224/226/228) so they aren't mistaken for new bugs during the gate. Gates: full solution Release build green; Runtime 1735/0 (was 1726/0, +9), App 5256/3 skips (was 5254/3, +2), Headless 166/0 (unchanged), Launcher.Core 324/0, one full-solution pass across every project clean (no known flakes reproduced this run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
bb22ee8bde
commit
9cf6c52283
10 changed files with 957 additions and 37 deletions
|
|
@ -588,8 +588,14 @@ public sealed class LiveSessionControllerTests
|
|||
Assert.Equal(
|
||||
RuntimeCharacterSelectionOperation.DeleteRequested,
|
||||
controller.CharacterSelection.Snapshot.Operation);
|
||||
// Campaign CC slice CC7: this fixture's roster (2 characters) is
|
||||
// below its SlotCount (11), so retail's Create gate
|
||||
// (gmCharacterManagementUI::UpdateButtons) stays enabled through
|
||||
// the whole delete-request/acknowledge sequence below — CanCreate
|
||||
// is independent of the delete-in-flight buttons this test is
|
||||
// actually pinning.
|
||||
Assert.Equal(
|
||||
RuntimeCharacterSelectionButtons.None,
|
||||
RuntimeCharacterSelectionButtons.None with { CanCreate = true },
|
||||
controller.CharacterSelection.Snapshot.Buttons);
|
||||
|
||||
if (acknowledgeBeforeCompletion)
|
||||
|
|
@ -607,8 +613,10 @@ public sealed class LiveSessionControllerTests
|
|||
? RuntimeCharacterSelectionOperation.DeleteAcknowledged
|
||||
: RuntimeCharacterSelectionOperation.DeleteRequested,
|
||||
controller.CharacterSelection.Snapshot.Operation);
|
||||
// CC7: same roster(2)-below-SlotCount(11) note as above — CanCreate
|
||||
// stays true independent of the delete-in-flight buttons.
|
||||
Assert.Equal(
|
||||
RuntimeCharacterSelectionButtons.None,
|
||||
RuntimeCharacterSelectionButtons.None with { CanCreate = true },
|
||||
controller.CharacterSelection.Snapshot.Buttons);
|
||||
Assert.True(controller.CharacterSelection.TryGet(
|
||||
0x50000001u,
|
||||
|
|
@ -625,8 +633,10 @@ public sealed class LiveSessionControllerTests
|
|||
Assert.Equal(
|
||||
RuntimeCharacterSelectionOperation.DeleteAcknowledged,
|
||||
controller.CharacterSelection.Snapshot.Operation);
|
||||
// CC7: same roster(2)-below-SlotCount(11) note as above — CanCreate
|
||||
// stays true independent of the delete-in-flight buttons.
|
||||
Assert.Equal(
|
||||
RuntimeCharacterSelectionButtons.None,
|
||||
RuntimeCharacterSelectionButtons.None with { CanCreate = true },
|
||||
controller.CharacterSelection.Snapshot.Buttons);
|
||||
Assert.Equal([("Canonical", 1)], operations.DeleteRequests);
|
||||
}
|
||||
|
|
@ -665,8 +675,10 @@ public sealed class LiveSessionControllerTests
|
|||
? RuntimeCharacterSelectionOperation.DeleteAcknowledged
|
||||
: RuntimeCharacterSelectionOperation.DeleteRequested,
|
||||
controller.CharacterSelection.Snapshot.Operation);
|
||||
// CC7: same roster(2)-below-SlotCount(11) note as above — CanCreate
|
||||
// stays true independent of the delete-in-flight buttons.
|
||||
Assert.Equal(
|
||||
RuntimeCharacterSelectionButtons.None,
|
||||
RuntimeCharacterSelectionButtons.None with { CanCreate = true },
|
||||
controller.CharacterSelection.Snapshot.Buttons);
|
||||
Assert.Equal(
|
||||
RuntimeCommandStatus.Rejected,
|
||||
|
|
@ -679,8 +691,10 @@ public sealed class LiveSessionControllerTests
|
|||
Assert.Equal(
|
||||
RuntimeCharacterSelectionOperation.DeleteAcknowledged,
|
||||
controller.CharacterSelection.Snapshot.Operation);
|
||||
// CC7: same roster(2)-below-SlotCount(11) note as above — CanCreate
|
||||
// stays true independent of the delete-in-flight buttons.
|
||||
Assert.Equal(
|
||||
RuntimeCharacterSelectionButtons.None,
|
||||
RuntimeCharacterSelectionButtons.None with { CanCreate = true },
|
||||
controller.CharacterSelection.Snapshot.Buttons);
|
||||
Assert.Equal([("Canonical", 1)], operations.DeleteRequests);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue