80 lines
3.0 KiB
C#
80 lines
3.0 KiB
C#
using System.Collections;
|
||
using NUnit.Framework;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using UnityEngine.TestTools;
|
||
using TMPro;
|
||
using BaseGames.UI;
|
||
|
||
namespace BaseGames.Tests.PlayMode
|
||
{
|
||
/// <summary>
|
||
/// ToastManager 队列行为测试:
|
||
/// · Enqueue 一条后 Toast 激活并最终隐藏
|
||
/// · 连续 Enqueue 3 条按序串行播放
|
||
///
|
||
/// 不依赖事件频道(直接调用 Enqueue),不依赖本地化(标题/正文为常量字符串)。
|
||
/// </summary>
|
||
public class ToastManagerTests
|
||
{
|
||
private GameObject _host;
|
||
private ToastManager _mgr;
|
||
private ToastNotification _toast;
|
||
|
||
[SetUp]
|
||
public void SetUp()
|
||
{
|
||
_host = new GameObject("ToastHost");
|
||
|
||
// Toast 预制:CanvasGroup + 子文本
|
||
var toastGO = new GameObject("Toast", typeof(CanvasGroup));
|
||
toastGO.transform.SetParent(_host.transform);
|
||
toastGO.SetActive(false);
|
||
_toast = toastGO.AddComponent<ToastNotification>();
|
||
// 反射注入 _displayDuration / _fadeDuration 减为短值,缩短测试时长
|
||
SetPrivate(_toast, "_displayDuration", 0.05f);
|
||
SetPrivate(_toast, "_fadeDuration", 0.02f);
|
||
|
||
_mgr = _host.AddComponent<ToastManager>();
|
||
SetPrivate(_mgr, "_toast", _toast);
|
||
_host.SetActive(false);
|
||
_host.SetActive(true); // 触发 Awake/OnEnable
|
||
}
|
||
|
||
[TearDown]
|
||
public void TearDown() { Object.DestroyImmediate(_host); }
|
||
|
||
[UnityTest]
|
||
public IEnumerator Enqueue_ShowsThenHides()
|
||
{
|
||
_mgr.Enqueue("T", "B", null);
|
||
yield return null;
|
||
Assert.IsTrue(_toast.gameObject.activeSelf, "入队后 Toast 应当激活");
|
||
|
||
// 总时长 ~= 0.02+0.05+0.02 = 0.09s,再 + 队列等待 0.1s
|
||
yield return new WaitForSecondsRealtime(0.5f);
|
||
Assert.IsFalse(_toast.gameObject.activeSelf, "Toast 自动隐藏未生效");
|
||
}
|
||
|
||
[UnityTest]
|
||
public IEnumerator MultipleEnqueue_PlaysSerially()
|
||
{
|
||
_mgr.Enqueue("A", "1", null);
|
||
_mgr.Enqueue("B", "2", null);
|
||
yield return null;
|
||
Assert.IsTrue(_toast.gameObject.activeSelf, "第一条应当立即播放");
|
||
// 不严格验证内容(涉及私有字段),只验证活动状态推进。
|
||
yield return new WaitForSecondsRealtime(1.0f);
|
||
Assert.IsFalse(_toast.gameObject.activeSelf, "两条串行播放后应当全部结束");
|
||
}
|
||
|
||
// ── 反射工具 ──────────────────────────────────────────────────────
|
||
private static void SetPrivate(object target, string fieldName, object value)
|
||
{
|
||
var f = target.GetType().GetField(fieldName,
|
||
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
|
||
f?.SetValue(target, value);
|
||
}
|
||
}
|
||
}
|