using AcDream.Core.Chat; namespace AcDream.Core.Tests.Chat; /// /// Tests for . The retail client showed /// these as plain-language strings; we mirror that via templated lookup. /// Filed after the 2026-04-25 live launch where the user saw cryptic /// "WeenieError 0x051B" in chat for what was actually a friendly login /// notification. /// public sealed class WeenieErrorMessagesTests { // ── known codes — informational, parameterised ─────────────────── [Fact] public void Format_YouHaveEnteredChannel_SubstitutesParam() { // 0x051B = WeenieErrorWithString.YouHaveEnteredThe_Channel. // Template "You have entered the _ channel." with `_` placeholder. Assert.Equal( "You have entered the General channel.", WeenieErrorMessages.Format(0x051B, "General")); } [Fact] public void Format_YouHaveEnteredChannel_WorksForEachChannelName() { Assert.Equal("You have entered the Trade channel.", WeenieErrorMessages.Format(0x051B, "Trade")); Assert.Equal("You have entered the LFG channel.", WeenieErrorMessages.Format(0x051B, "LFG")); Assert.Equal("You have entered the Roleplay channel.",WeenieErrorMessages.Format(0x051B, "Roleplay")); } [Fact] public void Format_YouHaveLeftChannel_SubstitutesParam() { Assert.Equal( "You have left the General channel.", WeenieErrorMessages.Format(0x051C, "General")); } // ── known codes — informational, no parameter ──────────────────── [Fact] public void Format_TurbineChatIsEnabled_NoParamForm() { // 0x051D came in WeenieError (no param) form at login. Assert.Equal( "Turbine Chat is enabled.", WeenieErrorMessages.Format(0x051D, param: null)); } // ── known codes — error-level ──────────────────────────────────── [Fact] public void Format_CharacterNotAvailable_NoParam() { // 0x052B fired by the server when a Tell target lookup fails // (e.g. the user typed "/t je, hello" → server got "je," → no // character). Should read like the retail message. Assert.Equal( "That person is not available now.", WeenieErrorMessages.Format(0x052B, param: null)); } [Fact] public void Format_TradeComplete() { Assert.Equal("Trade Complete!", WeenieErrorMessages.Format(0x0529, null)); } [Fact] public void Format_ThatIsNotAValidCommand() { // 0x0026 fires on /-prefixed text that ACE's command parser // can't resolve. Filed after a 2026-04-25 trace where /help // produced cryptic "WeenieError 0x0026" lines. Assert.Equal( "That is not a valid command.", WeenieErrorMessages.Format(0x0026, null)); } [Fact] public void Format_YouAreNotInAllegiance() { Assert.Equal( "You are not in an allegiance!", WeenieErrorMessages.Format(0x0414, null)); } [Fact] public void Format_YouDoNotBelongToAFellowship() { Assert.Equal( "You do not belong to a Fellowship.", WeenieErrorMessages.Format(0x050F, null)); } // ── unknown codes — graceful fallback preserves debug info ─────── [Fact] public void Format_UnknownCode_NoParam_FallsBackToHexForm() { Assert.Equal("WeenieError 0xABCD", WeenieErrorMessages.Format(0xABCD, null)); } [Fact] public void Format_UnknownCode_WithParam_FallsBackToColonForm() { Assert.Equal( "WeenieError 0xDEAD: Mana Stone", WeenieErrorMessages.Format(0xDEAD, "Mana Stone")); } [Fact] public void Format_UnknownCode_EmptyParam_StaysAsHexOnly() { // Empty string param shouldn't add a stray colon. Assert.Equal("WeenieError 0xCAFE", WeenieErrorMessages.Format(0xCAFE, "")); } // ── parameterised templates with non-trivial params ────────────── [Fact] public void Format_HearListAdded_SubstitutesParam() { Assert.Equal( "Caith has been added to the list of people you can hear.", WeenieErrorMessages.Format(0x0521, "Caith")); } [Fact] public void Format_FailToAffectCannotBeHarmed_SubstitutesParam() { Assert.Equal( "You fail to affect Drudge because they cannot be harmed!", WeenieErrorMessages.Format(0x004F, "Drudge")); } }