@atelierai/uco 1.0.7 → 1.0.9

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