using System; using System.Reflection; using NUnit.Framework; using TMPro; using UnityEditor; using UnityEngine; using XGame; using XWorld.Framework.Protocol; public sealed class WorldChatModuleTests { private GameObject view; private GameObject host; [TearDown] public void TearDown() { if (view != null) { UnityEngine.Object.DestroyImmediate(view); } if (host != null) { UnityEngine.Object.DestroyImmediate(host); } } [Test] public void EndEditingInput_SubmitsTrimmedWorldChat() { WorldChatModule module = CreateBoundModule(); TMP_InputField input = view.transform.FindTransform("InputHitArea").GetComponent(); string sent = null; module.OnSendWorldChat = text => sent = text; input.text = " hello world "; input.onEndEdit.Invoke(input.text); Assert.That(sent, Is.EqualTo("hello world")); Assert.That(input.text, Is.Empty); } [Test] public void ReceivedMessage_UpdatesCollapsedPreview() { WorldChatModule module = CreateBoundModule(); TMP_Text collapsedText = view.transform.FindTransform("Txt_CollapsedPlaceholder").GetComponent(); module.HandleWorldChatMessage(new WorldChatMessageMsg { PlayerId = 2, PlayerName = "Bob", Text = "hello world" }); Assert.That(collapsedText.text, Is.EqualTo("Bob: hello world")); } private WorldChatModule CreateBoundModule() { GameObject prefab = AssetDatabase.LoadAssetAtPath("Assets/Game/Art/UI/Prefab/UI_CommonChat.prefab"); Assert.That(prefab, Is.Not.Null); view = UnityEngine.Object.Instantiate(prefab); host = new GameObject("WorldChatModuleTestHost"); WorldChatModule module = host.AddComponent(); module.Initialize(1, _ => { }); SetPrivateField(module, "view", view); InvokePrivate(module, "CacheControls"); InvokePrivate(module, "BindEvents"); return module; } private static void SetPrivateField(object target, string name, object value) { FieldInfo field = target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); Assert.That(field, Is.Not.Null); field.SetValue(target, value); } private static void InvokePrivate(object target, string name) { MethodInfo method = target.GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic); Assert.That(method, Is.Not.Null); method.Invoke(target, Array.Empty()); } }