@mflrevan/ucp 0.4.0 → 0.4.2
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/README.md +1 -11
- package/package.json +8 -2
- package/bridge/com.ucp.bridge/CHANGELOG.md +0 -128
- package/bridge/com.ucp.bridge/CHANGELOG.md.meta +0 -7
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs +0 -576
- package/bridge/com.ucp.bridge/Editor/Bridge/BridgeServer.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Bridge.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs +0 -530
- package/bridge/com.ucp.bridge/Editor/Controllers/AssetController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs +0 -230
- package/bridge/com.ucp.bridge/Editor/Controllers/BuildController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs +0 -26
- package/bridge/com.ucp.bridge/Editor/Controllers/CompilationController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs +0 -18
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs +0 -438
- package/bridge/com.ucp.bridge/Editor/Controllers/EditorSettingsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs +0 -145
- package/bridge/com.ucp.bridge/Editor/Controllers/FileController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs +0 -319
- package/bridge/com.ucp.bridge/Editor/Controllers/HierarchyController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs +0 -288
- package/bridge/com.ucp.bridge/Editor/Controllers/LogsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs +0 -295
- package/bridge/com.ucp.bridge/Editor/Controllers/MaterialController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs +0 -93
- package/bridge/com.ucp.bridge/Editor/Controllers/ObjectReferenceResolver.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs +0 -84
- package/bridge/com.ucp.bridge/Editor/Controllers/PlayModeController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs +0 -242
- package/bridge/com.ucp.bridge/Editor/Controllers/PrefabController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs +0 -533
- package/bridge/com.ucp.bridge/Editor/Controllers/PropertyController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs +0 -269
- package/bridge/com.ucp.bridge/Editor/Controllers/SceneController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs +0 -125
- package/bridge/com.ucp.bridge/Editor/Controllers/ScreenshotController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs +0 -104
- package/bridge/com.ucp.bridge/Editor/Controllers/ScriptController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs +0 -227
- package/bridge/com.ucp.bridge/Editor/Controllers/SnapshotController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs +0 -240
- package/bridge/com.ucp.bridge/Editor/Controllers/TestRunnerController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs +0 -611
- package/bridge/com.ucp.bridge/Editor/Controllers/VcsController.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Controllers.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs +0 -53
- package/bridge/com.ucp.bridge/Editor/Protocol/CommandRouter.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs +0 -80
- package/bridge/com.ucp.bridge/Editor/Protocol/MessageTypes.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs +0 -358
- package/bridge/com.ucp.bridge/Editor/Protocol/MiniJson.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Protocol.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs +0 -37
- package/bridge/com.ucp.bridge/Editor/Scripts/IUCPScript.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Editor/Scripts.meta +0 -8
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef +0 -16
- package/bridge/com.ucp.bridge/Editor/UCP.Bridge.Editor.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Editor.meta +0 -8
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef +0 -14
- package/bridge/com.ucp.bridge/Runtime/UCP.Bridge.Runtime.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Runtime.meta +0 -8
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs +0 -670
- package/bridge/com.ucp.bridge/Tests/Editor/ControllerSmokeTests.cs.meta +0 -2
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef +0 -12
- package/bridge/com.ucp.bridge/Tests/Editor/UCP.Bridge.Editor.Tests.asmdef.meta +0 -7
- package/bridge/com.ucp.bridge/Tests/Editor.meta +0 -8
- package/bridge/com.ucp.bridge/Tests.meta +0 -8
- package/bridge/com.ucp.bridge/package.json +0 -27
- package/bridge/com.ucp.bridge/package.json.meta +0 -7
|
@@ -1,670 +0,0 @@
|
|
|
1
|
-
using System;
|
|
2
|
-
using System.Collections;
|
|
3
|
-
using System.Collections.Generic;
|
|
4
|
-
using System.Text.RegularExpressions;
|
|
5
|
-
using NUnit.Framework;
|
|
6
|
-
using UnityEditor;
|
|
7
|
-
using UnityEditor.SceneManagement;
|
|
8
|
-
using UnityEngine;
|
|
9
|
-
using UnityEngine.TestTools;
|
|
10
|
-
|
|
11
|
-
namespace UCP.Bridge.Tests
|
|
12
|
-
{
|
|
13
|
-
public class ControllerSmokeTests
|
|
14
|
-
{
|
|
15
|
-
private const string TempAssetPath = "Assets/UcpControllerSmoke.asset";
|
|
16
|
-
private const string TempReferenceAssetPath = "Assets/UcpControllerReference.asset";
|
|
17
|
-
private const string TempPrefabPath = "Assets/UcpControllerSmoke.prefab";
|
|
18
|
-
private const string TempMaterialPath = "Assets/UcpControllerSmoke.mat";
|
|
19
|
-
private const string TempTextPath = "Assets/UcpControllerSmoke.txt";
|
|
20
|
-
private const string TempScriptPath = "Assets/UcpControllerSmokeComponent.cs";
|
|
21
|
-
|
|
22
|
-
private CommandRouter _router;
|
|
23
|
-
|
|
24
|
-
[SetUp]
|
|
25
|
-
public void SetUp()
|
|
26
|
-
{
|
|
27
|
-
_router = new CommandRouter();
|
|
28
|
-
SnapshotController.Register(_router);
|
|
29
|
-
AssetController.Register(_router);
|
|
30
|
-
LogsController.Register(_router);
|
|
31
|
-
HierarchyController.Register(_router);
|
|
32
|
-
PropertyController.Register(_router);
|
|
33
|
-
FileController.Register(_router);
|
|
34
|
-
MaterialController.Register(_router);
|
|
35
|
-
PrefabController.Register(_router);
|
|
36
|
-
BuildController.Register(_router);
|
|
37
|
-
EditorSettingsController.Register(_router);
|
|
38
|
-
SceneController.Register(_router);
|
|
39
|
-
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
|
40
|
-
DeleteTempAsset();
|
|
41
|
-
DeleteTempReferenceAsset();
|
|
42
|
-
DeleteTempPrefab();
|
|
43
|
-
DeleteTempMaterial();
|
|
44
|
-
DeleteTempTextFile();
|
|
45
|
-
DeleteTempScriptFile();
|
|
46
|
-
LogsController.ClearHistoryForTests();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
[TearDown]
|
|
50
|
-
public void TearDown()
|
|
51
|
-
{
|
|
52
|
-
DeleteTempAsset();
|
|
53
|
-
DeleteTempReferenceAsset();
|
|
54
|
-
DeleteTempPrefab();
|
|
55
|
-
DeleteTempMaterial();
|
|
56
|
-
DeleteTempTextFile();
|
|
57
|
-
DeleteTempScriptFile();
|
|
58
|
-
LogsController.ClearHistoryForTests();
|
|
59
|
-
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
[Test]
|
|
63
|
-
public void Snapshot_DefaultDepth_ReturnsLeanRootMetadata()
|
|
64
|
-
{
|
|
65
|
-
var root = new GameObject("Root");
|
|
66
|
-
var child = new GameObject("Child");
|
|
67
|
-
child.transform.SetParent(root.transform, false);
|
|
68
|
-
|
|
69
|
-
var response = _router.Dispatch("snapshot", 1, "{\"depth\":0}");
|
|
70
|
-
|
|
71
|
-
Assert.That(response.error, Is.Null);
|
|
72
|
-
|
|
73
|
-
var result = (Dictionary<string, object>)response.result;
|
|
74
|
-
var objects = (List<object>)result["objects"];
|
|
75
|
-
Assert.That(objects.Count, Is.EqualTo(1));
|
|
76
|
-
|
|
77
|
-
var entry = (Dictionary<string, object>)objects[0];
|
|
78
|
-
Assert.That(entry["name"], Is.EqualTo("Root"));
|
|
79
|
-
Assert.That(Convert.ToInt32(entry["depth"]), Is.EqualTo(0));
|
|
80
|
-
Assert.That(Convert.ToInt32(entry["childCount"]), Is.EqualTo(1));
|
|
81
|
-
Assert.That(entry.ContainsKey("components"), Is.True);
|
|
82
|
-
Assert.That(entry.ContainsKey("layerName"), Is.True);
|
|
83
|
-
Assert.That(entry.ContainsKey("children"), Is.False);
|
|
84
|
-
Assert.That(entry.ContainsKey("position"), Is.False);
|
|
85
|
-
Assert.That(entry.ContainsKey("rotation"), Is.False);
|
|
86
|
-
Assert.That(result.ContainsKey("logs"), Is.False);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
[Test]
|
|
90
|
-
public void AssetSearch_FiltersActualSubassetTypeMatches()
|
|
91
|
-
{
|
|
92
|
-
var root = ScriptableObject.CreateInstance<SearchRootAsset>();
|
|
93
|
-
root.name = "SmokeRoot";
|
|
94
|
-
AssetDatabase.CreateAsset(root, TempAssetPath);
|
|
95
|
-
|
|
96
|
-
var nested = ScriptableObject.CreateInstance<SearchNestedAsset>();
|
|
97
|
-
nested.name = "SmokeNested";
|
|
98
|
-
AssetDatabase.AddObjectToAsset(nested, root);
|
|
99
|
-
AssetDatabase.ImportAsset(TempAssetPath, ImportAssetOptions.ForceSynchronousImport);
|
|
100
|
-
AssetDatabase.SaveAssets();
|
|
101
|
-
|
|
102
|
-
var response = _router.Dispatch(
|
|
103
|
-
"asset/search",
|
|
104
|
-
1,
|
|
105
|
-
"{\"name\":\"SmokeNested\",\"path\":\"Assets\",\"maxResults\":10}"
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
Assert.That(response.error, Is.Null);
|
|
109
|
-
|
|
110
|
-
var result = (Dictionary<string, object>)response.result;
|
|
111
|
-
Assert.That(Convert.ToInt32(result["total"]), Is.GreaterThanOrEqualTo(1));
|
|
112
|
-
Assert.That(Convert.ToInt32(result["returned"]), Is.GreaterThanOrEqualTo(1));
|
|
113
|
-
|
|
114
|
-
var matches = (List<object>)result["results"];
|
|
115
|
-
var match = FindAssetMatch(matches, TempAssetPath, "SmokeNested");
|
|
116
|
-
Assert.That(match, Is.Not.Null);
|
|
117
|
-
Assert.That(match["path"], Is.EqualTo(TempAssetPath));
|
|
118
|
-
Assert.That(match["type"], Is.EqualTo("SearchNestedAsset"));
|
|
119
|
-
Assert.That(match["name"], Is.EqualTo("SmokeNested"));
|
|
120
|
-
Assert.That(Convert.ToBoolean(match["isSubAsset"]), Is.True);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
[Test]
|
|
124
|
-
public void LogsTail_ReturnsRequestedBufferedCount()
|
|
125
|
-
{
|
|
126
|
-
for (var index = 0; index < 12; index++)
|
|
127
|
-
LogsController.RecordTestLog("info", $"log {index}");
|
|
128
|
-
|
|
129
|
-
var response = _router.Dispatch("logs/tail", 1, "{\"count\":50}");
|
|
130
|
-
|
|
131
|
-
Assert.That(response.error, Is.Null);
|
|
132
|
-
|
|
133
|
-
var result = (Dictionary<string, object>)response.result;
|
|
134
|
-
Assert.That(Convert.ToInt32(result["total"]), Is.EqualTo(12));
|
|
135
|
-
Assert.That(Convert.ToInt32(result["returned"]), Is.EqualTo(12));
|
|
136
|
-
Assert.That(Convert.ToBoolean(result["truncated"]), Is.False);
|
|
137
|
-
|
|
138
|
-
var logs = (List<object>)result["logs"];
|
|
139
|
-
var first = (Dictionary<string, object>)logs[0];
|
|
140
|
-
Assert.That(Convert.ToInt64(first["id"]), Is.EqualTo(12));
|
|
141
|
-
Assert.That(first.ContainsKey("messagePreview"), Is.True);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
[Test]
|
|
145
|
-
public void LogsSearch_FiltersBeforeApplyingCount()
|
|
146
|
-
{
|
|
147
|
-
LogsController.RecordTestLog("warning", "Target failed once");
|
|
148
|
-
for (var index = 0; index < 8; index++)
|
|
149
|
-
LogsController.RecordTestLog("info", $"Noise {index}");
|
|
150
|
-
|
|
151
|
-
var response = _router.Dispatch("logs/search", 1, "{\"pattern\":\"Target\",\"count\":1}");
|
|
152
|
-
|
|
153
|
-
Assert.That(response.error, Is.Null);
|
|
154
|
-
|
|
155
|
-
var result = (Dictionary<string, object>)response.result;
|
|
156
|
-
Assert.That(Convert.ToInt32(result["total"]), Is.EqualTo(1));
|
|
157
|
-
Assert.That(Convert.ToInt32(result["returned"]), Is.EqualTo(1));
|
|
158
|
-
Assert.That(Convert.ToBoolean(result["truncated"]), Is.False);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
[Test]
|
|
162
|
-
public void LogsSearch_UsesRegexAgainstBufferedHistory()
|
|
163
|
-
{
|
|
164
|
-
LogsController.RecordTestLog("info", "Alpha ready");
|
|
165
|
-
LogsController.RecordTestLog("warning", "Beta failed");
|
|
166
|
-
LogsController.RecordTestLog("error", "Gamma failed hard");
|
|
167
|
-
|
|
168
|
-
var response = _router.Dispatch("logs/search", 1, "{\"pattern\":\"failed\",\"count\":20}");
|
|
169
|
-
|
|
170
|
-
Assert.That(response.error, Is.Null);
|
|
171
|
-
|
|
172
|
-
var result = (Dictionary<string, object>)response.result;
|
|
173
|
-
Assert.That(Convert.ToInt32(result["total"]), Is.EqualTo(2));
|
|
174
|
-
|
|
175
|
-
var logs = (List<object>)result["logs"];
|
|
176
|
-
Assert.That(logs.Count, Is.EqualTo(2));
|
|
177
|
-
var first = (Dictionary<string, object>)logs[0];
|
|
178
|
-
Assert.That(first["level"], Is.EqualTo("error"));
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
[Test]
|
|
182
|
-
public void LogsTail_RespectsLevelThresholdAndIdWindow()
|
|
183
|
-
{
|
|
184
|
-
var first = LogsController.RecordTestLog("info", "Alpha");
|
|
185
|
-
var second = LogsController.RecordTestLog("warning", "Beta warning");
|
|
186
|
-
var third = LogsController.RecordTestLog("error", "Gamma error");
|
|
187
|
-
|
|
188
|
-
var response = _router.Dispatch(
|
|
189
|
-
"logs/tail",
|
|
190
|
-
1,
|
|
191
|
-
"{\"level\":\"warn\",\"afterId\":" + Convert.ToInt64(first["id"]) + ",\"beforeId\":" + Convert.ToInt64(third["id"]) + ",\"count\":20}"
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
Assert.That(response.error, Is.Null);
|
|
195
|
-
|
|
196
|
-
var result = (Dictionary<string, object>)response.result;
|
|
197
|
-
Assert.That(Convert.ToInt32(result["total"]), Is.EqualTo(1));
|
|
198
|
-
|
|
199
|
-
var logs = (List<object>)result["logs"];
|
|
200
|
-
Assert.That(logs.Count, Is.EqualTo(1));
|
|
201
|
-
var only = (Dictionary<string, object>)logs[0];
|
|
202
|
-
Assert.That(only["level"], Is.EqualTo("warning"));
|
|
203
|
-
Assert.That(Convert.ToInt64(only["id"]), Is.EqualTo(Convert.ToInt64(second["id"])));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
[Test]
|
|
207
|
-
public void LogsGet_ReturnsFullMessageAndStackTrace()
|
|
208
|
-
{
|
|
209
|
-
var created = LogsController.RecordTestLog("error", "Exploded", "stack line 1\nstack line 2");
|
|
210
|
-
var id = Convert.ToInt64(created["id"]);
|
|
211
|
-
|
|
212
|
-
var response = _router.Dispatch("logs/get", 1, "{\"id\":" + id + "}");
|
|
213
|
-
|
|
214
|
-
Assert.That(response.error, Is.Null);
|
|
215
|
-
|
|
216
|
-
var result = (Dictionary<string, object>)response.result;
|
|
217
|
-
Assert.That(result["message"], Is.EqualTo("Exploded"));
|
|
218
|
-
Assert.That(result["stackTrace"], Is.EqualTo("stack line 1\nstack line 2"));
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
[Test]
|
|
222
|
-
public void ObjectLifecycle_CreateMutateAndDelete_WorksEndToEnd()
|
|
223
|
-
{
|
|
224
|
-
var create = _router.Dispatch("object/create", 1, "{\"name\":\"SmokeObject\"}");
|
|
225
|
-
Assert.That(create.error, Is.Null);
|
|
226
|
-
|
|
227
|
-
var createResult = (Dictionary<string, object>)create.result;
|
|
228
|
-
var instanceId = Convert.ToInt32(createResult["instanceId"]);
|
|
229
|
-
|
|
230
|
-
var rename = _router.Dispatch("object/set-name", 1, "{\"instanceId\":" + instanceId + ",\"name\":\"RenamedSmoke\"}");
|
|
231
|
-
Assert.That(rename.error, Is.Null);
|
|
232
|
-
|
|
233
|
-
var deactivate = _router.Dispatch("object/set-active", 1, "{\"instanceId\":" + instanceId + ",\"active\":false}");
|
|
234
|
-
Assert.That(deactivate.error, Is.Null);
|
|
235
|
-
var deactivateResult = (Dictionary<string, object>)deactivate.result;
|
|
236
|
-
Assert.That(Convert.ToBoolean(deactivateResult["active"]), Is.False);
|
|
237
|
-
|
|
238
|
-
var activate = _router.Dispatch("object/set-active", 1, "{\"instanceId\":" + instanceId + ",\"active\":true}");
|
|
239
|
-
Assert.That(activate.error, Is.Null);
|
|
240
|
-
|
|
241
|
-
var addComponent = _router.Dispatch("object/add-component", 1, "{\"instanceId\":" + instanceId + ",\"type\":\"BoxCollider\"}");
|
|
242
|
-
Assert.That(addComponent.error, Is.Null);
|
|
243
|
-
|
|
244
|
-
var setPosition = _router.Dispatch(
|
|
245
|
-
"object/set-property",
|
|
246
|
-
1,
|
|
247
|
-
"{\"instanceId\":" + instanceId + ",\"component\":\"Transform\",\"property\":\"m_LocalPosition\",\"value\":[1,2,3]}"
|
|
248
|
-
);
|
|
249
|
-
Assert.That(setPosition.error, Is.Null);
|
|
250
|
-
|
|
251
|
-
var getPosition = _router.Dispatch(
|
|
252
|
-
"object/get-property",
|
|
253
|
-
1,
|
|
254
|
-
"{\"instanceId\":" + instanceId + ",\"component\":\"Transform\",\"property\":\"m_LocalPosition\"}"
|
|
255
|
-
);
|
|
256
|
-
Assert.That(getPosition.error, Is.Null);
|
|
257
|
-
|
|
258
|
-
var updated = EditorUtility.InstanceIDToObject(instanceId) as GameObject;
|
|
259
|
-
Assert.That(updated, Is.Not.Null);
|
|
260
|
-
var localPosition = updated.transform.localPosition;
|
|
261
|
-
Assert.That(localPosition.x, Is.EqualTo(1f).Within(0.001f));
|
|
262
|
-
Assert.That(localPosition.y, Is.EqualTo(2f).Within(0.001f));
|
|
263
|
-
Assert.That(localPosition.z, Is.EqualTo(3f).Within(0.001f));
|
|
264
|
-
|
|
265
|
-
var removeComponent = _router.Dispatch("object/remove-component", 1, "{\"instanceId\":" + instanceId + ",\"type\":\"BoxCollider\"}");
|
|
266
|
-
Assert.That(removeComponent.error, Is.Null);
|
|
267
|
-
|
|
268
|
-
var delete = _router.Dispatch("object/delete", 1, "{\"instanceId\":" + instanceId + "}");
|
|
269
|
-
Assert.That(delete.error, Is.Null);
|
|
270
|
-
Assert.That(EditorUtility.InstanceIDToObject(instanceId), Is.Null);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
[Test]
|
|
274
|
-
public void ObjectSetProperty_AssignsObjectReferenceByAssetPath()
|
|
275
|
-
{
|
|
276
|
-
var referencedAsset = ScriptableObject.CreateInstance<SearchRootAsset>();
|
|
277
|
-
referencedAsset.name = "ReferenceAsset";
|
|
278
|
-
AssetDatabase.CreateAsset(referencedAsset, TempReferenceAssetPath);
|
|
279
|
-
AssetDatabase.SaveAssets();
|
|
280
|
-
|
|
281
|
-
var go = new GameObject("ReferenceCarrier");
|
|
282
|
-
var component = go.AddComponent<ReferenceComponent>();
|
|
283
|
-
|
|
284
|
-
var response = _router.Dispatch(
|
|
285
|
-
"object/set-property",
|
|
286
|
-
1,
|
|
287
|
-
"{\"instanceId\":" + go.GetInstanceID() + ",\"component\":\"ReferenceComponent\",\"property\":\"referenceAsset\",\"value\":{\"path\":\"" + TempReferenceAssetPath + "\"}}"
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
Assert.That(response.error, Is.Null);
|
|
291
|
-
Assert.That(component.referenceAsset, Is.Not.Null);
|
|
292
|
-
Assert.That(AssetDatabase.GetAssetPath(component.referenceAsset), Is.EqualTo(TempReferenceAssetPath));
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
[Test]
|
|
296
|
-
public void ObjectSetProperty_RejectsUnknownObjectReference()
|
|
297
|
-
{
|
|
298
|
-
var go = new GameObject("ReferenceCarrier");
|
|
299
|
-
go.AddComponent<ReferenceComponent>();
|
|
300
|
-
|
|
301
|
-
var response = _router.Dispatch(
|
|
302
|
-
"object/set-property",
|
|
303
|
-
1,
|
|
304
|
-
"{\"instanceId\":" + go.GetInstanceID() + ",\"component\":\"ReferenceComponent\",\"property\":\"referenceAsset\",\"value\":{\"path\":\"Assets/Missing.asset\"}}"
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
Assert.That(response.error, Is.Not.Null);
|
|
308
|
-
Assert.That(response.error.code, Is.EqualTo(ErrorCodes.InvalidParams));
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
[Test]
|
|
312
|
-
public void AssetWriteBatch_UpdatesMultipleFieldsIncludingObjectReference()
|
|
313
|
-
{
|
|
314
|
-
var reference = ScriptableObject.CreateInstance<SearchRootAsset>();
|
|
315
|
-
reference.name = "ReferenceAsset";
|
|
316
|
-
AssetDatabase.CreateAsset(reference, TempReferenceAssetPath);
|
|
317
|
-
|
|
318
|
-
var asset = ScriptableObject.CreateInstance<BatchWritableAsset>();
|
|
319
|
-
asset.maxPlayers = 2;
|
|
320
|
-
asset.spawnDelay = 5f;
|
|
321
|
-
AssetDatabase.CreateAsset(asset, TempAssetPath);
|
|
322
|
-
AssetDatabase.SaveAssets();
|
|
323
|
-
|
|
324
|
-
var response = _router.Dispatch(
|
|
325
|
-
"asset/write-batch",
|
|
326
|
-
1,
|
|
327
|
-
"{\"path\":\"" + TempAssetPath + "\",\"values\":{\"maxPlayers\":8,\"spawnDelay\":1.5,\"referenceAsset\":{\"path\":\"" + TempReferenceAssetPath + "\"}}}"
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
Assert.That(response.error, Is.Null);
|
|
331
|
-
|
|
332
|
-
var reloaded = AssetDatabase.LoadAssetAtPath<BatchWritableAsset>(TempAssetPath);
|
|
333
|
-
Assert.That(reloaded.maxPlayers, Is.EqualTo(8));
|
|
334
|
-
Assert.That(reloaded.spawnDelay, Is.EqualTo(1.5f).Within(0.001f));
|
|
335
|
-
Assert.That(AssetDatabase.GetAssetPath(reloaded.referenceAsset), Is.EqualTo(TempReferenceAssetPath));
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
[Test]
|
|
339
|
-
public void FileController_WritePatchRead_AndRejectsPathTraversal()
|
|
340
|
-
{
|
|
341
|
-
var write = _router.Dispatch("file/write", 1, "{\"path\":\"Assets/UcpControllerSmoke.txt\",\"content\":\"hello smoke\"}");
|
|
342
|
-
Assert.That(write.error, Is.Null);
|
|
343
|
-
|
|
344
|
-
var patch = _router.Dispatch(
|
|
345
|
-
"file/patch",
|
|
346
|
-
1,
|
|
347
|
-
"{\"path\":\"Assets/UcpControllerSmoke.txt\",\"patch\":{\"find\":\"smoke\",\"replace\":\"patched\"}}"
|
|
348
|
-
);
|
|
349
|
-
Assert.That(patch.error, Is.Null);
|
|
350
|
-
|
|
351
|
-
var read = _router.Dispatch("file/read", 1, "{\"path\":\"Assets/UcpControllerSmoke.txt\"}");
|
|
352
|
-
Assert.That(read.error, Is.Null);
|
|
353
|
-
var readResult = (Dictionary<string, object>)read.result;
|
|
354
|
-
Assert.That(readResult["content"].ToString(), Is.EqualTo("hello patched"));
|
|
355
|
-
|
|
356
|
-
var traversal = _router.Dispatch("file/read", 1, "{\"path\":\"../outside.txt\"}");
|
|
357
|
-
Assert.That(traversal.error, Is.Not.Null);
|
|
358
|
-
Assert.That(traversal.error.code, Is.EqualTo(ErrorCodes.FileAccessDenied));
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
[Test]
|
|
362
|
-
public void FileController_Write_RefreshesAssetDatabaseForNewAssets()
|
|
363
|
-
{
|
|
364
|
-
var write = _router.Dispatch(
|
|
365
|
-
"file/write",
|
|
366
|
-
1,
|
|
367
|
-
"{\"path\":\"Assets/UcpControllerSmokeComponent.cs\",\"content\":\"using UnityEngine; public class UcpControllerSmokeComponent : MonoBehaviour {}\"}"
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
Assert.That(write.error, Is.Null);
|
|
371
|
-
|
|
372
|
-
var script = AssetDatabase.LoadAssetAtPath<MonoScript>(TempScriptPath);
|
|
373
|
-
Assert.That(script, Is.Not.Null);
|
|
374
|
-
Assert.That(script.name, Is.EqualTo("UcpControllerSmokeComponent"));
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
[Test]
|
|
378
|
-
public void SceneFocus_WithAxis_AlignsSceneCameraTowardTarget()
|
|
379
|
-
{
|
|
380
|
-
var sceneView = EditorWindow.GetWindow<SceneView>();
|
|
381
|
-
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
382
|
-
cube.name = "FocusTarget";
|
|
383
|
-
cube.transform.position = new Vector3(2f, 1f, 3f);
|
|
384
|
-
cube.transform.localScale = new Vector3(2f, 2f, 2f);
|
|
385
|
-
|
|
386
|
-
var response = _router.Dispatch(
|
|
387
|
-
"scene/focus",
|
|
388
|
-
1,
|
|
389
|
-
"{\"instanceId\":" + cube.GetInstanceID() + ",\"axis\":[1,0,1]}"
|
|
390
|
-
);
|
|
391
|
-
|
|
392
|
-
Assert.That(response.error, Is.Null);
|
|
393
|
-
|
|
394
|
-
var result = (Dictionary<string, object>)response.result;
|
|
395
|
-
Assert.That(result["name"].ToString(), Is.EqualTo("FocusTarget"));
|
|
396
|
-
Assert.That(Selection.activeGameObject, Is.EqualTo(cube));
|
|
397
|
-
|
|
398
|
-
var expectedDirection = new Vector3(1f, 0f, 1f).normalized;
|
|
399
|
-
var axisData = (List<object>)result["axis"];
|
|
400
|
-
var returnedAxis = new Vector3(
|
|
401
|
-
System.Convert.ToSingle(axisData[0]),
|
|
402
|
-
System.Convert.ToSingle(axisData[1]),
|
|
403
|
-
System.Convert.ToSingle(axisData[2]));
|
|
404
|
-
var actualForward = sceneView.camera.transform.forward;
|
|
405
|
-
Assert.That(Vector3.Dot(returnedAxis.normalized, expectedDirection), Is.GreaterThan(0.98f));
|
|
406
|
-
Assert.That(Mathf.Abs(Vector3.Dot(actualForward.normalized, expectedDirection)), Is.GreaterThan(0.98f));
|
|
407
|
-
Assert.That(Vector3.Distance(sceneView.pivot, cube.transform.position), Is.LessThan(2f));
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
[Test]
|
|
411
|
-
public void SceneFocus_RejectsZeroAxisVector()
|
|
412
|
-
{
|
|
413
|
-
EditorWindow.GetWindow<SceneView>();
|
|
414
|
-
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
415
|
-
cube.name = "ZeroAxisTarget";
|
|
416
|
-
|
|
417
|
-
var response = _router.Dispatch(
|
|
418
|
-
"scene/focus",
|
|
419
|
-
1,
|
|
420
|
-
"{\"instanceId\":" + cube.GetInstanceID() + ",\"axis\":[0,0,0]}"
|
|
421
|
-
);
|
|
422
|
-
|
|
423
|
-
Assert.That(response.error, Is.Not.Null);
|
|
424
|
-
Assert.That(response.error.code, Is.EqualTo(ErrorCodes.InvalidParams));
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
[Test]
|
|
428
|
-
public void MaterialController_SetAndGetFloatProperty_RoundTrips()
|
|
429
|
-
{
|
|
430
|
-
var shader = Shader.Find("Standard") ?? Shader.Find("Universal Render Pipeline/Lit");
|
|
431
|
-
Assert.That(shader, Is.Not.Null);
|
|
432
|
-
|
|
433
|
-
var propertyName = FindFirstFloatOrRangeProperty(shader);
|
|
434
|
-
Assert.That(propertyName, Is.Not.Null.And.Not.Empty);
|
|
435
|
-
|
|
436
|
-
var material = new Material(shader) { name = "UcpControllerSmokeMat" };
|
|
437
|
-
AssetDatabase.CreateAsset(material, TempMaterialPath);
|
|
438
|
-
AssetDatabase.SaveAssets();
|
|
439
|
-
|
|
440
|
-
var set = _router.Dispatch(
|
|
441
|
-
"material/set-property",
|
|
442
|
-
1,
|
|
443
|
-
"{\"path\":\"Assets/UcpControllerSmoke.mat\",\"property\":\"" + propertyName + "\",\"value\":0.42}"
|
|
444
|
-
);
|
|
445
|
-
Assert.That(set.error, Is.Null);
|
|
446
|
-
|
|
447
|
-
var get = _router.Dispatch(
|
|
448
|
-
"material/get-property",
|
|
449
|
-
1,
|
|
450
|
-
"{\"path\":\"Assets/UcpControllerSmoke.mat\",\"property\":\"" + propertyName + "\"}"
|
|
451
|
-
);
|
|
452
|
-
Assert.That(get.error, Is.Null);
|
|
453
|
-
|
|
454
|
-
var getResult = (Dictionary<string, object>)get.result;
|
|
455
|
-
var value = Convert.ToSingle(getResult["value"]);
|
|
456
|
-
Assert.That(value, Is.EqualTo(0.42f).Within(0.001f));
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
[Test]
|
|
460
|
-
public void PrefabController_CreateStatusOverridesAndUnpack_Works()
|
|
461
|
-
{
|
|
462
|
-
var create = _router.Dispatch("object/create", 1, "{\"name\":\"PrefabSource\"}");
|
|
463
|
-
Assert.That(create.error, Is.Null);
|
|
464
|
-
var sourceId = Convert.ToInt32(((Dictionary<string, object>)create.result)["instanceId"]);
|
|
465
|
-
|
|
466
|
-
var createPrefab = _router.Dispatch(
|
|
467
|
-
"prefab/create",
|
|
468
|
-
1,
|
|
469
|
-
"{\"instanceId\":" + sourceId + ",\"path\":\"Assets/UcpControllerSmoke.prefab\"}"
|
|
470
|
-
);
|
|
471
|
-
Assert.That(createPrefab.error, Is.Null);
|
|
472
|
-
|
|
473
|
-
var instantiate = _router.Dispatch(
|
|
474
|
-
"object/instantiate",
|
|
475
|
-
1,
|
|
476
|
-
"{\"prefab\":\"Assets/UcpControllerSmoke.prefab\",\"name\":\"PrefabInstance\"}"
|
|
477
|
-
);
|
|
478
|
-
Assert.That(instantiate.error, Is.Null);
|
|
479
|
-
var instanceId = Convert.ToInt32(((Dictionary<string, object>)instantiate.result)["instanceId"]);
|
|
480
|
-
|
|
481
|
-
var status = _router.Dispatch("prefab/status", 1, "{\"instanceId\":" + instanceId + "}");
|
|
482
|
-
Assert.That(status.error, Is.Null);
|
|
483
|
-
var statusResult = (Dictionary<string, object>)status.result;
|
|
484
|
-
Assert.That(Convert.ToBoolean(statusResult["isInstance"]), Is.True);
|
|
485
|
-
|
|
486
|
-
var mutate = _router.Dispatch(
|
|
487
|
-
"object/set-property",
|
|
488
|
-
1,
|
|
489
|
-
"{\"instanceId\":" + instanceId + ",\"component\":\"Transform\",\"property\":\"m_LocalPosition\",\"value\":[2,0,0]}"
|
|
490
|
-
);
|
|
491
|
-
Assert.That(mutate.error, Is.Null);
|
|
492
|
-
|
|
493
|
-
var overrides = _router.Dispatch("prefab/overrides", 1, "{\"instanceId\":" + instanceId + "}");
|
|
494
|
-
Assert.That(overrides.error, Is.Null);
|
|
495
|
-
var overridesResult = (Dictionary<string, object>)overrides.result;
|
|
496
|
-
var modifications = (List<object>)overridesResult["propertyModifications"];
|
|
497
|
-
Assert.That(modifications.Count, Is.GreaterThanOrEqualTo(1));
|
|
498
|
-
|
|
499
|
-
var unpack = _router.Dispatch("prefab/unpack", 1, "{\"instanceId\":" + instanceId + "}");
|
|
500
|
-
Assert.That(unpack.error, Is.Null);
|
|
501
|
-
|
|
502
|
-
var unpackedStatus = _router.Dispatch("prefab/status", 1, "{\"instanceId\":" + instanceId + "}");
|
|
503
|
-
Assert.That(unpackedStatus.error, Is.Null);
|
|
504
|
-
var unpackedStatusResult = (Dictionary<string, object>)unpackedStatus.result;
|
|
505
|
-
Assert.That(Convert.ToBoolean(unpackedStatusResult["isInstance"]), Is.False);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
[Test]
|
|
509
|
-
public void SettingsAndBuildControllers_RoundTripWithoutSideEffects()
|
|
510
|
-
{
|
|
511
|
-
var playerSettings = _router.Dispatch("settings/player", 1, "{}");
|
|
512
|
-
Assert.That(playerSettings.error, Is.Null);
|
|
513
|
-
var settingsResult = (Dictionary<string, object>)playerSettings.result;
|
|
514
|
-
var originalProductName = settingsResult["productName"].ToString();
|
|
515
|
-
|
|
516
|
-
var setPlayer = _router.Dispatch(
|
|
517
|
-
"settings/player-set",
|
|
518
|
-
1,
|
|
519
|
-
"{\"key\":\"productName\",\"value\":\"UcpQaProduct\"}"
|
|
520
|
-
);
|
|
521
|
-
Assert.That(setPlayer.error, Is.Null);
|
|
522
|
-
|
|
523
|
-
var verifyPlayer = _router.Dispatch("settings/player", 1, "{}");
|
|
524
|
-
Assert.That(verifyPlayer.error, Is.Null);
|
|
525
|
-
var verifyResult = (Dictionary<string, object>)verifyPlayer.result;
|
|
526
|
-
Assert.That(verifyResult["productName"].ToString(), Is.EqualTo("UcpQaProduct"));
|
|
527
|
-
|
|
528
|
-
var restorePlayer = _router.Dispatch(
|
|
529
|
-
"settings/player-set",
|
|
530
|
-
1,
|
|
531
|
-
"{\"key\":\"productName\",\"value\":\"" + originalProductName + "\"}"
|
|
532
|
-
);
|
|
533
|
-
Assert.That(restorePlayer.error, Is.Null);
|
|
534
|
-
|
|
535
|
-
var scenes = _router.Dispatch("build/scenes", 1, "{}");
|
|
536
|
-
Assert.That(scenes.error, Is.Null);
|
|
537
|
-
var scenesResult = (Dictionary<string, object>)scenes.result;
|
|
538
|
-
var currentScenes = (List<object>)scenesResult["scenes"];
|
|
539
|
-
Assert.That(currentScenes.Count, Is.GreaterThanOrEqualTo(1));
|
|
540
|
-
|
|
541
|
-
var firstScene = (Dictionary<string, object>)currentScenes[0];
|
|
542
|
-
var firstScenePath = firstScene["path"].ToString();
|
|
543
|
-
|
|
544
|
-
var setScenes = _router.Dispatch(
|
|
545
|
-
"build/set-scenes",
|
|
546
|
-
1,
|
|
547
|
-
"{\"scenes\":[\"" + EscapeForJson(firstScenePath) + "\"]}"
|
|
548
|
-
);
|
|
549
|
-
Assert.That(setScenes.error, Is.Null);
|
|
550
|
-
|
|
551
|
-
var defines = _router.Dispatch("build/defines", 1, "{}");
|
|
552
|
-
Assert.That(defines.error, Is.Null);
|
|
553
|
-
var definesResult = (Dictionary<string, object>)defines.result;
|
|
554
|
-
var originalDefines = definesResult["defines"].ToString();
|
|
555
|
-
|
|
556
|
-
var setDefines = _router.Dispatch("build/set-defines", 1, "{\"defines\":\"" + EscapeForJson(originalDefines) + "\"}");
|
|
557
|
-
Assert.That(setDefines.error, Is.Null);
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
private static void DeleteTempAsset()
|
|
561
|
-
{
|
|
562
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempAssetPath) != null)
|
|
563
|
-
{
|
|
564
|
-
AssetDatabase.DeleteAsset(TempAssetPath);
|
|
565
|
-
AssetDatabase.SaveAssets();
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
private static void DeleteTempReferenceAsset()
|
|
570
|
-
{
|
|
571
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempReferenceAssetPath) != null)
|
|
572
|
-
{
|
|
573
|
-
AssetDatabase.DeleteAsset(TempReferenceAssetPath);
|
|
574
|
-
AssetDatabase.SaveAssets();
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
private static void DeleteTempPrefab()
|
|
579
|
-
{
|
|
580
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempPrefabPath) != null)
|
|
581
|
-
{
|
|
582
|
-
AssetDatabase.DeleteAsset(TempPrefabPath);
|
|
583
|
-
AssetDatabase.SaveAssets();
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
private static void DeleteTempMaterial()
|
|
588
|
-
{
|
|
589
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempMaterialPath) != null)
|
|
590
|
-
{
|
|
591
|
-
AssetDatabase.DeleteAsset(TempMaterialPath);
|
|
592
|
-
AssetDatabase.SaveAssets();
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
private static void DeleteTempTextFile()
|
|
597
|
-
{
|
|
598
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempTextPath) != null)
|
|
599
|
-
{
|
|
600
|
-
AssetDatabase.DeleteAsset(TempTextPath);
|
|
601
|
-
AssetDatabase.SaveAssets();
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
private static void DeleteTempScriptFile()
|
|
606
|
-
{
|
|
607
|
-
if (AssetDatabase.LoadMainAssetAtPath(TempScriptPath) != null)
|
|
608
|
-
{
|
|
609
|
-
AssetDatabase.DeleteAsset(TempScriptPath);
|
|
610
|
-
AssetDatabase.SaveAssets();
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
private static string FindFirstFloatOrRangeProperty(Shader shader)
|
|
615
|
-
{
|
|
616
|
-
for (var index = 0; index < shader.GetPropertyCount(); index++)
|
|
617
|
-
{
|
|
618
|
-
var propertyType = shader.GetPropertyType(index);
|
|
619
|
-
if (propertyType == UnityEngine.Rendering.ShaderPropertyType.Float
|
|
620
|
-
|| propertyType == UnityEngine.Rendering.ShaderPropertyType.Range)
|
|
621
|
-
{
|
|
622
|
-
return shader.GetPropertyName(index);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
return null;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
private static string EscapeForJson(string value)
|
|
630
|
-
{
|
|
631
|
-
return value
|
|
632
|
-
.Replace("\\", "\\\\")
|
|
633
|
-
.Replace("\"", "\\\"");
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
private static Dictionary<string, object> FindAssetMatch(List<object> matches, string expectedPath, string expectedName)
|
|
637
|
-
{
|
|
638
|
-
foreach (var entry in matches)
|
|
639
|
-
{
|
|
640
|
-
var match = (Dictionary<string, object>)entry;
|
|
641
|
-
var path = match.ContainsKey("path") ? match["path"].ToString() : string.Empty;
|
|
642
|
-
var name = match.ContainsKey("name") ? match["name"].ToString() : string.Empty;
|
|
643
|
-
if (path == expectedPath && name == expectedName)
|
|
644
|
-
return match;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
return null;
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
private sealed class SearchRootAsset : ScriptableObject
|
|
651
|
-
{
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
private sealed class SearchNestedAsset : ScriptableObject
|
|
655
|
-
{
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
private sealed class BatchWritableAsset : ScriptableObject
|
|
659
|
-
{
|
|
660
|
-
public int maxPlayers;
|
|
661
|
-
public float spawnDelay;
|
|
662
|
-
public SearchRootAsset referenceAsset;
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
private sealed class ReferenceComponent : MonoBehaviour
|
|
666
|
-
{
|
|
667
|
-
public SearchRootAsset referenceAsset;
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
}
|