@atelierai/uco 1.0.7 → 1.0.9

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.
Files changed (107) hide show
  1. package/CHANGELOG.md +29 -8
  2. package/package.json +2 -2
  3. package/vendor/plugin/com.atelierai.unity.copilot/CHANGELOG.md +4 -4
  4. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
  5. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
  6. package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
  7. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
  8. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
  9. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
  10. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
  11. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
  12. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
  13. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
  14. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
  15. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
  16. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
  17. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/ToolGroups.SetEnabled.cs +92 -92
  18. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
  19. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +887 -1034
  20. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
  21. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
  22. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
  23. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
  24. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
  25. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
  26. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
  27. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +22 -22
  28. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
  29. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
  30. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
  31. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
  32. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
  33. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
  34. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
  35. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
  36. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
  37. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
  38. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
  39. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
  40. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolGroupRegistry.cs +461 -460
  41. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
  42. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
  43. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
  44. package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
  45. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotPromptsWindow.uss +11 -11
  46. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotResourcesWindow.uss +16 -16
  47. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotToolsWindow.uss +36 -36
  48. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/MainWindow.uss +183 -183
  49. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss → _copilot-list-window.uss} +18 -18
  50. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/_list-view.uss +77 -77
  51. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotPromptsWindow.uxml +18 -18
  52. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotResourcesWindow.uxml +18 -18
  53. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotToolsWindow.uxml +18 -18
  54. package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/MainWindow.uxml +115 -115
  55. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
  56. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
  57. package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
  58. package/vendor/plugin/com.atelierai.unity.copilot/README.md +88 -88
  59. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
  60. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
  61. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
  62. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
  63. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
  64. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +3 -3
  65. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
  66. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
  67. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
  68. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
  69. package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +11 -11
  70. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
  71. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
  72. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
  73. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorDevelopmentDependencyTests.cs +148 -148
  74. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorFlatLayoutTests.cs +166 -166
  75. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetInstallManifestTests.cs +436 -436
  76. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
  77. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetPackageInstallerStaleVersionCleanupTests.cs +200 -200
  78. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +2 -2
  79. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
  80. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
  81. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
  82. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
  83. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
  84. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
  85. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
  86. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
  87. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
  88. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
  89. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
  90. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
  91. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
  92. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
  93. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/GameObject/TestJsonSchema.cs +199 -199
  94. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
  95. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
  96. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
  97. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
  98. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
  99. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
  100. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
  101. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
  102. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
  103. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
  104. package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
  105. package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
  106. /package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss.meta → _copilot-list-window.uss.meta} +0 -0
  107. /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-MCP-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
- }
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
+ }