#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using NUnit.Framework;
using ShrinkApp.Starter.Basic;
using ShrinkCommand.Integration.App;
using ShrinkContext;
using ShrinkDataSaver.Integration.App;
using ShrinkNetwork;
using ShrinkNetwork.Integration.App;
using ShrinkApp;
using UnityEngine;
using UnityEngine.TestTools;
using Object = UnityEngine.Object;
namespace ShrinkContext.AppAdapter.Tests
{
///
/// Basic Starter 默认装配表的端到端验证(阶段 3):
/// 三个功能模块走原生 Cordis 组件,四个跨包集成走按键注入的薄组件;
/// 提供者停用时依赖集成先退出,兼容服务门面也作为可逆效应注销。
///
public class NativeWiringTests
{
private ShrinkAppSettings? _settings;
private ShrinkAppLoaderHost? _host;
[UnityTearDown]
public IEnumerator TearDown()
{
if (_host?.IsRunning == true)
yield return _host.ShutdownAsync().ToCoroutine();
if (_settings != null)
Object.DestroyImmediate(_settings);
}
[UnityTest]
public IEnumerator BasicComposition_UsesNativeComponents_AndRetiresDependentsReversibly()
{
_settings = ScriptableObject.CreateInstance();
var coreInstallers = new List();
foreach (var installerType in ShrinkAppInstallers.GetDiscoveredInstallerTypes())
{
if (Activator.CreateInstance(installerType) is not IShrinkAppModuleInstaller installer)
continue;
if (installer.ModuleId is "shrink.network" or "shrink.command" or "shrink.datasaver")
coreInstallers.Add(installer);
}
_host = new ShrinkAppLoaderHost(_settings, coreInstallers);
ShrinkAppBasicContextComposition.Configure(_host);
_host.ApplyComposition(ShrinkAppBasicContextComposition.CreateDefaultDocument());
yield return _host.StartAsync().ToCoroutine();
Assert.AreEqual(7, _host.ModuleIds.Count);
Assert.AreEqual(7, _host.ActiveModuleIds.Count);
Assert.IsTrue(_host.IsModuleActive("shrink.network"));
Assert.IsTrue(_host.IsModuleActive("shrink.command"));
Assert.IsTrue(_host.IsModuleActive("shrink.datasaver"));
Assert.IsTrue(_host.IsModuleActive("shrink.integration.command-network"));
Assert.IsTrue(_host.IsModuleActive("shrink.integration.command-eventbus"));
Assert.IsTrue(_host.IsModuleActive("shrink.integration.datasaver-eventbus"));
Assert.IsTrue(_host.IsModuleActive("shrink.integration.network-eventbus"));
var root = _host.Context.RootContext;
Assert.IsTrue(_host.Context.TryGetRaw(root,
ShrinkNetworkAppComponent.ServiceKey, out _), "网络服务键由原生组件提供");
Assert.IsTrue(_host.Context.TryGetRaw(root,
ShrinkCommandAppComponent.ServiceKey, out _), "命令服务键由原生组件提供");
Assert.IsTrue(_host.Context.TryGetRaw