The user tested Campaign CH's CODE-COMPLETE build live and reported ten defects (docs/plans/2026-08-09-chat-parity-campaign.md, "User gate — round 1"). Items A-G are fixed here; the remaining three (extra chat windows on 1/2/3/4, resize working in only one corner, transparency/ artifacts) are out of scope for a fix and filed as slice CH6. A. Jump-in-air refusal never fired live: the jump block only ever evaluated input.Jump inside the grounded-charge or already-charging branches. PlayerMovementController now detects the press RISING EDGE while airborne and reports WeenieError.NotGrounded once per press, leaving the grounded charge/fire path untouched. B. ChatVM's invented "[System] " prefix is dropped — retail prints system text bare. [Popup] is unchanged (AP-175). C. SpewBoxController's color is now the user-pinned exact value (1, 1, 0.247, 1), the same bright yellow as an incoming Tell. Register row AP-178 updated: color CLOSES, size/position/font stay open per the user's live report that they still differ. D. Closes #329: PortalTunnelPresentation now emits the portal wait cue unconditionally on every rotation-segment boundary, matching gmSmartBoxUI::UseTime's decompiled else-arm exactly instead of gating on a 5-second hold local transits never reached. PortalWaitNotice Controller now renders it in the same pinned yellow as item C. Register row AP-150 retired. E. Closes #362: new ClientCommandResponses.cs parses and renders the four previously-unhandled inbound GameEvents (ChannelIndex, ChannelList, AvailableHouses, AllegianceInfoResponse), each ported line-for-line from the named-retail decomp's inbound handlers. Register row TS-70 retired. F. ChatWindowController.WrapText now splits on embedded '\n'/'\r\n' first, then word-wraps each segment independently — server text like /help's reply no longer collapses onto one line. G. The chat input field's right edge no longer holds a fixed absolute pixel position across a window resize; Bind now upgrades it to retail edge-mode 1 (UiLayoutPolicy) or the AnchorEdges.Right stretch fallback so it tracks the window's client width instead of overflowing past a narrower resize. Full Release suite: 12,247 passed / 4 skipped / 0 failed (baseline 12,221/4/0 + 26 new tests across items A, E, F, G). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.5 KiB
C#
45 lines
1.5 KiB
C#
using System.Numerics;
|
|
using AcDream.App.UI;
|
|
|
|
namespace AcDream.App.Tests.UI;
|
|
|
|
public sealed class PortalWaitNoticeControllerTests
|
|
{
|
|
// Campaign CH user-gate round 1 (item D): the user confirmed live,
|
|
// side-by-side against retail, that this notice renders in the same
|
|
// bright yellow as an incoming Tell (RetailChatColorTable.Yellow).
|
|
private static readonly Vector4 RetailWaitCueColor = new(1f, 1f, 0.247f, 1f);
|
|
|
|
[Fact]
|
|
public void Notice_IsCenteredOverlayAndDisposesFromRetainedRoot()
|
|
{
|
|
var root = new UiRoot
|
|
{
|
|
Width = 1280f,
|
|
Height = 720f,
|
|
};
|
|
|
|
using (var controller = new PortalWaitNoticeController(root))
|
|
{
|
|
UiText text = Assert.IsType<UiText>(Assert.Single(root.Children));
|
|
Assert.False(text.Visible);
|
|
Assert.True(text.Centered);
|
|
Assert.True(text.ClickThrough);
|
|
Assert.Equal(root.Width, text.Width);
|
|
Assert.Equal(root.Height, text.Height);
|
|
Assert.Equal(RetailWaitCueColor, text.DefaultColor);
|
|
|
|
controller.Set("In Portal Space - Please Wait...");
|
|
|
|
Assert.True(text.Visible);
|
|
UiText.Line line = Assert.Single(text.LinesProvider!());
|
|
Assert.Equal("In Portal Space - Please Wait...", line.Text);
|
|
Assert.Equal(RetailWaitCueColor, line.Color);
|
|
|
|
controller.Set(null);
|
|
Assert.False(text.Visible);
|
|
}
|
|
|
|
Assert.Empty(root.Children);
|
|
}
|
|
}
|