using WxAgent.Core; using Xunit; namespace WxAgent.Core.Tests; public sealed class WechatTextInputSegmentationTests { [Fact] public void SplitForSendSplitsLongTextAtTheSingleMessageBoundary() { var text = new string('x', WechatTextInput.MaxSegmentLength + 1); var segments = WechatTextInput.SplitForSend(text); Assert.Equal(2, segments.Count); Assert.Equal(WechatTextInput.MaxSegmentLength, segments[0].Length); Assert.Equal(1, segments[1].Length); Assert.Equal(text, string.Concat(segments)); Assert.Throws(() => WechatTextInput.Prepare(text)); } [Fact] public void SplitForSendDoesNotBreakACombiningTextElement() { var prefix = new string('x', WechatTextInput.MaxSegmentLength - 1); var combiningElement = "e\u0301"; var text = prefix + combiningElement + "tail"; var segments = WechatTextInput.SplitForSend(text); Assert.Equal(2, segments.Count); Assert.Equal(prefix, segments[0]); Assert.StartsWith(combiningElement, segments[1], StringComparison.Ordinal); Assert.All(segments, segment => Assert.InRange(segment.Length, 1, WechatTextInput.MaxSegmentLength)); Assert.Equal(text, string.Concat(segments)); } [Fact] public void SplitForSendRejectsTextBeyondTheBoundedTotalLength() { var text = new string('x', WechatTextInput.MaxTextLength + 1); var exception = Assert.Throws(() => WechatTextInput.SplitForSend(text)); Assert.Equal(WxAgentErrorCode.InvalidArgument, exception.Code); } }