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