Files
Installer/Development~/UnityProject/Assets/Editor/ShrinkInstallerDevelopmentValidation.cs
T
cneicy 96480dd488
Publish UPM package / publish (push) Successful in 2s
feat(installer): rebuild package manager with ui toolkit
2026-08-26 12:48:35 +08:00

75 lines
3.0 KiB
C#

#if UNITY_EDITOR
using System;
using System.Collections;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public static class ShrinkInstallerDevelopmentValidation
{
public static void Run()
{
try
{
var windowType = FindType("ShrinkSDK.Installer.ShrinkSdkInstallerWindow");
var window = ScriptableObject.CreateInstance(windowType) as EditorWindow
?? throw new InvalidOperationException("无法创建包管理窗口。");
try
{
windowType.GetMethod("CreateGUI", BindingFlags.Public | BindingFlags.Instance)?.Invoke(window, null);
var texts = window.rootVisualElement.Query<Label>().ToList()
.Select(label => label.text)
.Where(text => !string.IsNullOrWhiteSpace(text))
.ToArray();
Require(texts.Contains("ShrinkSDK 包管理"), "缺少中文窗口标题。");
Require(texts.Any(text => text.Contains("以 Context 为组合基础")), "缺少 Context 架构说明。");
Require(window.rootVisualElement.Query<Button>().ToList().Any(button => button.text == "安装组合"),
"缺少组合安装按钮。");
Require(window.rootVisualElement.Query<Foldout>().ToList().Any(), "组合内容未使用 UI Toolkit Foldout。");
var catalog = FindType("ShrinkSDK.Installer.ShrinkSdkPackageCatalog");
var packages = catalog.GetField("Packages", BindingFlags.Static | BindingFlags.NonPublic)
?.GetValue(null) as IEnumerable;
var bundles = catalog.GetField("Bundles", BindingFlags.Static | BindingFlags.NonPublic)
?.GetValue(null) as IEnumerable;
Require(Count(packages) == 20, "包目录数量不是 20。");
Require(Count(bundles) == 8, "推荐组合数量不是 8。");
}
finally
{
UnityEngine.Object.DestroyImmediate(window);
}
Debug.Log("ShrinkInstaller development validation passed: UI Toolkit, Chinese UI, package status surface and Context bundles.");
EditorApplication.Exit(0);
}
catch (Exception exception)
{
Debug.LogException(exception);
EditorApplication.Exit(1);
}
}
private static int Count(IEnumerable enumerable)
{
var count = 0;
foreach (var _ in enumerable)
count++;
return count;
}
private static Type FindType(string fullName) => AppDomain.CurrentDomain.GetAssemblies()
.Select(assembly => assembly.GetType(fullName, false))
.FirstOrDefault(type => type != null)
?? throw new InvalidOperationException("未加载类型:" + fullName);
private static void Require(bool condition, string message)
{
if (!condition)
throw new InvalidOperationException(message);
}
}
#endif