@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.
- package/CHANGELOG.md +11 -0
- package/package.json +1 -1
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetConfig.cs +132 -132
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDependencyResolver.cs +237 -237
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/DependencyResolver/NuGetDownloader.cs +82 -82
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/MenuItems.cs +247 -247
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Resource/ToolGroups.cs +153 -153
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/SystemTool/Skills.Create.SkillBody.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Console.GetLogs.cs +95 -95
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Docs.HttpFetcher.cs +139 -139
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Instance.ListAll.cs +72 -72
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/PathReadHelper.cs +106 -106
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Script.Validate.cs +252 -252
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests/TestResultCollector.cs +537 -537
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/API/Tool/Tests.cs +400 -400
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Branding/ProductInfo.cs +62 -62
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/CopilotServerManager.cs +1034 -1034
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Skills/Skill_InitialSetup.cs +197 -197
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.Editor.cs +201 -201
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Startup.cs +67 -67
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotListWindowBase.cs +393 -393
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/CopilotWindowBase.cs +113 -113
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.Connection.cs +3 -3
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotFeatures.cs +195 -195
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CopilotServer.cs +20 -20
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.CreateGUI.cs +354 -354
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowEditor.cs +78 -78
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/MainWindowInitializer.cs +47 -47
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UI/Window/SerializationCheckWindow.cs +190 -190
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Build.cs +91 -91
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Config.cs +298 -298
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.Static.cs +296 -296
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/UnityCopilotPluginEditor.cs +69 -69
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PackageUtils.cs +168 -168
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/PrefsKeyMigration.cs +119 -119
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/SafeDefaultsGuard.cs +180 -180
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ScriptUtils.cs +229 -229
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/ToolsManifestGenerator.cs +200 -200
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringAdapters.cs +1467 -1467
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityAuthoringSafetyReloadGuard.cs +65 -65
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/Scripts/Utils/UnityCopilotUpdateProjectSettings.cs +66 -66
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/ReflectorNet.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.Common.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Plugins/Uco.Framework.dll +0 -0
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Converter/Json/Structures/EntityIdConverter.cs +120 -120
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Data/GameObjectMetadata.pre-Unity.6.5.cs +110 -110
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Unity/Logs/FileLogStorage.cs +547 -547
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Build.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.Config.cs +3 -3
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPlugin.cs +295 -295
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginBuilder.cs +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.Static.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/UnityCopilotPluginRuntime.cs +59 -59
- package/vendor/plugin/com.atelierai.unity.copilot/Runtime/Utils/EnvironmentUtils.cs +11 -11
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/AtomicApiTestFixtures.cs +99 -99
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AtomicApi/TryModifyAtTests.cs +227 -227
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/AuthoringSafetyPilotTests.cs +1050 -1050
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +1 -1
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/BlacklistTypeTests.cs +416 -416
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.cs +172 -172
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataFieldScriptableObjectPopulationTests.pre-Unity.6.5.cs +169 -169
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.cs +182 -182
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPopulationTests.pre-Unity.6.5.cs +179 -179
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.cs +175 -175
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyPopulationTests.pre-Unity.6.5.cs +174 -174
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.cs +171 -171
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ReflectionConverter/DataPropertyScriptableObjectPopulationTests.pre-Unity.6.5.cs +170 -170
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsCreateFolderTests.cs +243 -243
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsMaterialTests.cs +101 -101
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsPrefabCreateTests.pre-Unity.6.5.cs +348 -348
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Assets/AssetsShaderTests.cs +194 -194
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.cs +573 -573
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/PathBasedToolTests.pre-Unity.6.5.cs +513 -513
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotCameraTests.pre-Unity.6.5.cs +154 -154
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotGameViewTests.cs +164 -164
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/Screenshot/ScreenshotSceneViewTests.cs +155 -155
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolParameterTests.cs +56 -56
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Tool/ToolThreadSafetyTests.pre-Unity.6.5.cs +651 -651
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/ToolBatchExecutionIntegrationTests.cs +407 -407
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs → UcoPluginTests.cs} +105 -105
- package/vendor/plugin/com.atelierai.unity.copilot/package.json +1 -1
- /package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/{McpPluginTests.cs.meta → UcoPluginTests.cs.meta} +0 -0
|
@@ -1,243 +1,243 @@
|
|
|
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 com.AtelierAI.Unity.Copilot.Editor.API;
|
|
14
|
-
using com.AtelierAI.Unity.Copilot.Editor.Tests.Utils;
|
|
15
|
-
using NUnit.Framework;
|
|
16
|
-
using UnityEditor;
|
|
17
|
-
using UnityEngine.TestTools;
|
|
18
|
-
|
|
19
|
-
namespace com.AtelierAI.Unity.Copilot.Editor.Tests
|
|
20
|
-
{
|
|
21
|
-
public class AssetsCreateFolderTests : BaseTest
|
|
22
|
-
{
|
|
23
|
-
const string TestFolderName = "Unity-
|
|
24
|
-
|
|
25
|
-
[UnityTest]
|
|
26
|
-
public IEnumerator CreateFolder_ValidParentFolder_Succeeds()
|
|
27
|
-
{
|
|
28
|
-
new CreateFolderExecutor("Assets", TestFolderName)
|
|
29
|
-
.AddChild(new CallToolExecutor(
|
|
30
|
-
Tool_Assets.AssetsCreateFolderToolId,
|
|
31
|
-
$@"{{
|
|
32
|
-
""inputs"": [{{
|
|
33
|
-
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
34
|
-
""newFolderName"": ""ValidChild""
|
|
35
|
-
}}]
|
|
36
|
-
}}"))
|
|
37
|
-
.AddChild(new ValidateToolResultExecutor())
|
|
38
|
-
.AddChild(() =>
|
|
39
|
-
{
|
|
40
|
-
Assert.IsTrue(AssetDatabase.IsValidFolder($"Assets/{TestFolderName}/ValidChild"),
|
|
41
|
-
$"Folder should exist at Assets/{TestFolderName}/ValidChild");
|
|
42
|
-
})
|
|
43
|
-
.Execute();
|
|
44
|
-
yield return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
[UnityTest]
|
|
48
|
-
public IEnumerator CreateFolder_InvalidParent_NonExistentPath_ReturnsError()
|
|
49
|
-
{
|
|
50
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
51
|
-
""inputs"": [{
|
|
52
|
-
""parentFolderPath"": ""Assets/NonExistentFolder12345"",
|
|
53
|
-
""newFolderName"": ""TestFolder""
|
|
54
|
-
}]
|
|
55
|
-
}");
|
|
56
|
-
|
|
57
|
-
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
58
|
-
StringAssert.Contains("Assets/NonExistentFolder12345", jsonResult);
|
|
59
|
-
yield return null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
[UnityTest]
|
|
63
|
-
public IEnumerator CreateFolder_InvalidParent_NotStartingWithAssets_ReturnsError()
|
|
64
|
-
{
|
|
65
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
66
|
-
""inputs"": [{
|
|
67
|
-
""parentFolderPath"": ""SomeRandomPath"",
|
|
68
|
-
""newFolderName"": ""TestFolder""
|
|
69
|
-
}]
|
|
70
|
-
}");
|
|
71
|
-
|
|
72
|
-
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
73
|
-
StringAssert.Contains("SomeRandomPath", jsonResult);
|
|
74
|
-
yield return null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
[UnityTest]
|
|
78
|
-
public IEnumerator CreateFolder_InvalidParent_EmptyPath_ReturnsError()
|
|
79
|
-
{
|
|
80
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
81
|
-
""inputs"": [{
|
|
82
|
-
""parentFolderPath"": """",
|
|
83
|
-
""newFolderName"": ""TestFolder""
|
|
84
|
-
}]
|
|
85
|
-
}");
|
|
86
|
-
|
|
87
|
-
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
88
|
-
yield return null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
[UnityTest]
|
|
92
|
-
public IEnumerator CreateFolder_MixedInputs_ValidAndInvalid_PartialSuccess()
|
|
93
|
-
{
|
|
94
|
-
new CreateFolderExecutor("Assets", TestFolderName)
|
|
95
|
-
.AddChild(() =>
|
|
96
|
-
{
|
|
97
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, $@"{{
|
|
98
|
-
""inputs"": [
|
|
99
|
-
{{
|
|
100
|
-
""parentFolderPath"": ""Assets/NonExistentFolder12345"",
|
|
101
|
-
""newFolderName"": ""ShouldFail""
|
|
102
|
-
}},
|
|
103
|
-
{{
|
|
104
|
-
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
105
|
-
""newFolderName"": ""Mixed""
|
|
106
|
-
}}
|
|
107
|
-
]
|
|
108
|
-
}}");
|
|
109
|
-
|
|
110
|
-
// Should contain error for the invalid path
|
|
111
|
-
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
112
|
-
StringAssert.Contains("Assets/NonExistentFolder12345", jsonResult);
|
|
113
|
-
|
|
114
|
-
// Valid folder should still be created
|
|
115
|
-
Assert.IsTrue(AssetDatabase.IsValidFolder($"Assets/{TestFolderName}/Mixed"),
|
|
116
|
-
$"Valid folder should still be created at Assets/{TestFolderName}/Mixed");
|
|
117
|
-
})
|
|
118
|
-
.Execute();
|
|
119
|
-
yield return null;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
[UnityTest]
|
|
123
|
-
public IEnumerator CreateFolder_DuplicateName_ReturnsError()
|
|
124
|
-
{
|
|
125
|
-
var dupFolderPath = $"Assets/{TestFolderName}/Dup";
|
|
126
|
-
|
|
127
|
-
new CreateFolderExecutor("Assets", TestFolderName)
|
|
128
|
-
.AddChild(new CallToolExecutor(
|
|
129
|
-
Tool_Assets.AssetsCreateFolderToolId,
|
|
130
|
-
$@"{{
|
|
131
|
-
""inputs"": [{{
|
|
132
|
-
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
133
|
-
""newFolderName"": ""Dup""
|
|
134
|
-
}}]
|
|
135
|
-
}}"))
|
|
136
|
-
.AddChild(new ValidateToolResultExecutor())
|
|
137
|
-
.AddChild(() =>
|
|
138
|
-
{
|
|
139
|
-
Assert.IsTrue(AssetDatabase.IsValidFolder(dupFolderPath),
|
|
140
|
-
$"Folder should exist at {dupFolderPath}");
|
|
141
|
-
|
|
142
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, $@"{{
|
|
143
|
-
""inputs"": [{{
|
|
144
|
-
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
145
|
-
""newFolderName"": ""Dup""
|
|
146
|
-
}}]
|
|
147
|
-
}}");
|
|
148
|
-
|
|
149
|
-
StringAssert.Contains("a folder with the same name already exists", jsonResult);
|
|
150
|
-
StringAssert.Contains(dupFolderPath, jsonResult);
|
|
151
|
-
|
|
152
|
-
Assert.IsTrue(AssetDatabase.IsValidFolder(dupFolderPath),
|
|
153
|
-
$"Original folder should still exist at {dupFolderPath}");
|
|
154
|
-
})
|
|
155
|
-
.Execute();
|
|
156
|
-
yield return null;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
[UnityTest]
|
|
160
|
-
public IEnumerator CreateFolder_EmptyFolderName_ReturnsError()
|
|
161
|
-
{
|
|
162
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
163
|
-
""inputs"": [{
|
|
164
|
-
""parentFolderPath"": ""Assets"",
|
|
165
|
-
""newFolderName"": """"
|
|
166
|
-
}]
|
|
167
|
-
}");
|
|
168
|
-
|
|
169
|
-
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
170
|
-
yield return null;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
[UnityTest]
|
|
174
|
-
public IEnumerator CreateFolder_WhitespaceFolderName_ReturnsError()
|
|
175
|
-
{
|
|
176
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
177
|
-
""inputs"": [{
|
|
178
|
-
""parentFolderPath"": ""Assets"",
|
|
179
|
-
""newFolderName"": "" ""
|
|
180
|
-
}]
|
|
181
|
-
}");
|
|
182
|
-
|
|
183
|
-
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
184
|
-
yield return null;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
[UnityTest]
|
|
188
|
-
public IEnumerator CreateFolder_NullFolderName_ReturnsError()
|
|
189
|
-
{
|
|
190
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
191
|
-
""inputs"": [{
|
|
192
|
-
""parentFolderPath"": ""Assets"",
|
|
193
|
-
""newFolderName"": null
|
|
194
|
-
}]
|
|
195
|
-
}");
|
|
196
|
-
|
|
197
|
-
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
198
|
-
yield return null;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
[UnityTest]
|
|
202
|
-
public IEnumerator CreateFolder_FolderNameWithForwardSlash_ReturnsError()
|
|
203
|
-
{
|
|
204
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
205
|
-
""inputs"": [{
|
|
206
|
-
""parentFolderPath"": ""Assets"",
|
|
207
|
-
""newFolderName"": ""Invalid/Name""
|
|
208
|
-
}]
|
|
209
|
-
}");
|
|
210
|
-
|
|
211
|
-
StringAssert.Contains("contains invalid character", jsonResult);
|
|
212
|
-
yield return null;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
[UnityTest]
|
|
216
|
-
public IEnumerator CreateFolder_FolderNameWithBackslash_ReturnsError()
|
|
217
|
-
{
|
|
218
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
219
|
-
""inputs"": [{
|
|
220
|
-
""parentFolderPath"": ""Assets"",
|
|
221
|
-
""newFolderName"": ""Invalid\\Name""
|
|
222
|
-
}]
|
|
223
|
-
}");
|
|
224
|
-
|
|
225
|
-
StringAssert.Contains("contains invalid character", jsonResult);
|
|
226
|
-
yield return null;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
[UnityTest]
|
|
230
|
-
public IEnumerator CreateFolder_FolderNameWithSpecialCharacters_ReturnsError()
|
|
231
|
-
{
|
|
232
|
-
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
233
|
-
""inputs"": [{
|
|
234
|
-
""parentFolderPath"": ""Assets"",
|
|
235
|
-
""newFolderName"": ""Invalid<Name>""
|
|
236
|
-
}]
|
|
237
|
-
}");
|
|
238
|
-
|
|
239
|
-
StringAssert.Contains("contains invalid character", jsonResult);
|
|
240
|
-
yield return null;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
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 com.AtelierAI.Unity.Copilot.Editor.API;
|
|
14
|
+
using com.AtelierAI.Unity.Copilot.Editor.Tests.Utils;
|
|
15
|
+
using NUnit.Framework;
|
|
16
|
+
using UnityEditor;
|
|
17
|
+
using UnityEngine.TestTools;
|
|
18
|
+
|
|
19
|
+
namespace com.AtelierAI.Unity.Copilot.Editor.Tests
|
|
20
|
+
{
|
|
21
|
+
public class AssetsCreateFolderTests : BaseTest
|
|
22
|
+
{
|
|
23
|
+
const string TestFolderName = "Unity-Uco-Test-CreateFolder";
|
|
24
|
+
|
|
25
|
+
[UnityTest]
|
|
26
|
+
public IEnumerator CreateFolder_ValidParentFolder_Succeeds()
|
|
27
|
+
{
|
|
28
|
+
new CreateFolderExecutor("Assets", TestFolderName)
|
|
29
|
+
.AddChild(new CallToolExecutor(
|
|
30
|
+
Tool_Assets.AssetsCreateFolderToolId,
|
|
31
|
+
$@"{{
|
|
32
|
+
""inputs"": [{{
|
|
33
|
+
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
34
|
+
""newFolderName"": ""ValidChild""
|
|
35
|
+
}}]
|
|
36
|
+
}}"))
|
|
37
|
+
.AddChild(new ValidateToolResultExecutor())
|
|
38
|
+
.AddChild(() =>
|
|
39
|
+
{
|
|
40
|
+
Assert.IsTrue(AssetDatabase.IsValidFolder($"Assets/{TestFolderName}/ValidChild"),
|
|
41
|
+
$"Folder should exist at Assets/{TestFolderName}/ValidChild");
|
|
42
|
+
})
|
|
43
|
+
.Execute();
|
|
44
|
+
yield return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
[UnityTest]
|
|
48
|
+
public IEnumerator CreateFolder_InvalidParent_NonExistentPath_ReturnsError()
|
|
49
|
+
{
|
|
50
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
51
|
+
""inputs"": [{
|
|
52
|
+
""parentFolderPath"": ""Assets/NonExistentFolder12345"",
|
|
53
|
+
""newFolderName"": ""TestFolder""
|
|
54
|
+
}]
|
|
55
|
+
}");
|
|
56
|
+
|
|
57
|
+
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
58
|
+
StringAssert.Contains("Assets/NonExistentFolder12345", jsonResult);
|
|
59
|
+
yield return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
[UnityTest]
|
|
63
|
+
public IEnumerator CreateFolder_InvalidParent_NotStartingWithAssets_ReturnsError()
|
|
64
|
+
{
|
|
65
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
66
|
+
""inputs"": [{
|
|
67
|
+
""parentFolderPath"": ""SomeRandomPath"",
|
|
68
|
+
""newFolderName"": ""TestFolder""
|
|
69
|
+
}]
|
|
70
|
+
}");
|
|
71
|
+
|
|
72
|
+
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
73
|
+
StringAssert.Contains("SomeRandomPath", jsonResult);
|
|
74
|
+
yield return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
[UnityTest]
|
|
78
|
+
public IEnumerator CreateFolder_InvalidParent_EmptyPath_ReturnsError()
|
|
79
|
+
{
|
|
80
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
81
|
+
""inputs"": [{
|
|
82
|
+
""parentFolderPath"": """",
|
|
83
|
+
""newFolderName"": ""TestFolder""
|
|
84
|
+
}]
|
|
85
|
+
}");
|
|
86
|
+
|
|
87
|
+
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
88
|
+
yield return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[UnityTest]
|
|
92
|
+
public IEnumerator CreateFolder_MixedInputs_ValidAndInvalid_PartialSuccess()
|
|
93
|
+
{
|
|
94
|
+
new CreateFolderExecutor("Assets", TestFolderName)
|
|
95
|
+
.AddChild(() =>
|
|
96
|
+
{
|
|
97
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, $@"{{
|
|
98
|
+
""inputs"": [
|
|
99
|
+
{{
|
|
100
|
+
""parentFolderPath"": ""Assets/NonExistentFolder12345"",
|
|
101
|
+
""newFolderName"": ""ShouldFail""
|
|
102
|
+
}},
|
|
103
|
+
{{
|
|
104
|
+
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
105
|
+
""newFolderName"": ""Mixed""
|
|
106
|
+
}}
|
|
107
|
+
]
|
|
108
|
+
}}");
|
|
109
|
+
|
|
110
|
+
// Should contain error for the invalid path
|
|
111
|
+
StringAssert.Contains("invalid parent folder path", jsonResult);
|
|
112
|
+
StringAssert.Contains("Assets/NonExistentFolder12345", jsonResult);
|
|
113
|
+
|
|
114
|
+
// Valid folder should still be created
|
|
115
|
+
Assert.IsTrue(AssetDatabase.IsValidFolder($"Assets/{TestFolderName}/Mixed"),
|
|
116
|
+
$"Valid folder should still be created at Assets/{TestFolderName}/Mixed");
|
|
117
|
+
})
|
|
118
|
+
.Execute();
|
|
119
|
+
yield return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
[UnityTest]
|
|
123
|
+
public IEnumerator CreateFolder_DuplicateName_ReturnsError()
|
|
124
|
+
{
|
|
125
|
+
var dupFolderPath = $"Assets/{TestFolderName}/Dup";
|
|
126
|
+
|
|
127
|
+
new CreateFolderExecutor("Assets", TestFolderName)
|
|
128
|
+
.AddChild(new CallToolExecutor(
|
|
129
|
+
Tool_Assets.AssetsCreateFolderToolId,
|
|
130
|
+
$@"{{
|
|
131
|
+
""inputs"": [{{
|
|
132
|
+
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
133
|
+
""newFolderName"": ""Dup""
|
|
134
|
+
}}]
|
|
135
|
+
}}"))
|
|
136
|
+
.AddChild(new ValidateToolResultExecutor())
|
|
137
|
+
.AddChild(() =>
|
|
138
|
+
{
|
|
139
|
+
Assert.IsTrue(AssetDatabase.IsValidFolder(dupFolderPath),
|
|
140
|
+
$"Folder should exist at {dupFolderPath}");
|
|
141
|
+
|
|
142
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, $@"{{
|
|
143
|
+
""inputs"": [{{
|
|
144
|
+
""parentFolderPath"": ""Assets/{TestFolderName}"",
|
|
145
|
+
""newFolderName"": ""Dup""
|
|
146
|
+
}}]
|
|
147
|
+
}}");
|
|
148
|
+
|
|
149
|
+
StringAssert.Contains("a folder with the same name already exists", jsonResult);
|
|
150
|
+
StringAssert.Contains(dupFolderPath, jsonResult);
|
|
151
|
+
|
|
152
|
+
Assert.IsTrue(AssetDatabase.IsValidFolder(dupFolderPath),
|
|
153
|
+
$"Original folder should still exist at {dupFolderPath}");
|
|
154
|
+
})
|
|
155
|
+
.Execute();
|
|
156
|
+
yield return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
[UnityTest]
|
|
160
|
+
public IEnumerator CreateFolder_EmptyFolderName_ReturnsError()
|
|
161
|
+
{
|
|
162
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
163
|
+
""inputs"": [{
|
|
164
|
+
""parentFolderPath"": ""Assets"",
|
|
165
|
+
""newFolderName"": """"
|
|
166
|
+
}]
|
|
167
|
+
}");
|
|
168
|
+
|
|
169
|
+
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
170
|
+
yield return null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
[UnityTest]
|
|
174
|
+
public IEnumerator CreateFolder_WhitespaceFolderName_ReturnsError()
|
|
175
|
+
{
|
|
176
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
177
|
+
""inputs"": [{
|
|
178
|
+
""parentFolderPath"": ""Assets"",
|
|
179
|
+
""newFolderName"": "" ""
|
|
180
|
+
}]
|
|
181
|
+
}");
|
|
182
|
+
|
|
183
|
+
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
184
|
+
yield return null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
[UnityTest]
|
|
188
|
+
public IEnumerator CreateFolder_NullFolderName_ReturnsError()
|
|
189
|
+
{
|
|
190
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
191
|
+
""inputs"": [{
|
|
192
|
+
""parentFolderPath"": ""Assets"",
|
|
193
|
+
""newFolderName"": null
|
|
194
|
+
}]
|
|
195
|
+
}");
|
|
196
|
+
|
|
197
|
+
StringAssert.Contains("folder name is empty or whitespace", jsonResult);
|
|
198
|
+
yield return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
[UnityTest]
|
|
202
|
+
public IEnumerator CreateFolder_FolderNameWithForwardSlash_ReturnsError()
|
|
203
|
+
{
|
|
204
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
205
|
+
""inputs"": [{
|
|
206
|
+
""parentFolderPath"": ""Assets"",
|
|
207
|
+
""newFolderName"": ""Invalid/Name""
|
|
208
|
+
}]
|
|
209
|
+
}");
|
|
210
|
+
|
|
211
|
+
StringAssert.Contains("contains invalid character", jsonResult);
|
|
212
|
+
yield return null;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
[UnityTest]
|
|
216
|
+
public IEnumerator CreateFolder_FolderNameWithBackslash_ReturnsError()
|
|
217
|
+
{
|
|
218
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
219
|
+
""inputs"": [{
|
|
220
|
+
""parentFolderPath"": ""Assets"",
|
|
221
|
+
""newFolderName"": ""Invalid\\Name""
|
|
222
|
+
}]
|
|
223
|
+
}");
|
|
224
|
+
|
|
225
|
+
StringAssert.Contains("contains invalid character", jsonResult);
|
|
226
|
+
yield return null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
[UnityTest]
|
|
230
|
+
public IEnumerator CreateFolder_FolderNameWithSpecialCharacters_ReturnsError()
|
|
231
|
+
{
|
|
232
|
+
var jsonResult = RunToolRaw(Tool_Assets.AssetsCreateFolderToolId, @"{
|
|
233
|
+
""inputs"": [{
|
|
234
|
+
""parentFolderPath"": ""Assets"",
|
|
235
|
+
""newFolderName"": ""Invalid<Name>""
|
|
236
|
+
}]
|
|
237
|
+
}");
|
|
238
|
+
|
|
239
|
+
StringAssert.Contains("contains invalid character", jsonResult);
|
|
240
|
+
yield return null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|