@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,164 +1,164 @@
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.Text.RegularExpressions;
13
- using com.AtelierAI.Uco.Framework.Common.Model;
14
- using com.AtelierAI.Unity.Copilot.Editor.API;
15
- using NUnit.Framework;
16
- using UnityEditor;
17
- using UnityEngine;
18
- using UnityEngine.TestTools;
19
-
20
- namespace com.AtelierAI.Unity.Copilot.Editor.Tests
21
- {
22
- public class ScreenshotGameViewTests : BaseTest
23
- {
24
- // -----------------------------------------------------------------------
25
- // Setup — ensure Game View window is open and focused before each test
26
- // -----------------------------------------------------------------------
27
-
28
- [SetUp]
29
- public void EnsureGameViewOpen()
30
- {
31
- var gameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor");
32
- if (gameViewType == null)
33
- return;
34
-
35
- var gameView = EditorWindow.GetWindow(gameViewType, false, "Game", true);
36
- gameView.Show();
37
- gameView.Focus();
38
- gameView.Repaint();
39
- }
40
-
41
- // -----------------------------------------------------------------------
42
- // Helpers — mirror the exact checks the tool performs internally
43
- // -----------------------------------------------------------------------
44
-
45
- private static bool GameViewTypeAvailable =>
46
- System.Type.GetType("UnityEditor.GameView,UnityEditor") != null;
47
-
48
- private static void CloseGameView()
49
- {
50
- var gameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor");
51
- if (gameViewType == null) return;
52
-
53
- var windows = Resources.FindObjectsOfTypeAll(gameViewType);
54
- foreach (var window in windows)
55
- {
56
- if (window is EditorWindow editorWindow)
57
- editorWindow.Close();
58
- }
59
- }
60
-
61
- // -----------------------------------------------------------------------
62
- // Safety — the tool must never throw
63
- // -----------------------------------------------------------------------
64
-
65
- [Test]
66
- public void ScreenshotGameView_DoesNotThrow()
67
- {
68
- Assert.DoesNotThrow(() =>
69
- {
70
- var result = new Tool_Screenshot().ScreenshotGameView();
71
- Assert.IsNotNull(result);
72
- });
73
- }
74
-
75
- // -----------------------------------------------------------------------
76
- // Always-runs: result is either a success or one of the known error messages
77
- // -----------------------------------------------------------------------
78
-
79
- [Test]
80
- public void ScreenshotGameView_ReturnsKnownResponseType()
81
- {
82
- var result = new Tool_Screenshot().ScreenshotGameView();
83
-
84
- Assert.IsNotNull(result, "Result must never be null");
85
- Assert.AreNotEqual(ResponseStatus.Error, result.Status,
86
- "Should return a non-error response when the Game View is open and focused");
87
- }
88
-
89
- // -----------------------------------------------------------------------
90
- // GameView type must always be resolvable inside the Unity Editor
91
- // -----------------------------------------------------------------------
92
-
93
- [Test]
94
- public void ScreenshotGameView_GameViewTypeFound_InEditorContext()
95
- {
96
- // UnityEditor.GameView is always present when running inside the Editor.
97
- Assert.IsTrue(GameViewTypeAvailable,
98
- "UnityEditor.GameView type must be resolvable in an Editor test context");
99
- }
100
-
101
- // -----------------------------------------------------------------------
102
- // Happy path — Game View is open and ready
103
- // -----------------------------------------------------------------------
104
-
105
- [Test]
106
- public void ScreenshotGameView_WhenGameViewReady_ReturnsImage()
107
- {
108
- var result = new Tool_Screenshot().ScreenshotGameView();
109
-
110
- Assert.IsNotNull(result);
111
- Assert.AreNotEqual(ResponseStatus.Error, result.Status,
112
- "Should return a non-error response when the Game View render texture is available");
113
- }
114
-
115
- // -----------------------------------------------------------------------
116
- // Error path — render texture unavailable (Game View closed)
117
- // -----------------------------------------------------------------------
118
-
119
- [Test]
120
- public void ScreenshotGameView_WhenRenderTextureNotReady_ReturnsSpecificError()
121
- {
122
- CloseGameView();
123
-
124
- var result = new Tool_Screenshot().ScreenshotGameView();
125
-
126
- Assert.IsNotNull(result);
127
- Assert.AreEqual(ResponseStatus.Error, result.Status,
128
- "Should return an error when the render texture is not available");
129
- }
130
-
131
- // -----------------------------------------------------------------------
132
- // Full MCP framework path
133
- // -----------------------------------------------------------------------
134
-
135
- [Test]
136
- public void ScreenshotGameView_ViaRunTool_WhenGameViewReady_Succeeds()
137
- {
138
- // Method takes no parameters; an empty JSON object is the correct input.
139
- RunTool("screenshot-game-view", "{}");
140
- }
141
-
142
- [Test]
143
- public void ScreenshotGameView_ViaRunTool_WhenRenderTextureNotReady_ReturnsErrorJson()
144
- {
145
- CloseGameView();
146
-
147
- LogAssert.ignoreFailingMessages = true;
148
- try
149
- {
150
- var raw = RunToolRaw("screenshot-game-view", "{}");
151
-
152
- Assert.IsNotNull(raw, "Raw result must not be null");
153
- Assert.IsTrue(
154
- raw.Contains("No Game View window") ||
155
- raw.Contains("Game View render texture is not available"),
156
- $"Expected a known error message. Actual JSON:\n{raw}");
157
- }
158
- finally
159
- {
160
- LogAssert.ignoreFailingMessages = false;
161
- }
162
- }
163
- }
164
- }
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.Text.RegularExpressions;
13
+ using com.AtelierAI.Uco.Framework.Common.Model;
14
+ using com.AtelierAI.Unity.Copilot.Editor.API;
15
+ using NUnit.Framework;
16
+ using UnityEditor;
17
+ using UnityEngine;
18
+ using UnityEngine.TestTools;
19
+
20
+ namespace com.AtelierAI.Unity.Copilot.Editor.Tests
21
+ {
22
+ public class ScreenshotGameViewTests : BaseTest
23
+ {
24
+ // -----------------------------------------------------------------------
25
+ // Setup — ensure Game View window is open and focused before each test
26
+ // -----------------------------------------------------------------------
27
+
28
+ [SetUp]
29
+ public void EnsureGameViewOpen()
30
+ {
31
+ var gameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor");
32
+ if (gameViewType == null)
33
+ return;
34
+
35
+ var gameView = EditorWindow.GetWindow(gameViewType, false, "Game", true);
36
+ gameView.Show();
37
+ gameView.Focus();
38
+ gameView.Repaint();
39
+ }
40
+
41
+ // -----------------------------------------------------------------------
42
+ // Helpers — mirror the exact checks the tool performs internally
43
+ // -----------------------------------------------------------------------
44
+
45
+ private static bool GameViewTypeAvailable =>
46
+ System.Type.GetType("UnityEditor.GameView,UnityEditor") != null;
47
+
48
+ private static void CloseGameView()
49
+ {
50
+ var gameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor");
51
+ if (gameViewType == null) return;
52
+
53
+ var windows = Resources.FindObjectsOfTypeAll(gameViewType);
54
+ foreach (var window in windows)
55
+ {
56
+ if (window is EditorWindow editorWindow)
57
+ editorWindow.Close();
58
+ }
59
+ }
60
+
61
+ // -----------------------------------------------------------------------
62
+ // Safety — the tool must never throw
63
+ // -----------------------------------------------------------------------
64
+
65
+ [Test]
66
+ public void ScreenshotGameView_DoesNotThrow()
67
+ {
68
+ Assert.DoesNotThrow(() =>
69
+ {
70
+ var result = new Tool_Screenshot().ScreenshotGameView();
71
+ Assert.IsNotNull(result);
72
+ });
73
+ }
74
+
75
+ // -----------------------------------------------------------------------
76
+ // Always-runs: result is either a success or one of the known error messages
77
+ // -----------------------------------------------------------------------
78
+
79
+ [Test]
80
+ public void ScreenshotGameView_ReturnsKnownResponseType()
81
+ {
82
+ var result = new Tool_Screenshot().ScreenshotGameView();
83
+
84
+ Assert.IsNotNull(result, "Result must never be null");
85
+ Assert.AreNotEqual(ResponseStatus.Error, result.Status,
86
+ "Should return a non-error response when the Game View is open and focused");
87
+ }
88
+
89
+ // -----------------------------------------------------------------------
90
+ // GameView type must always be resolvable inside the Unity Editor
91
+ // -----------------------------------------------------------------------
92
+
93
+ [Test]
94
+ public void ScreenshotGameView_GameViewTypeFound_InEditorContext()
95
+ {
96
+ // UnityEditor.GameView is always present when running inside the Editor.
97
+ Assert.IsTrue(GameViewTypeAvailable,
98
+ "UnityEditor.GameView type must be resolvable in an Editor test context");
99
+ }
100
+
101
+ // -----------------------------------------------------------------------
102
+ // Happy path — Game View is open and ready
103
+ // -----------------------------------------------------------------------
104
+
105
+ [Test]
106
+ public void ScreenshotGameView_WhenGameViewReady_ReturnsImage()
107
+ {
108
+ var result = new Tool_Screenshot().ScreenshotGameView();
109
+
110
+ Assert.IsNotNull(result);
111
+ Assert.AreNotEqual(ResponseStatus.Error, result.Status,
112
+ "Should return a non-error response when the Game View render texture is available");
113
+ }
114
+
115
+ // -----------------------------------------------------------------------
116
+ // Error path — render texture unavailable (Game View closed)
117
+ // -----------------------------------------------------------------------
118
+
119
+ [Test]
120
+ public void ScreenshotGameView_WhenRenderTextureNotReady_ReturnsSpecificError()
121
+ {
122
+ CloseGameView();
123
+
124
+ var result = new Tool_Screenshot().ScreenshotGameView();
125
+
126
+ Assert.IsNotNull(result);
127
+ Assert.AreEqual(ResponseStatus.Error, result.Status,
128
+ "Should return an error when the render texture is not available");
129
+ }
130
+
131
+ // -----------------------------------------------------------------------
132
+ // Full Uco framework path
133
+ // -----------------------------------------------------------------------
134
+
135
+ [Test]
136
+ public void ScreenshotGameView_ViaRunTool_WhenGameViewReady_Succeeds()
137
+ {
138
+ // Method takes no parameters; an empty JSON object is the correct input.
139
+ RunTool("screenshot-game-view", "{}");
140
+ }
141
+
142
+ [Test]
143
+ public void ScreenshotGameView_ViaRunTool_WhenRenderTextureNotReady_ReturnsErrorJson()
144
+ {
145
+ CloseGameView();
146
+
147
+ LogAssert.ignoreFailingMessages = true;
148
+ try
149
+ {
150
+ var raw = RunToolRaw("screenshot-game-view", "{}");
151
+
152
+ Assert.IsNotNull(raw, "Raw result must not be null");
153
+ Assert.IsTrue(
154
+ raw.Contains("No Game View window") ||
155
+ raw.Contains("Game View render texture is not available"),
156
+ $"Expected a known error message. Actual JSON:\n{raw}");
157
+ }
158
+ finally
159
+ {
160
+ LogAssert.ignoreFailingMessages = false;
161
+ }
162
+ }
163
+ }
164
+ }
@@ -1,155 +1,155 @@
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.Text.RegularExpressions;
13
- using com.AtelierAI.Uco.Framework.Common.Model;
14
- using com.AtelierAI.Unity.Copilot.Editor.API;
15
- using NUnit.Framework;
16
- using UnityEditor;
17
- using UnityEngine;
18
- using UnityEngine.TestTools;
19
-
20
- namespace com.AtelierAI.Unity.Copilot.Editor.Tests
21
- {
22
- public class ScreenshotSceneViewTests : BaseTest
23
- {
24
- // -----------------------------------------------------------------------
25
- // Setup — ensure Scene View window is open and focused before each test
26
- // -----------------------------------------------------------------------
27
-
28
- [SetUp]
29
- public void EnsureSceneViewOpen()
30
- {
31
- var sceneView = SceneView.lastActiveSceneView;
32
- if (sceneView == null && SceneView.sceneViews.Count > 0)
33
- sceneView = SceneView.sceneViews[0] as SceneView;
34
-
35
- if (sceneView == null)
36
- sceneView = EditorWindow.GetWindow<SceneView>("Scene", true);
37
-
38
- sceneView.Show();
39
- sceneView.Focus();
40
- sceneView.Repaint();
41
- }
42
-
43
- // -----------------------------------------------------------------------
44
- // Helpers
45
- // -----------------------------------------------------------------------
46
-
47
- /// <summary>
48
- /// Returns true when at least one SceneView is available (the tool can
49
- /// render), false when no SceneView window is open (CI / batch mode).
50
- /// </summary>
51
- private static bool SceneViewAvailable =>
52
- SceneView.lastActiveSceneView != null || SceneView.sceneViews.Count > 0;
53
-
54
- private static void CloseSceneView()
55
- {
56
- var windows = Resources.FindObjectsOfTypeAll<SceneView>();
57
- foreach (var window in windows)
58
- window.Close();
59
- }
60
-
61
- // -----------------------------------------------------------------------
62
- // No-SceneView error path — close the window to test error handling
63
- // -----------------------------------------------------------------------
64
-
65
- [Test]
66
- public void ScreenshotSceneView_WhenNoSceneViewOpen_ReturnsSpecificError()
67
- {
68
- CloseSceneView();
69
-
70
- var result = new Tool_Screenshot().ScreenshotSceneView(width: 320, height: 240);
71
-
72
- Assert.IsNotNull(result, "Result should never be null");
73
- Assert.AreEqual(ResponseStatus.Error, result.Status,
74
- "Without a SceneView the tool must return an error response");
75
- }
76
-
77
- // -----------------------------------------------------------------------
78
- // Happy path — Scene View is open and ready
79
- // -----------------------------------------------------------------------
80
-
81
- [Test]
82
- public void ScreenshotSceneView_WithSceneView_DefaultDimensions_ReturnsImage()
83
- {
84
- var result = new Tool_Screenshot().ScreenshotSceneView();
85
-
86
- Assert.IsNotNull(result);
87
- Assert.AreNotEqual(ResponseStatus.Error, result.Status,
88
- "Should succeed with default (1920×1080) dimensions when SceneView is available");
89
- }
90
-
91
- [Test]
92
- public void ScreenshotSceneView_WithSceneView_CustomDimensions_ReturnsImage()
93
- {
94
- var result = new Tool_Screenshot().ScreenshotSceneView(width: 640, height: 480);
95
-
96
- Assert.IsNotNull(result);
97
- Assert.AreNotEqual(ResponseStatus.Error, result.Status,
98
- "Should succeed with custom dimensions when SceneView is available");
99
- }
100
-
101
- [Test]
102
- public void ScreenshotSceneView_WithSceneView_SmallDimensions_ReturnsImage()
103
- {
104
- // Small texture keeps the test fast
105
- var result = new Tool_Screenshot().ScreenshotSceneView(width: 16, height: 16);
106
-
107
- Assert.IsNotNull(result);
108
- Assert.AreNotEqual(ResponseStatus.Error, result.Status,
109
- "Should succeed with small dimensions when SceneView is available");
110
- }
111
-
112
- // -----------------------------------------------------------------------
113
- // Full MCP framework path
114
- // -----------------------------------------------------------------------
115
-
116
- [Test]
117
- public void ScreenshotSceneView_ViaRunTool_WhenSceneViewReady_Succeeds()
118
- {
119
- RunTool("screenshot-scene-view", @"{""width"": 320, ""height"": 240}");
120
- }
121
-
122
- [Test]
123
- public void ScreenshotSceneView_ViaRunTool_WhenNoSceneView_ReturnsErrorJson()
124
- {
125
- CloseSceneView();
126
-
127
- LogAssert.ignoreFailingMessages = true;
128
- try
129
- {
130
- var raw = RunToolRaw("screenshot-scene-view", @"{""width"": 320, ""height"": 240}");
131
-
132
- Assert.IsNotNull(raw, "Raw result should not be null");
133
- Assert.IsTrue(
134
- raw.Contains("No Scene View") || raw.Contains("Scene View camera"),
135
- $"Expected 'No Scene View' error message. Actual JSON:\n{raw}");
136
- }
137
- finally
138
- {
139
- LogAssert.ignoreFailingMessages = false;
140
- }
141
- }
142
-
143
- [Test]
144
- public void ScreenshotSceneView_DoesNotThrowException()
145
- {
146
- // Regardless of whether a SceneView is open, the tool must never
147
- // throw — it should return a ResponseCallTool (success or error).
148
- Assert.DoesNotThrow(() =>
149
- {
150
- var result = new Tool_Screenshot().ScreenshotSceneView(width: 16, height: 16);
151
- Assert.IsNotNull(result);
152
- });
153
- }
154
- }
155
- }
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.Text.RegularExpressions;
13
+ using com.AtelierAI.Uco.Framework.Common.Model;
14
+ using com.AtelierAI.Unity.Copilot.Editor.API;
15
+ using NUnit.Framework;
16
+ using UnityEditor;
17
+ using UnityEngine;
18
+ using UnityEngine.TestTools;
19
+
20
+ namespace com.AtelierAI.Unity.Copilot.Editor.Tests
21
+ {
22
+ public class ScreenshotSceneViewTests : BaseTest
23
+ {
24
+ // -----------------------------------------------------------------------
25
+ // Setup — ensure Scene View window is open and focused before each test
26
+ // -----------------------------------------------------------------------
27
+
28
+ [SetUp]
29
+ public void EnsureSceneViewOpen()
30
+ {
31
+ var sceneView = SceneView.lastActiveSceneView;
32
+ if (sceneView == null && SceneView.sceneViews.Count > 0)
33
+ sceneView = SceneView.sceneViews[0] as SceneView;
34
+
35
+ if (sceneView == null)
36
+ sceneView = EditorWindow.GetWindow<SceneView>("Scene", true);
37
+
38
+ sceneView.Show();
39
+ sceneView.Focus();
40
+ sceneView.Repaint();
41
+ }
42
+
43
+ // -----------------------------------------------------------------------
44
+ // Helpers
45
+ // -----------------------------------------------------------------------
46
+
47
+ /// <summary>
48
+ /// Returns true when at least one SceneView is available (the tool can
49
+ /// render), false when no SceneView window is open (CI / batch mode).
50
+ /// </summary>
51
+ private static bool SceneViewAvailable =>
52
+ SceneView.lastActiveSceneView != null || SceneView.sceneViews.Count > 0;
53
+
54
+ private static void CloseSceneView()
55
+ {
56
+ var windows = Resources.FindObjectsOfTypeAll<SceneView>();
57
+ foreach (var window in windows)
58
+ window.Close();
59
+ }
60
+
61
+ // -----------------------------------------------------------------------
62
+ // No-SceneView error path — close the window to test error handling
63
+ // -----------------------------------------------------------------------
64
+
65
+ [Test]
66
+ public void ScreenshotSceneView_WhenNoSceneViewOpen_ReturnsSpecificError()
67
+ {
68
+ CloseSceneView();
69
+
70
+ var result = new Tool_Screenshot().ScreenshotSceneView(width: 320, height: 240);
71
+
72
+ Assert.IsNotNull(result, "Result should never be null");
73
+ Assert.AreEqual(ResponseStatus.Error, result.Status,
74
+ "Without a SceneView the tool must return an error response");
75
+ }
76
+
77
+ // -----------------------------------------------------------------------
78
+ // Happy path — Scene View is open and ready
79
+ // -----------------------------------------------------------------------
80
+
81
+ [Test]
82
+ public void ScreenshotSceneView_WithSceneView_DefaultDimensions_ReturnsImage()
83
+ {
84
+ var result = new Tool_Screenshot().ScreenshotSceneView();
85
+
86
+ Assert.IsNotNull(result);
87
+ Assert.AreNotEqual(ResponseStatus.Error, result.Status,
88
+ "Should succeed with default (1920×1080) dimensions when SceneView is available");
89
+ }
90
+
91
+ [Test]
92
+ public void ScreenshotSceneView_WithSceneView_CustomDimensions_ReturnsImage()
93
+ {
94
+ var result = new Tool_Screenshot().ScreenshotSceneView(width: 640, height: 480);
95
+
96
+ Assert.IsNotNull(result);
97
+ Assert.AreNotEqual(ResponseStatus.Error, result.Status,
98
+ "Should succeed with custom dimensions when SceneView is available");
99
+ }
100
+
101
+ [Test]
102
+ public void ScreenshotSceneView_WithSceneView_SmallDimensions_ReturnsImage()
103
+ {
104
+ // Small texture keeps the test fast
105
+ var result = new Tool_Screenshot().ScreenshotSceneView(width: 16, height: 16);
106
+
107
+ Assert.IsNotNull(result);
108
+ Assert.AreNotEqual(ResponseStatus.Error, result.Status,
109
+ "Should succeed with small dimensions when SceneView is available");
110
+ }
111
+
112
+ // -----------------------------------------------------------------------
113
+ // Full Uco framework path
114
+ // -----------------------------------------------------------------------
115
+
116
+ [Test]
117
+ public void ScreenshotSceneView_ViaRunTool_WhenSceneViewReady_Succeeds()
118
+ {
119
+ RunTool("screenshot-scene-view", @"{""width"": 320, ""height"": 240}");
120
+ }
121
+
122
+ [Test]
123
+ public void ScreenshotSceneView_ViaRunTool_WhenNoSceneView_ReturnsErrorJson()
124
+ {
125
+ CloseSceneView();
126
+
127
+ LogAssert.ignoreFailingMessages = true;
128
+ try
129
+ {
130
+ var raw = RunToolRaw("screenshot-scene-view", @"{""width"": 320, ""height"": 240}");
131
+
132
+ Assert.IsNotNull(raw, "Raw result should not be null");
133
+ Assert.IsTrue(
134
+ raw.Contains("No Scene View") || raw.Contains("Scene View camera"),
135
+ $"Expected 'No Scene View' error message. Actual JSON:\n{raw}");
136
+ }
137
+ finally
138
+ {
139
+ LogAssert.ignoreFailingMessages = false;
140
+ }
141
+ }
142
+
143
+ [Test]
144
+ public void ScreenshotSceneView_DoesNotThrowException()
145
+ {
146
+ // Regardless of whether a SceneView is open, the tool must never
147
+ // throw — it should return a ResponseCallTool (success or error).
148
+ Assert.DoesNotThrow(() =>
149
+ {
150
+ var result = new Tool_Screenshot().ScreenshotSceneView(width: 16, height: 16);
151
+ Assert.IsNotNull(result);
152
+ });
153
+ }
154
+ }
155
+ }