// Copyright (c) 2025 EFramework Innovation. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. using System; using NUnit.Framework; using EFramework.Unity.MVVM; using UnityEngine.TestTools; using System.Collections; /// /// TestXScene 是 XScene 的单元测试。 /// public class TestXScene { private class MySingletonScene : XScene.Base { } [Test] public void Singleton() { // 验证单例模式 var instance1 = MySingletonScene.Instance; var instance2 = MySingletonScene.Instance; Assert.That(instance1, Is.Not.Null, "单例实例1不应为空。"); Assert.That(instance2, Is.Not.Null, "单例实例2不应为空。"); Assert.That(instance1, Is.SameAs(instance2), "两次获取的单例实例应当是同一个对象。"); } [UnityTest] public IEnumerator Manage() { var onSwapCalled = false; XScene.OnSwap += () => onSwapCalled = true; var testScene1 = new XScene.Base(); var testScene2 = new XScene.Base(); XScene.Current = testScene1; // 切换到新场景 XScene.Goto(testScene2, "test"); Assert.That(XScene.Last, Is.Null, "Last 场景在第一次切换前应当为空。"); Assert.That(XScene.Current, Is.SameAs(testScene1), "Current 场景应当仍为初始场景。"); Assert.That(XScene.Next, Is.SameAs(testScene2), "Next 场景应当已设置为目标场景"); Assert.That(XScene.Args[0], Is.EqualTo("test"), "场景参数应当正确传递。"); // 等一帧Update调用 yield return null; Assert.That(XScene.Current, Is.EqualTo(testScene2), "更新后 Current 场景应当切换到目标场景。"); Assert.That(XScene.Last, Is.EqualTo(testScene1), "更新后 Last 场景应当为之前的 Current 场景。"); Assert.That(XScene.Next, Is.Null, "更新后 Next 场景应当为空。"); Assert.That(XScene.Args, Is.Null, "更新后 Args 应当为空。"); Assert.That(onSwapCalled, Is.True, "场景切换后应当触发 OnSwap 事件。"); // 测试异常 var ex = Assert.Throws(() => XScene.Goto(new object()), "OnProxy 为空时,传入非 IBase 对象应当抛出异常。"); Assert.That(ex.Message, Is.EqualTo("OnProxy is null"), "异常消息应当指示 OnProxy 为空。"); XScene.OnProxy = (obj) => obj as XScene.IBase; Assert.DoesNotThrow(() => XScene.Goto(new object())); } }