fix(chat): CH4 review fixes — allegiance ownership guard, house-abandon confirmation
Blocker 1: an unrecognized "@allegiance <sub>" subcommand escaped TryMatchAllegiance (which only claimed "info"/"hometown") and fell through the unregistered-tag channel fallback, broadcasting the raw subcommand text to the Allegiance chat channel (0x02000000). Retail's own DoAllegiance never reaches DoChannelCommand for an unrecognized subcommand — it claims the whole verb and prints its own client-local refusal. TryMatchAllegiance now claims "allegiance"/"all" unconditionally and shows retail's "Please see @help Allegiance..." text; ChatCommandRouter also gained a blanket RetailClientCommandCatalog.KnownVerbs ownership guard in TryDispatchChannelFallback as defense in depth. Blocker 2: "@house abandon" sent 0x021F immediately with no confirmation. Retail runs a real two-stage dialog before Event_AbandonHouse(); ported both verbatim strings and chained two ShowConfirmation calls. Should-fixes: a bare unregistered tag with no text now passes through silently instead of showing a refusal that belongs to a different retail function; @join/@leave update RuntimeCharacterOptionsState locally (new SetOptionBit) before the wire push so the Turbine membership gate stops refusing a just-joined room; @permit accepts multi-word names; @clist/ @on/@off validate shape only and raise WeenieError 0x422 for an unknown tag; @mr/@pr help text is now the verbatim retail strings; corrected issue #360, register row TS-68, the campaign doc's B.7 note, and a stale RetailChannelTagTable comment; filed issue #363 + register row AP-183 for the deferred error-typing debt. Nits: fixed TryMatchHouse's stale doc comment, the AP-182/@title "stores the value" comments (the binding is a no-op), IsUnregisteredFallbackTag's olthoi false-positive, added /g and /rp binding-level conformance pins, made @index ignore extra arguments, and noted the six removed invented verbs in ISSUES.md. Suite: 12,216 passed / 4 skipped / 0 failed (Release), up from CH4's 12,190/4/0 — net +26 tests, no removals. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
090825e703
commit
724ef2d389
17 changed files with 853 additions and 85 deletions
|
|
@ -1,3 +1,4 @@
|
|||
using AcDream.UI.Abstractions;
|
||||
using AcDream.UI.Abstractions.Panels.Chat;
|
||||
|
||||
namespace AcDream.UI.Abstractions.Tests.Panels.Chat;
|
||||
|
|
@ -266,4 +267,34 @@ public sealed class RetailCommandRegistryConformanceTests
|
|||
"test's registry, or it's an invented alias that must be deleted.");
|
||||
}
|
||||
}
|
||||
|
||||
// ── CH4 REJECT-review nit 13 (2026-08-09) ───────────────────────────
|
||||
//
|
||||
// The tests above only prove a verb STRING is recognized somewhere —
|
||||
// not which channel it actually resolves to. A rebind regression (e.g.
|
||||
// "/g" quietly reverting to General, the exact Tier-1 #1 bug this
|
||||
// campaign fixed) would still pass every case above. These two pin the
|
||||
// real dispatch outcome so a rebind regression fails THIS suite, not
|
||||
// just a narrower parser-only test.
|
||||
|
||||
[Fact]
|
||||
public void GVerb_BindsToFellowship_NotGeneral()
|
||||
{
|
||||
ChatInputParser.ParsedInput? parsed = ChatInputParser.Parse(
|
||||
"/g hi gang", ChatChannelKind.Say, lastTellSender: null);
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.Equal(ChatChannelKind.Fellowship, parsed!.Value.Channel);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RpVerb_BindsToReply_NotRoleplay()
|
||||
{
|
||||
ChatInputParser.ParsedInput? parsed = ChatInputParser.Parse(
|
||||
"/rp hello back", ChatChannelKind.Say, lastTellSender: "Aunt Agatha");
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.Equal(ChatChannelKind.Tell, parsed!.Value.Channel);
|
||||
Assert.Equal("Aunt Agatha", parsed!.Value.TargetName);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue