@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.
- package/CHANGELOG.md +29 -8
- package/package.json +2 -2
- package/vendor/plugin/com.atelierai.unity.copilot/CHANGELOG.md +4 -4
- 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/API/Tool/ToolGroups.SetEnabled.cs +92 -92
- 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 +887 -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 +22 -22
- 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/ToolGroupRegistry.cs +461 -460
- 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/Editor/UI/uss/CopilotPromptsWindow.uss +11 -11
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotResourcesWindow.uss +16 -16
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/CopilotToolsWindow.uss +36 -36
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/MainWindow.uss +183 -183
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/{_mcp-list-window.uss → _copilot-list-window.uss} +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uss/common/_list-view.uss +77 -77
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotPromptsWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotResourcesWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/CopilotToolsWindow.uxml +18 -18
- package/vendor/plugin/com.atelierai.unity.copilot/Editor/UI/uxml/MainWindow.uxml +115 -115
- 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/README.md +88 -88
- 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/NuGetExtractorDevelopmentDependencyTests.cs +148 -148
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetExtractorFlatLayoutTests.cs +166 -166
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetInstallManifestTests.cs +436 -436
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetLegacyMigrationTests.cs +304 -304
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/DependencyResolver/NuGetPackageInstallerStaleVersionCleanupTests.cs +200 -200
- package/vendor/plugin/com.atelierai.unity.copilot/Tests/Editor/Environment/EnvironmentUtilsTests.cs +2 -2
- 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/GameObject/TestJsonSchema.cs +199 -199
- 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/Editor/UI/uss/common/{_mcp-list-window.uss.meta → _copilot-list-window.uss.meta} +0 -0
- /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
|
|
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
|
|
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
|
+
}
|