@atelierai/uco 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +7 -8
- package/bin/server.mjs +1 -1
- package/bin/stub-plugin.mjs +3 -3
- package/dist/codegen/coerce.js +1 -1
- package/dist/codegen/coerce.js.map +1 -1
- package/dist/codegen/emit.js +2 -2
- package/dist/codegen/emit.js.map +1 -1
- package/dist/codegen/refs.js +1 -1
- package/dist/codegen/refs.js.map +1 -1
- package/dist/codegen/types.js +1 -1
- package/dist/codegen/types.js.map +1 -1
- package/dist/commands/call.js +1 -1
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/devops/configure.js +1 -1
- package/dist/commands/devops/configure.js.map +1 -1
- package/dist/commands/devops/index.js +0 -4
- package/dist/commands/devops/index.js.map +1 -1
- package/dist/commands/devops/install-plugin.js +1 -1
- package/dist/commands/devops/install-plugin.js.map +1 -1
- package/dist/commands/devops/open.js +7 -7
- package/dist/commands/devops/open.js.map +1 -1
- package/dist/commands/devops/status.js +3 -3
- package/dist/commands/devops/status.js.map +1 -1
- package/dist/commands/exec.js +1 -1
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/install.js +2 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/prompt.js +2 -2
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/resource.js +2 -2
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/update.js +1 -26
- package/dist/commands/update.js.map +1 -1
- package/dist/config/port.js +2 -2
- package/dist/config/port.js.map +1 -1
- package/dist/config/resolve.d.ts +1 -2
- package/dist/config/resolve.js +0 -12
- package/dist/config/resolve.js.map +1 -1
- package/dist/devops/lib/configure.d.ts +1 -1
- package/dist/devops/lib/configure.js +2 -2
- package/dist/devops/lib/configure.js.map +1 -1
- package/dist/devops/lib/install-plugin.d.ts +1 -1
- package/dist/devops/lib/install-plugin.js +1 -1
- package/dist/devops/lib/install-plugin.js.map +1 -1
- package/dist/devops/lib/install.d.ts +2 -2
- package/dist/devops/lib/install.js +5 -5
- package/dist/devops/lib/install.js.map +1 -1
- package/dist/devops/lib/open.js +11 -32
- package/dist/devops/lib/open.js.map +1 -1
- package/dist/devops/lib/remove-plugin.d.ts +1 -1
- package/dist/devops/lib/remove-plugin.js +3 -3
- package/dist/devops/lib/remove-plugin.js.map +1 -1
- package/dist/devops/lib/run-tool.d.ts +2 -2
- package/dist/devops/lib/run-tool.js +2 -2
- package/dist/devops/lib/types.d.ts +17 -54
- package/dist/devops/lib/types.js +2 -2
- package/dist/devops/lib/types.js.map +1 -1
- package/dist/devops/lib/update.d.ts +0 -15
- package/dist/devops/lib/update.js +2 -91
- package/dist/devops/lib/update.js.map +1 -1
- package/dist/devops/utils/agents.d.ts +0 -28
- package/dist/devops/utils/agents.js +0 -462
- package/dist/devops/utils/agents.js.map +1 -1
- package/dist/devops/utils/config.d.ts +9 -18
- package/dist/devops/utils/config.js +7 -20
- package/dist/devops/utils/config.js.map +1 -1
- package/dist/devops/utils/editor-cache.js +1 -1
- package/dist/devops/utils/editor-cache.js.map +1 -1
- package/dist/devops/utils/launch-error-dismiss.d.ts +2 -2
- package/dist/devops/utils/launch-error-dismiss.js +5 -5
- package/dist/devops/utils/manifest.d.ts +2 -2
- package/dist/devops/utils/manifest.js +3 -3
- package/dist/devops/utils/manifest.js.map +1 -1
- package/dist/devops/utils/port.d.ts +1 -1
- package/dist/devops/utils/port.js +1 -1
- package/dist/devops/utils/probe.d.ts +1 -1
- package/dist/devops/utils/probe.js +1 -1
- package/dist/devops/utils/ui.js +2 -2
- package/dist/devops/utils/ui.js.map +1 -1
- package/dist/devops/utils/unity-editor.js +4 -4
- package/dist/devops/utils/unity-editor.js.map +1 -1
- package/dist/devops/utils/unity-hub.js +1 -1
- package/dist/devops/utils/unity-hub.js.map +1 -1
- package/dist/devops/utils/unity-shutdown.d.ts +1 -1
- package/dist/devops/utils/unity-shutdown.js +1 -1
- package/dist/devops/utils/update-check.js +3 -3
- package/dist/devops/utils/update-check.js.map +1 -1
- package/dist/devops/utils/vendor.d.ts +2 -2
- package/dist/devops/utils/vendor.js +4 -4
- package/dist/devops/utils/vendor.js.map +1 -1
- package/dist/generated/tools.js +1 -1
- package/dist/generated/tools.js.map +1 -1
- package/dist/program.js +3 -3
- package/dist/program.js.map +1 -1
- package/dist/server/app.d.ts +5 -5
- package/dist/server/app.js +3 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/rest/auth.d.ts +1 -1
- package/dist/server/rest/auth.js +3 -3
- package/dist/server/rest/auth.js.map +1 -1
- package/dist/server/rest/context.d.ts +2 -2
- package/dist/server/rest/forward.d.ts +2 -2
- package/dist/server/session/store.d.ts +3 -3
- package/dist/server/session/store.js +4 -4
- package/dist/server/session/store.js.map +1 -1
- package/dist/server/stub-client/scenarios.js +8 -8
- package/dist/server/stub-client/scenarios.js.map +1 -1
- package/dist/server/types.d.ts +11 -11
- package/dist/server/types.js +9 -9
- package/dist/server/types.js.map +1 -1
- package/dist/server/ws/hub.d.ts +8 -8
- package/dist/server/ws/hub.js +13 -13
- package/dist/server/ws/hub.js.map +1 -1
- package/dist/server/ws/rpc.d.ts +3 -3
- package/dist/server/ws/rpc.js +4 -4
- package/dist/server/ws/rpc.js.map +1 -1
- package/dist/transport/index.d.ts +1 -1
- package/dist/transport/index.js +3 -3
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/rest.js +1 -1
- package/dist/transport/rest.js.map +1 -1
- package/docs/INSTALL.zh-CN.md +2 -3
- package/package.json +1 -1
- package/skills/uco-setup/SKILL.md +1 -1
- package/skills/unity-editor/references/diagnostics.md +24 -24
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +1034 -1034
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Components/ExtensionPanel.cs +379 -379
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/MenuItems.cs +72 -72
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/UnityCopilotProjectSettingsProvider.cs +64 -64
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +372 -372
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +175 -175
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +368 -368
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +4 -4
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
- package/dist/commands/devops/login.d.ts +0 -2
- package/dist/commands/devops/login.js +0 -29
- package/dist/commands/devops/login.js.map +0 -1
- package/dist/commands/devops/setup-mcp.d.ts +0 -2
- package/dist/commands/devops/setup-mcp.js +0 -41
- package/dist/commands/devops/setup-mcp.js.map +0 -1
- package/dist/devops/commands-upstream/bootstrap-local.d.ts +0 -17
- package/dist/devops/commands-upstream/bootstrap-local.js +0 -87
- package/dist/devops/commands-upstream/bootstrap-local.js.map +0 -1
- package/dist/devops/commands-upstream/close.d.ts +0 -57
- package/dist/devops/commands-upstream/close.js +0 -188
- package/dist/devops/commands-upstream/close.js.map +0 -1
- package/dist/devops/commands-upstream/configure.d.ts +0 -2
- package/dist/devops/commands-upstream/configure.js +0 -87
- package/dist/devops/commands-upstream/configure.js.map +0 -1
- package/dist/devops/commands-upstream/create-project.d.ts +0 -2
- package/dist/devops/commands-upstream/create-project.js +0 -43
- package/dist/devops/commands-upstream/create-project.js.map +0 -1
- package/dist/devops/commands-upstream/install-plugin.d.ts +0 -2
- package/dist/devops/commands-upstream/install-plugin.js +0 -64
- package/dist/devops/commands-upstream/install-plugin.js.map +0 -1
- package/dist/devops/commands-upstream/install-unity.d.ts +0 -2
- package/dist/devops/commands-upstream/install-unity.js +0 -72
- package/dist/devops/commands-upstream/install-unity.js.map +0 -1
- package/dist/devops/commands-upstream/login.d.ts +0 -2
- package/dist/devops/commands-upstream/login.js +0 -33
- package/dist/devops/commands-upstream/login.js.map +0 -1
- package/dist/devops/commands-upstream/open.d.ts +0 -32
- package/dist/devops/commands-upstream/open.js +0 -282
- package/dist/devops/commands-upstream/open.js.map +0 -1
- package/dist/devops/commands-upstream/remove-plugin.d.ts +0 -2
- package/dist/devops/commands-upstream/remove-plugin.js +0 -41
- package/dist/devops/commands-upstream/remove-plugin.js.map +0 -1
- package/dist/devops/commands-upstream/run-system-tool.d.ts +0 -1
- package/dist/devops/commands-upstream/run-system-tool.js +0 -13
- package/dist/devops/commands-upstream/run-system-tool.js.map +0 -1
- package/dist/devops/commands-upstream/run-tool-builder.d.ts +0 -25
- package/dist/devops/commands-upstream/run-tool-builder.js +0 -125
- package/dist/devops/commands-upstream/run-tool-builder.js.map +0 -1
- package/dist/devops/commands-upstream/run-tool.d.ts +0 -1
- package/dist/devops/commands-upstream/run-tool.js +0 -13
- package/dist/devops/commands-upstream/run-tool.js.map +0 -1
- package/dist/devops/commands-upstream/setup-mcp.d.ts +0 -2
- package/dist/devops/commands-upstream/setup-mcp.js +0 -68
- package/dist/devops/commands-upstream/setup-mcp.js.map +0 -1
- package/dist/devops/commands-upstream/setup-skills.d.ts +0 -2
- package/dist/devops/commands-upstream/setup-skills.js +0 -167
- package/dist/devops/commands-upstream/setup-skills.js.map +0 -1
- package/dist/devops/commands-upstream/status.d.ts +0 -2
- package/dist/devops/commands-upstream/status.js +0 -87
- package/dist/devops/commands-upstream/status.js.map +0 -1
- package/dist/devops/commands-upstream/update.d.ts +0 -2
- package/dist/devops/commands-upstream/update.js +0 -77
- package/dist/devops/commands-upstream/update.js.map +0 -1
- package/dist/devops/commands-upstream/wait-for-ready.d.ts +0 -2
- package/dist/devops/commands-upstream/wait-for-ready.js +0 -93
- package/dist/devops/commands-upstream/wait-for-ready.js.map +0 -1
- package/dist/devops/lib/setup-mcp.d.ts +0 -35
- package/dist/devops/lib/setup-mcp.js +0 -177
- package/dist/devops/lib/setup-mcp.js.map +0 -1
- package/dist/devops/utils/cloud-login.d.ts +0 -7
- package/dist/devops/utils/cloud-login.js +0 -56
- package/dist/devops/utils/cloud-login.js.map +0 -1
- /package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs.meta → UcoPluginTests.cs.meta} +0 -0
|
@@ -1,416 +1,416 @@
|
|
|
1
|
-
|
|
2
|
-
┌──────────────────────────────────────────────────────────────────┐
|
|
3
|
-
│ Author: Ivan Murzak (https://github.com/IvanMurzak) │
|
|
4
|
-
│ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
|
|
5
|
-
│ Copyright (c) 2025 Ivan Murzak │
|
|
6
|
-
│ Licensed under the Apache License, Version 2.0. │
|
|
7
|
-
│ See the LICENSE file in the project root for more information. │
|
|
8
|
-
└──────────────────────────────────────────────────────────────────┘
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#nullable enable
|
|
12
|
-
using System.Collections;
|
|
13
|
-
using System.Linq;
|
|
14
|
-
using com.IvanMurzak.ReflectorNet;
|
|
15
|
-
using com.IvanMurzak.ReflectorNet.Model;
|
|
16
|
-
using com.IvanMurzak.ReflectorNet.Utils;
|
|
17
|
-
using com.AtelierAI.Unity.Copilot.Editor.Tests.Utils;
|
|
18
|
-
using com.AtelierAI.Unity.Copilot.TestFiles;
|
|
19
|
-
using NUnit.Framework;
|
|
20
|
-
using UnityEngine;
|
|
21
|
-
using UnityEngine.TestTools;
|
|
22
|
-
|
|
23
|
-
namespace com.AtelierAI.Unity.Copilot.Editor.Tests
|
|
24
|
-
{
|
|
25
|
-
/// <summary>
|
|
26
|
-
/// Tests to verify that blacklisted types are excluded from serialization.
|
|
27
|
-
/// </summary>
|
|
28
|
-
public class BlacklistTypeTests : BaseTest
|
|
29
|
-
{
|
|
30
|
-
[UnitySetUp]
|
|
31
|
-
public override IEnumerator SetUp() => base.SetUp();
|
|
32
|
-
|
|
33
|
-
[UnityTearDown]
|
|
34
|
-
public override IEnumerator TearDown() => base.TearDown();
|
|
35
|
-
|
|
36
|
-
/// <summary>
|
|
37
|
-
/// Creates a new Reflector configured similarly to UnityCopilotPluginEditor.CreateDefaultReflector()
|
|
38
|
-
/// but with custom blacklisted types for testing.
|
|
39
|
-
/// </summary>
|
|
40
|
-
private Reflector CreateTestReflector()
|
|
41
|
-
{
|
|
42
|
-
return UnityCopilotPluginEditor.Instance.CreateDefaultReflector();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
[UnityTest]
|
|
46
|
-
public IEnumerator Serialize_Component_WithBlacklistedType_Field_ShouldNotContainBlacklistedField()
|
|
47
|
-
{
|
|
48
|
-
// Arrange
|
|
49
|
-
var reflector = CreateTestReflector();
|
|
50
|
-
|
|
51
|
-
// Blacklist the test types
|
|
52
|
-
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
53
|
-
|
|
54
|
-
// Create a GameObject with the test component
|
|
55
|
-
var go = new GameObject("TestGameObject_Blacklist");
|
|
56
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
57
|
-
|
|
58
|
-
// Set values on the component
|
|
59
|
-
component.normalIntField = 42;
|
|
60
|
-
component.normalStringField = "Hello World";
|
|
61
|
-
component.normalVectorField = new Vector3(1, 2, 3);
|
|
62
|
-
component.blacklistedTypeField = new BlacklistedType { value = 100, name = "ShouldNotAppear" };
|
|
63
|
-
|
|
64
|
-
yield return null;
|
|
65
|
-
|
|
66
|
-
// Act
|
|
67
|
-
var serialized = reflector.Serialize(
|
|
68
|
-
component,
|
|
69
|
-
recursive: true,
|
|
70
|
-
logger: _logger);
|
|
71
|
-
|
|
72
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
73
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component:\n{json}");
|
|
74
|
-
|
|
75
|
-
// Assert
|
|
76
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
77
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
78
|
-
|
|
79
|
-
// Verify normal fields are present
|
|
80
|
-
var normalIntFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField));
|
|
81
|
-
var normalStringFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField));
|
|
82
|
-
var normalVectorFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalVectorField));
|
|
83
|
-
|
|
84
|
-
Assert.IsTrue(normalIntFieldExists, "Normal int field should be serialized.");
|
|
85
|
-
Assert.IsTrue(normalStringFieldExists, "Normal string field should be serialized.");
|
|
86
|
-
Assert.IsTrue(normalVectorFieldExists, "Normal vector field should be serialized.");
|
|
87
|
-
|
|
88
|
-
// Verify blacklisted field is NOT present
|
|
89
|
-
var blacklistedFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField));
|
|
90
|
-
Assert.IsFalse(blacklistedFieldExists, "Blacklisted type field should NOT be serialized.");
|
|
91
|
-
|
|
92
|
-
// Also verify the JSON string does not contain the blacklisted field name
|
|
93
|
-
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
94
|
-
Assert.IsFalse(json.Contains("ShouldNotAppear"), "JSON should not contain the value from blacklisted type.");
|
|
95
|
-
|
|
96
|
-
yield return null;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
[UnityTest]
|
|
100
|
-
public IEnumerator Serialize_Component_WithBlacklistedStruct_Field_ShouldNotContainBlacklistedField()
|
|
101
|
-
{
|
|
102
|
-
// Arrange
|
|
103
|
-
var reflector = CreateTestReflector();
|
|
104
|
-
|
|
105
|
-
// Blacklist the test struct type
|
|
106
|
-
reflector.Converters.BlacklistType(typeof(BlacklistedStruct));
|
|
107
|
-
|
|
108
|
-
// Create a GameObject with the test component
|
|
109
|
-
var go = new GameObject("TestGameObject_BlacklistStruct");
|
|
110
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
111
|
-
|
|
112
|
-
// Set values on the component
|
|
113
|
-
component.normalIntField = 123;
|
|
114
|
-
component.blacklistedStructField = new BlacklistedStruct { x = 10.5f, y = 20.5f };
|
|
115
|
-
|
|
116
|
-
yield return null;
|
|
117
|
-
|
|
118
|
-
// Act
|
|
119
|
-
var serialized = reflector.Serialize(
|
|
120
|
-
component,
|
|
121
|
-
recursive: true,
|
|
122
|
-
logger: _logger);
|
|
123
|
-
|
|
124
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
125
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component with struct:\n{json}");
|
|
126
|
-
|
|
127
|
-
// Assert
|
|
128
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
129
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
130
|
-
|
|
131
|
-
// Verify normal field is present
|
|
132
|
-
var normalIntFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField));
|
|
133
|
-
Assert.IsTrue(normalIntFieldExists, "Normal int field should be serialized.");
|
|
134
|
-
|
|
135
|
-
// Verify blacklisted struct field is NOT present
|
|
136
|
-
var blacklistedStructFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField));
|
|
137
|
-
Assert.IsFalse(blacklistedStructFieldExists, "Blacklisted struct field should NOT be serialized.");
|
|
138
|
-
|
|
139
|
-
// Also verify the JSON string does not contain the blacklisted field name
|
|
140
|
-
Assert.IsFalse(json.Contains("blacklistedStructField"), "JSON should not contain 'blacklistedStructField'.");
|
|
141
|
-
|
|
142
|
-
yield return null;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
[UnityTest]
|
|
146
|
-
public IEnumerator Serialize_Component_WithMultipleBlacklistedTypes_ShouldNotContainAnyBlacklistedFields()
|
|
147
|
-
{
|
|
148
|
-
// Arrange
|
|
149
|
-
var reflector = CreateTestReflector();
|
|
150
|
-
|
|
151
|
-
// Blacklist both test types
|
|
152
|
-
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
153
|
-
reflector.Converters.BlacklistType(typeof(BlacklistedStruct));
|
|
154
|
-
|
|
155
|
-
// Create a GameObject with the test component
|
|
156
|
-
var go = new GameObject("TestGameObject_MultiBlacklist");
|
|
157
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
158
|
-
|
|
159
|
-
// Set values on the component
|
|
160
|
-
component.normalIntField = 999;
|
|
161
|
-
component.normalStringField = "This should appear";
|
|
162
|
-
component.normalVectorField = Vector3.one;
|
|
163
|
-
component.blacklistedTypeField = new BlacklistedType { value = 1, name = "Hidden1" };
|
|
164
|
-
component.blacklistedStructField = new BlacklistedStruct { x = 1, y = 2 };
|
|
165
|
-
|
|
166
|
-
yield return null;
|
|
167
|
-
|
|
168
|
-
// Act
|
|
169
|
-
var serialized = reflector.Serialize(
|
|
170
|
-
component,
|
|
171
|
-
recursive: true,
|
|
172
|
-
logger: _logger);
|
|
173
|
-
|
|
174
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
175
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component with multiple blacklisted types:\n{json}");
|
|
176
|
-
|
|
177
|
-
// Assert
|
|
178
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
179
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
180
|
-
|
|
181
|
-
// Verify normal fields are present
|
|
182
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
183
|
-
"Normal int field should be serialized.");
|
|
184
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField)),
|
|
185
|
-
"Normal string field should be serialized.");
|
|
186
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalVectorField)),
|
|
187
|
-
"Normal vector field should be serialized.");
|
|
188
|
-
|
|
189
|
-
// Verify blacklisted fields are NOT present
|
|
190
|
-
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
191
|
-
"Blacklisted type field should NOT be serialized.");
|
|
192
|
-
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField)),
|
|
193
|
-
"Blacklisted struct field should NOT be serialized.");
|
|
194
|
-
|
|
195
|
-
// Also verify the JSON string does not contain the blacklisted field names
|
|
196
|
-
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
197
|
-
Assert.IsFalse(json.Contains("blacklistedStructField"), "JSON should not contain 'blacklistedStructField'.");
|
|
198
|
-
Assert.IsFalse(json.Contains("Hidden1"), "JSON should not contain values from blacklisted types.");
|
|
199
|
-
|
|
200
|
-
yield return null;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
[UnityTest]
|
|
204
|
-
public IEnumerator Serialize_Component_WithoutBlacklist_ShouldContainAllFields()
|
|
205
|
-
{
|
|
206
|
-
// Arrange
|
|
207
|
-
var reflector = CreateTestReflector();
|
|
208
|
-
// NOTE: We do NOT blacklist any types here
|
|
209
|
-
|
|
210
|
-
// Create a GameObject with the test component
|
|
211
|
-
var go = new GameObject("TestGameObject_NoBlacklist");
|
|
212
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
213
|
-
|
|
214
|
-
// Set values on the component
|
|
215
|
-
component.normalIntField = 42;
|
|
216
|
-
component.normalStringField = "Test";
|
|
217
|
-
component.blacklistedTypeField = new BlacklistedType { value = 100, name = "ShouldAppear" };
|
|
218
|
-
component.blacklistedStructField = new BlacklistedStruct { x = 5, y = 10 };
|
|
219
|
-
|
|
220
|
-
yield return null;
|
|
221
|
-
|
|
222
|
-
// Act
|
|
223
|
-
var serialized = reflector.Serialize(
|
|
224
|
-
component,
|
|
225
|
-
recursive: true,
|
|
226
|
-
logger: _logger);
|
|
227
|
-
|
|
228
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
229
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component without blacklist:\n{json}");
|
|
230
|
-
|
|
231
|
-
// Assert
|
|
232
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
233
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
234
|
-
|
|
235
|
-
// Verify ALL fields are present (since nothing is blacklisted)
|
|
236
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
237
|
-
"Normal int field should be serialized.");
|
|
238
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField)),
|
|
239
|
-
"Normal string field should be serialized.");
|
|
240
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
241
|
-
"BlacklistedType field should be serialized when NOT blacklisted.");
|
|
242
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField)),
|
|
243
|
-
"BlacklistedStruct field should be serialized when NOT blacklisted.");
|
|
244
|
-
|
|
245
|
-
yield return null;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
[UnityTest]
|
|
249
|
-
public IEnumerator Serialize_Material_WithBlacklistedColor_ShouldNotContainColorMembers()
|
|
250
|
-
{
|
|
251
|
-
// Arrange
|
|
252
|
-
var reflector = CreateTestReflector();
|
|
253
|
-
|
|
254
|
-
// Blacklist the UnityEngine.Color type
|
|
255
|
-
reflector.Converters.BlacklistType(typeof(Color));
|
|
256
|
-
|
|
257
|
-
// Create a Material instance using executor (handles cleanup automatically)
|
|
258
|
-
var materialEx = new CreateMaterialExecutor("TestMaterial_BlacklistColor.mat", "Standard", "Assets", "Unity-
|
|
259
|
-
|
|
260
|
-
// Validation executor
|
|
261
|
-
var validateEx = new LazyNodeExecutor();
|
|
262
|
-
validateEx.SetAction<object?>((input) =>
|
|
263
|
-
{
|
|
264
|
-
var material = materialEx.Asset;
|
|
265
|
-
Assert.IsNotNull(material, "Material should be created.");
|
|
266
|
-
|
|
267
|
-
// Set color on the material
|
|
268
|
-
material!.color = new Color(1f, 0.5f, 0.25f, 1f);
|
|
269
|
-
material.SetColor("_EmissionColor", new Color(0.1f, 0.2f, 0.3f, 1f));
|
|
270
|
-
|
|
271
|
-
// Act
|
|
272
|
-
var serialized = reflector.Serialize(
|
|
273
|
-
material,
|
|
274
|
-
recursive: true,
|
|
275
|
-
logger: _logger);
|
|
276
|
-
|
|
277
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
278
|
-
Debug.Log($"[BlacklistTypeTests] Serialized Material with blacklisted Color:\n{json}");
|
|
279
|
-
|
|
280
|
-
// Assert
|
|
281
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
282
|
-
|
|
283
|
-
// Helper function to recursively check all fields for Color type
|
|
284
|
-
void AssertNoColorFields(SerializedMember member, string path)
|
|
285
|
-
{
|
|
286
|
-
if (member.fields != null)
|
|
287
|
-
{
|
|
288
|
-
var colorTypeId = TypeUtils.GetTypeId<UnityEngine.Color>();
|
|
289
|
-
foreach (var field in member.fields)
|
|
290
|
-
{
|
|
291
|
-
// Check that no field is of Color type
|
|
292
|
-
var isColorType = field.typeName == colorTypeId;
|
|
293
|
-
Assert.IsFalse(isColorType,
|
|
294
|
-
$"Field '{path}.{field.name}' of type '{field.typeName}' should not be serialized when Color is blacklisted.");
|
|
295
|
-
|
|
296
|
-
// Recursively check nested fields
|
|
297
|
-
AssertNoColorFields(field, $"{path}.{field.name}");
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Check all fields recursively
|
|
303
|
-
AssertNoColorFields(serialized, "root");
|
|
304
|
-
|
|
305
|
-
// Also check that the JSON does not contain UnityEngine.Color type references
|
|
306
|
-
Assert.IsFalse(json.Contains("UnityEngine.Color"),
|
|
307
|
-
"JSON should not contain 'UnityEngine.Color' type reference.");
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
materialEx.AddChild(validateEx);
|
|
311
|
-
materialEx.Execute();
|
|
312
|
-
|
|
313
|
-
yield return null;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
[UnityTest]
|
|
317
|
-
public IEnumerator Serialize_Component_BlacklistByTypeName_ShouldNotContainBlacklistedField()
|
|
318
|
-
{
|
|
319
|
-
// Arrange
|
|
320
|
-
var reflector = CreateTestReflector();
|
|
321
|
-
|
|
322
|
-
// Blacklist using full type name string (similar to how TMPro types are blacklisted)
|
|
323
|
-
var fullTypeName = typeof(BlacklistedType).FullName!;
|
|
324
|
-
var type = com.IvanMurzak.ReflectorNet.Utils.TypeUtils.GetType(fullTypeName);
|
|
325
|
-
Assert.IsNotNull(type, $"Type '{fullTypeName}' should be resolvable.");
|
|
326
|
-
reflector.Converters.BlacklistType(type!);
|
|
327
|
-
|
|
328
|
-
// Create a GameObject with the test component
|
|
329
|
-
var go = new GameObject("TestGameObject_BlacklistByName");
|
|
330
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
331
|
-
|
|
332
|
-
// Set values on the component
|
|
333
|
-
component.normalIntField = 77;
|
|
334
|
-
component.blacklistedTypeField = new BlacklistedType { value = 200, name = "HiddenByName" };
|
|
335
|
-
|
|
336
|
-
yield return null;
|
|
337
|
-
|
|
338
|
-
// Act
|
|
339
|
-
var serialized = reflector.Serialize(
|
|
340
|
-
component,
|
|
341
|
-
recursive: true,
|
|
342
|
-
logger: _logger);
|
|
343
|
-
|
|
344
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
345
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component with type blacklisted by name:\n{json}");
|
|
346
|
-
|
|
347
|
-
// Assert
|
|
348
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
349
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
350
|
-
|
|
351
|
-
// Verify normal field is present
|
|
352
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
353
|
-
"Normal int field should be serialized.");
|
|
354
|
-
|
|
355
|
-
// Verify blacklisted field is NOT present
|
|
356
|
-
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
357
|
-
"Blacklisted type field should NOT be serialized when blacklisted by type name.");
|
|
358
|
-
|
|
359
|
-
// Also verify the JSON string does not contain the blacklisted field name
|
|
360
|
-
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
361
|
-
Assert.IsFalse(json.Contains("HiddenByName"), "JSON should not contain values from blacklisted types.");
|
|
362
|
-
|
|
363
|
-
yield return null;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
[UnityTest]
|
|
367
|
-
public IEnumerator Serialize_Component_WithBlacklistedType_Property_ShouldNotContainBlacklistedProperty()
|
|
368
|
-
{
|
|
369
|
-
// Arrange
|
|
370
|
-
var reflector = CreateTestReflector();
|
|
371
|
-
|
|
372
|
-
// Blacklist the test type
|
|
373
|
-
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
374
|
-
|
|
375
|
-
// Create a GameObject with the test component
|
|
376
|
-
var go = new GameObject("TestGameObject_BlacklistProperty");
|
|
377
|
-
var component = go.AddComponent<BlacklistTestScript>();
|
|
378
|
-
|
|
379
|
-
// Set values on the component
|
|
380
|
-
component.normalIntField = 55;
|
|
381
|
-
component.BlacklistedTypeProperty = new BlacklistedType { value = 300, name = "PropertyShouldNotAppear" };
|
|
382
|
-
|
|
383
|
-
yield return null;
|
|
384
|
-
|
|
385
|
-
// Act
|
|
386
|
-
var serialized = reflector.Serialize(
|
|
387
|
-
component,
|
|
388
|
-
recursive: true,
|
|
389
|
-
logger: _logger);
|
|
390
|
-
|
|
391
|
-
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
392
|
-
Debug.Log($"[BlacklistTypeTests] Serialized component with blacklisted property:\n{json}");
|
|
393
|
-
|
|
394
|
-
// Assert
|
|
395
|
-
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
396
|
-
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
397
|
-
|
|
398
|
-
// Verify normal field is present
|
|
399
|
-
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
400
|
-
"Normal int field should be serialized.");
|
|
401
|
-
|
|
402
|
-
// Verify blacklisted property is NOT present in props
|
|
403
|
-
if (serialized.props != null)
|
|
404
|
-
{
|
|
405
|
-
var blacklistedPropertyExists = serialized.props.Any(p => p.name == nameof(BlacklistTestScript.BlacklistedTypeProperty));
|
|
406
|
-
Assert.IsFalse(blacklistedPropertyExists, "Blacklisted type property should NOT be serialized.");
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Also verify the JSON string does not contain the blacklisted property name or value
|
|
410
|
-
Assert.IsFalse(json.Contains("BlacklistedTypeProperty"), "JSON should not contain 'BlacklistedTypeProperty'.");
|
|
411
|
-
Assert.IsFalse(json.Contains("PropertyShouldNotAppear"), "JSON should not contain the value from blacklisted type property.");
|
|
412
|
-
|
|
413
|
-
yield return null;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
┌──────────────────────────────────────────────────────────────────┐
|
|
3
|
+
│ Author: Ivan Murzak (https://github.com/IvanMurzak) │
|
|
4
|
+
│ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │
|
|
5
|
+
│ Copyright (c) 2025 Ivan Murzak │
|
|
6
|
+
│ Licensed under the Apache License, Version 2.0. │
|
|
7
|
+
│ See the LICENSE file in the project root for more information. │
|
|
8
|
+
└──────────────────────────────────────────────────────────────────┘
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#nullable enable
|
|
12
|
+
using System.Collections;
|
|
13
|
+
using System.Linq;
|
|
14
|
+
using com.IvanMurzak.ReflectorNet;
|
|
15
|
+
using com.IvanMurzak.ReflectorNet.Model;
|
|
16
|
+
using com.IvanMurzak.ReflectorNet.Utils;
|
|
17
|
+
using com.AtelierAI.Unity.Copilot.Editor.Tests.Utils;
|
|
18
|
+
using com.AtelierAI.Unity.Copilot.TestFiles;
|
|
19
|
+
using NUnit.Framework;
|
|
20
|
+
using UnityEngine;
|
|
21
|
+
using UnityEngine.TestTools;
|
|
22
|
+
|
|
23
|
+
namespace com.AtelierAI.Unity.Copilot.Editor.Tests
|
|
24
|
+
{
|
|
25
|
+
/// <summary>
|
|
26
|
+
/// Tests to verify that blacklisted types are excluded from serialization.
|
|
27
|
+
/// </summary>
|
|
28
|
+
public class BlacklistTypeTests : BaseTest
|
|
29
|
+
{
|
|
30
|
+
[UnitySetUp]
|
|
31
|
+
public override IEnumerator SetUp() => base.SetUp();
|
|
32
|
+
|
|
33
|
+
[UnityTearDown]
|
|
34
|
+
public override IEnumerator TearDown() => base.TearDown();
|
|
35
|
+
|
|
36
|
+
/// <summary>
|
|
37
|
+
/// Creates a new Reflector configured similarly to UnityCopilotPluginEditor.CreateDefaultReflector()
|
|
38
|
+
/// but with custom blacklisted types for testing.
|
|
39
|
+
/// </summary>
|
|
40
|
+
private Reflector CreateTestReflector()
|
|
41
|
+
{
|
|
42
|
+
return UnityCopilotPluginEditor.Instance.CreateDefaultReflector();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
[UnityTest]
|
|
46
|
+
public IEnumerator Serialize_Component_WithBlacklistedType_Field_ShouldNotContainBlacklistedField()
|
|
47
|
+
{
|
|
48
|
+
// Arrange
|
|
49
|
+
var reflector = CreateTestReflector();
|
|
50
|
+
|
|
51
|
+
// Blacklist the test types
|
|
52
|
+
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
53
|
+
|
|
54
|
+
// Create a GameObject with the test component
|
|
55
|
+
var go = new GameObject("TestGameObject_Blacklist");
|
|
56
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
57
|
+
|
|
58
|
+
// Set values on the component
|
|
59
|
+
component.normalIntField = 42;
|
|
60
|
+
component.normalStringField = "Hello World";
|
|
61
|
+
component.normalVectorField = new Vector3(1, 2, 3);
|
|
62
|
+
component.blacklistedTypeField = new BlacklistedType { value = 100, name = "ShouldNotAppear" };
|
|
63
|
+
|
|
64
|
+
yield return null;
|
|
65
|
+
|
|
66
|
+
// Act
|
|
67
|
+
var serialized = reflector.Serialize(
|
|
68
|
+
component,
|
|
69
|
+
recursive: true,
|
|
70
|
+
logger: _logger);
|
|
71
|
+
|
|
72
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
73
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component:\n{json}");
|
|
74
|
+
|
|
75
|
+
// Assert
|
|
76
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
77
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
78
|
+
|
|
79
|
+
// Verify normal fields are present
|
|
80
|
+
var normalIntFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField));
|
|
81
|
+
var normalStringFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField));
|
|
82
|
+
var normalVectorFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalVectorField));
|
|
83
|
+
|
|
84
|
+
Assert.IsTrue(normalIntFieldExists, "Normal int field should be serialized.");
|
|
85
|
+
Assert.IsTrue(normalStringFieldExists, "Normal string field should be serialized.");
|
|
86
|
+
Assert.IsTrue(normalVectorFieldExists, "Normal vector field should be serialized.");
|
|
87
|
+
|
|
88
|
+
// Verify blacklisted field is NOT present
|
|
89
|
+
var blacklistedFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField));
|
|
90
|
+
Assert.IsFalse(blacklistedFieldExists, "Blacklisted type field should NOT be serialized.");
|
|
91
|
+
|
|
92
|
+
// Also verify the JSON string does not contain the blacklisted field name
|
|
93
|
+
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
94
|
+
Assert.IsFalse(json.Contains("ShouldNotAppear"), "JSON should not contain the value from blacklisted type.");
|
|
95
|
+
|
|
96
|
+
yield return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
[UnityTest]
|
|
100
|
+
public IEnumerator Serialize_Component_WithBlacklistedStruct_Field_ShouldNotContainBlacklistedField()
|
|
101
|
+
{
|
|
102
|
+
// Arrange
|
|
103
|
+
var reflector = CreateTestReflector();
|
|
104
|
+
|
|
105
|
+
// Blacklist the test struct type
|
|
106
|
+
reflector.Converters.BlacklistType(typeof(BlacklistedStruct));
|
|
107
|
+
|
|
108
|
+
// Create a GameObject with the test component
|
|
109
|
+
var go = new GameObject("TestGameObject_BlacklistStruct");
|
|
110
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
111
|
+
|
|
112
|
+
// Set values on the component
|
|
113
|
+
component.normalIntField = 123;
|
|
114
|
+
component.blacklistedStructField = new BlacklistedStruct { x = 10.5f, y = 20.5f };
|
|
115
|
+
|
|
116
|
+
yield return null;
|
|
117
|
+
|
|
118
|
+
// Act
|
|
119
|
+
var serialized = reflector.Serialize(
|
|
120
|
+
component,
|
|
121
|
+
recursive: true,
|
|
122
|
+
logger: _logger);
|
|
123
|
+
|
|
124
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
125
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component with struct:\n{json}");
|
|
126
|
+
|
|
127
|
+
// Assert
|
|
128
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
129
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
130
|
+
|
|
131
|
+
// Verify normal field is present
|
|
132
|
+
var normalIntFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField));
|
|
133
|
+
Assert.IsTrue(normalIntFieldExists, "Normal int field should be serialized.");
|
|
134
|
+
|
|
135
|
+
// Verify blacklisted struct field is NOT present
|
|
136
|
+
var blacklistedStructFieldExists = serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField));
|
|
137
|
+
Assert.IsFalse(blacklistedStructFieldExists, "Blacklisted struct field should NOT be serialized.");
|
|
138
|
+
|
|
139
|
+
// Also verify the JSON string does not contain the blacklisted field name
|
|
140
|
+
Assert.IsFalse(json.Contains("blacklistedStructField"), "JSON should not contain 'blacklistedStructField'.");
|
|
141
|
+
|
|
142
|
+
yield return null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
[UnityTest]
|
|
146
|
+
public IEnumerator Serialize_Component_WithMultipleBlacklistedTypes_ShouldNotContainAnyBlacklistedFields()
|
|
147
|
+
{
|
|
148
|
+
// Arrange
|
|
149
|
+
var reflector = CreateTestReflector();
|
|
150
|
+
|
|
151
|
+
// Blacklist both test types
|
|
152
|
+
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
153
|
+
reflector.Converters.BlacklistType(typeof(BlacklistedStruct));
|
|
154
|
+
|
|
155
|
+
// Create a GameObject with the test component
|
|
156
|
+
var go = new GameObject("TestGameObject_MultiBlacklist");
|
|
157
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
158
|
+
|
|
159
|
+
// Set values on the component
|
|
160
|
+
component.normalIntField = 999;
|
|
161
|
+
component.normalStringField = "This should appear";
|
|
162
|
+
component.normalVectorField = Vector3.one;
|
|
163
|
+
component.blacklistedTypeField = new BlacklistedType { value = 1, name = "Hidden1" };
|
|
164
|
+
component.blacklistedStructField = new BlacklistedStruct { x = 1, y = 2 };
|
|
165
|
+
|
|
166
|
+
yield return null;
|
|
167
|
+
|
|
168
|
+
// Act
|
|
169
|
+
var serialized = reflector.Serialize(
|
|
170
|
+
component,
|
|
171
|
+
recursive: true,
|
|
172
|
+
logger: _logger);
|
|
173
|
+
|
|
174
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
175
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component with multiple blacklisted types:\n{json}");
|
|
176
|
+
|
|
177
|
+
// Assert
|
|
178
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
179
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
180
|
+
|
|
181
|
+
// Verify normal fields are present
|
|
182
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
183
|
+
"Normal int field should be serialized.");
|
|
184
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField)),
|
|
185
|
+
"Normal string field should be serialized.");
|
|
186
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalVectorField)),
|
|
187
|
+
"Normal vector field should be serialized.");
|
|
188
|
+
|
|
189
|
+
// Verify blacklisted fields are NOT present
|
|
190
|
+
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
191
|
+
"Blacklisted type field should NOT be serialized.");
|
|
192
|
+
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField)),
|
|
193
|
+
"Blacklisted struct field should NOT be serialized.");
|
|
194
|
+
|
|
195
|
+
// Also verify the JSON string does not contain the blacklisted field names
|
|
196
|
+
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
197
|
+
Assert.IsFalse(json.Contains("blacklistedStructField"), "JSON should not contain 'blacklistedStructField'.");
|
|
198
|
+
Assert.IsFalse(json.Contains("Hidden1"), "JSON should not contain values from blacklisted types.");
|
|
199
|
+
|
|
200
|
+
yield return null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
[UnityTest]
|
|
204
|
+
public IEnumerator Serialize_Component_WithoutBlacklist_ShouldContainAllFields()
|
|
205
|
+
{
|
|
206
|
+
// Arrange
|
|
207
|
+
var reflector = CreateTestReflector();
|
|
208
|
+
// NOTE: We do NOT blacklist any types here
|
|
209
|
+
|
|
210
|
+
// Create a GameObject with the test component
|
|
211
|
+
var go = new GameObject("TestGameObject_NoBlacklist");
|
|
212
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
213
|
+
|
|
214
|
+
// Set values on the component
|
|
215
|
+
component.normalIntField = 42;
|
|
216
|
+
component.normalStringField = "Test";
|
|
217
|
+
component.blacklistedTypeField = new BlacklistedType { value = 100, name = "ShouldAppear" };
|
|
218
|
+
component.blacklistedStructField = new BlacklistedStruct { x = 5, y = 10 };
|
|
219
|
+
|
|
220
|
+
yield return null;
|
|
221
|
+
|
|
222
|
+
// Act
|
|
223
|
+
var serialized = reflector.Serialize(
|
|
224
|
+
component,
|
|
225
|
+
recursive: true,
|
|
226
|
+
logger: _logger);
|
|
227
|
+
|
|
228
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
229
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component without blacklist:\n{json}");
|
|
230
|
+
|
|
231
|
+
// Assert
|
|
232
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
233
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
234
|
+
|
|
235
|
+
// Verify ALL fields are present (since nothing is blacklisted)
|
|
236
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
237
|
+
"Normal int field should be serialized.");
|
|
238
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalStringField)),
|
|
239
|
+
"Normal string field should be serialized.");
|
|
240
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
241
|
+
"BlacklistedType field should be serialized when NOT blacklisted.");
|
|
242
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedStructField)),
|
|
243
|
+
"BlacklistedStruct field should be serialized when NOT blacklisted.");
|
|
244
|
+
|
|
245
|
+
yield return null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
[UnityTest]
|
|
249
|
+
public IEnumerator Serialize_Material_WithBlacklistedColor_ShouldNotContainColorMembers()
|
|
250
|
+
{
|
|
251
|
+
// Arrange
|
|
252
|
+
var reflector = CreateTestReflector();
|
|
253
|
+
|
|
254
|
+
// Blacklist the UnityEngine.Color type
|
|
255
|
+
reflector.Converters.BlacklistType(typeof(Color));
|
|
256
|
+
|
|
257
|
+
// Create a Material instance using executor (handles cleanup automatically)
|
|
258
|
+
var materialEx = new CreateMaterialExecutor("TestMaterial_BlacklistColor.mat", "Standard", "Assets", "Unity-Uco-Test", "BlacklistTypeTests");
|
|
259
|
+
|
|
260
|
+
// Validation executor
|
|
261
|
+
var validateEx = new LazyNodeExecutor();
|
|
262
|
+
validateEx.SetAction<object?>((input) =>
|
|
263
|
+
{
|
|
264
|
+
var material = materialEx.Asset;
|
|
265
|
+
Assert.IsNotNull(material, "Material should be created.");
|
|
266
|
+
|
|
267
|
+
// Set color on the material
|
|
268
|
+
material!.color = new Color(1f, 0.5f, 0.25f, 1f);
|
|
269
|
+
material.SetColor("_EmissionColor", new Color(0.1f, 0.2f, 0.3f, 1f));
|
|
270
|
+
|
|
271
|
+
// Act
|
|
272
|
+
var serialized = reflector.Serialize(
|
|
273
|
+
material,
|
|
274
|
+
recursive: true,
|
|
275
|
+
logger: _logger);
|
|
276
|
+
|
|
277
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
278
|
+
Debug.Log($"[BlacklistTypeTests] Serialized Material with blacklisted Color:\n{json}");
|
|
279
|
+
|
|
280
|
+
// Assert
|
|
281
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
282
|
+
|
|
283
|
+
// Helper function to recursively check all fields for Color type
|
|
284
|
+
void AssertNoColorFields(SerializedMember member, string path)
|
|
285
|
+
{
|
|
286
|
+
if (member.fields != null)
|
|
287
|
+
{
|
|
288
|
+
var colorTypeId = TypeUtils.GetTypeId<UnityEngine.Color>();
|
|
289
|
+
foreach (var field in member.fields)
|
|
290
|
+
{
|
|
291
|
+
// Check that no field is of Color type
|
|
292
|
+
var isColorType = field.typeName == colorTypeId;
|
|
293
|
+
Assert.IsFalse(isColorType,
|
|
294
|
+
$"Field '{path}.{field.name}' of type '{field.typeName}' should not be serialized when Color is blacklisted.");
|
|
295
|
+
|
|
296
|
+
// Recursively check nested fields
|
|
297
|
+
AssertNoColorFields(field, $"{path}.{field.name}");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Check all fields recursively
|
|
303
|
+
AssertNoColorFields(serialized, "root");
|
|
304
|
+
|
|
305
|
+
// Also check that the JSON does not contain UnityEngine.Color type references
|
|
306
|
+
Assert.IsFalse(json.Contains("UnityEngine.Color"),
|
|
307
|
+
"JSON should not contain 'UnityEngine.Color' type reference.");
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
materialEx.AddChild(validateEx);
|
|
311
|
+
materialEx.Execute();
|
|
312
|
+
|
|
313
|
+
yield return null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
[UnityTest]
|
|
317
|
+
public IEnumerator Serialize_Component_BlacklistByTypeName_ShouldNotContainBlacklistedField()
|
|
318
|
+
{
|
|
319
|
+
// Arrange
|
|
320
|
+
var reflector = CreateTestReflector();
|
|
321
|
+
|
|
322
|
+
// Blacklist using full type name string (similar to how TMPro types are blacklisted)
|
|
323
|
+
var fullTypeName = typeof(BlacklistedType).FullName!;
|
|
324
|
+
var type = com.IvanMurzak.ReflectorNet.Utils.TypeUtils.GetType(fullTypeName);
|
|
325
|
+
Assert.IsNotNull(type, $"Type '{fullTypeName}' should be resolvable.");
|
|
326
|
+
reflector.Converters.BlacklistType(type!);
|
|
327
|
+
|
|
328
|
+
// Create a GameObject with the test component
|
|
329
|
+
var go = new GameObject("TestGameObject_BlacklistByName");
|
|
330
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
331
|
+
|
|
332
|
+
// Set values on the component
|
|
333
|
+
component.normalIntField = 77;
|
|
334
|
+
component.blacklistedTypeField = new BlacklistedType { value = 200, name = "HiddenByName" };
|
|
335
|
+
|
|
336
|
+
yield return null;
|
|
337
|
+
|
|
338
|
+
// Act
|
|
339
|
+
var serialized = reflector.Serialize(
|
|
340
|
+
component,
|
|
341
|
+
recursive: true,
|
|
342
|
+
logger: _logger);
|
|
343
|
+
|
|
344
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
345
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component with type blacklisted by name:\n{json}");
|
|
346
|
+
|
|
347
|
+
// Assert
|
|
348
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
349
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
350
|
+
|
|
351
|
+
// Verify normal field is present
|
|
352
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
353
|
+
"Normal int field should be serialized.");
|
|
354
|
+
|
|
355
|
+
// Verify blacklisted field is NOT present
|
|
356
|
+
Assert.IsFalse(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.blacklistedTypeField)),
|
|
357
|
+
"Blacklisted type field should NOT be serialized when blacklisted by type name.");
|
|
358
|
+
|
|
359
|
+
// Also verify the JSON string does not contain the blacklisted field name
|
|
360
|
+
Assert.IsFalse(json.Contains("blacklistedTypeField"), "JSON should not contain 'blacklistedTypeField'.");
|
|
361
|
+
Assert.IsFalse(json.Contains("HiddenByName"), "JSON should not contain values from blacklisted types.");
|
|
362
|
+
|
|
363
|
+
yield return null;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
[UnityTest]
|
|
367
|
+
public IEnumerator Serialize_Component_WithBlacklistedType_Property_ShouldNotContainBlacklistedProperty()
|
|
368
|
+
{
|
|
369
|
+
// Arrange
|
|
370
|
+
var reflector = CreateTestReflector();
|
|
371
|
+
|
|
372
|
+
// Blacklist the test type
|
|
373
|
+
reflector.Converters.BlacklistType(typeof(BlacklistedType));
|
|
374
|
+
|
|
375
|
+
// Create a GameObject with the test component
|
|
376
|
+
var go = new GameObject("TestGameObject_BlacklistProperty");
|
|
377
|
+
var component = go.AddComponent<BlacklistTestScript>();
|
|
378
|
+
|
|
379
|
+
// Set values on the component
|
|
380
|
+
component.normalIntField = 55;
|
|
381
|
+
component.BlacklistedTypeProperty = new BlacklistedType { value = 300, name = "PropertyShouldNotAppear" };
|
|
382
|
+
|
|
383
|
+
yield return null;
|
|
384
|
+
|
|
385
|
+
// Act
|
|
386
|
+
var serialized = reflector.Serialize(
|
|
387
|
+
component,
|
|
388
|
+
recursive: true,
|
|
389
|
+
logger: _logger);
|
|
390
|
+
|
|
391
|
+
var json = serialized.ToJson(reflector) ?? string.Empty;
|
|
392
|
+
Debug.Log($"[BlacklistTypeTests] Serialized component with blacklisted property:\n{json}");
|
|
393
|
+
|
|
394
|
+
// Assert
|
|
395
|
+
Assert.IsNotNull(serialized, "Serialized result should not be null.");
|
|
396
|
+
Assert.IsNotNull(serialized.fields, "Serialized fields should not be null.");
|
|
397
|
+
|
|
398
|
+
// Verify normal field is present
|
|
399
|
+
Assert.IsTrue(serialized.fields.Any(f => f.name == nameof(BlacklistTestScript.normalIntField)),
|
|
400
|
+
"Normal int field should be serialized.");
|
|
401
|
+
|
|
402
|
+
// Verify blacklisted property is NOT present in props
|
|
403
|
+
if (serialized.props != null)
|
|
404
|
+
{
|
|
405
|
+
var blacklistedPropertyExists = serialized.props.Any(p => p.name == nameof(BlacklistTestScript.BlacklistedTypeProperty));
|
|
406
|
+
Assert.IsFalse(blacklistedPropertyExists, "Blacklisted type property should NOT be serialized.");
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Also verify the JSON string does not contain the blacklisted property name or value
|
|
410
|
+
Assert.IsFalse(json.Contains("BlacklistedTypeProperty"), "JSON should not contain 'BlacklistedTypeProperty'.");
|
|
411
|
+
Assert.IsFalse(json.Contains("PropertyShouldNotAppear"), "JSON should not contain the value from blacklisted type property.");
|
|
412
|
+
|
|
413
|
+
yield return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|