2025-09-27 07:28:56 +08:00
|
|
|
using System.IO;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using NUnit.Framework;
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
using UnityEditor.SceneManagement;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using MCPForUnity.Editor.Tools.Prefabs;
|
|
|
|
|
|
|
|
|
|
namespace MCPForUnityTests.Editor.Tools
|
|
|
|
|
{
|
|
|
|
|
public class ManagePrefabsTests
|
|
|
|
|
{
|
|
|
|
|
private const string TempDirectory = "Assets/Temp/ManagePrefabsTests";
|
|
|
|
|
|
|
|
|
|
[SetUp]
|
|
|
|
|
public void SetUp()
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
EnsureTempDirectoryExists();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[TearDown]
|
|
|
|
|
public void TearDown()
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[OneTimeTearDown]
|
|
|
|
|
public void CleanupAll()
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
if (AssetDatabase.IsValidFolder(TempDirectory))
|
|
|
|
|
{
|
|
|
|
|
AssetDatabase.DeleteAsset(TempDirectory);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void OpenStage_OpensPrefabInIsolation()
|
|
|
|
|
{
|
|
|
|
|
string prefabPath = CreateTestPrefab("OpenStageCube");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var openParams = new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "open_stage",
|
|
|
|
|
["prefabPath"] = prefabPath
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var openResult = ToJObject(ManagePrefabs.HandleCommand(openParams));
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(openResult.Value<bool>("success"), "open_stage should succeed for a valid prefab.");
|
|
|
|
|
|
Move Get commands to editor resources + Run Python tests every update (#368)
* Add a function to reload the domain
Closes #357
* feat: restructure server instructions into workflow-focused format
- Reorganized instructions from flat bullet list into categorized workflow sections
- Emphasized critical script management workflow with numbered steps
- Improved readability and scannability for AI agents using the MCP server
It doesn't make sense to repeat the fucnction tools, they're already parsed
* docs: reorder tool list alphabetically in README + add reload_domain tool
* feat: add Unity editor state and project info resources
- Implemented resources for querying active tool, editor state, prefab stage, selection, and open windows
- Added project configuration resources for layers and project metadata
- Organized new resources into Editor and Project namespaces for better structure
* feat: clarify script management workflow in system prompt
- Expanded guidance to include scripts created by any tool, not just manage_script
- Added "etc" to tools examples for better clarity
* refactor: remove reload_domain tool and update script management workflow
- Removed reload_domain tool as Unity automatically recompiles scripts when modified
- Updated script management instructions to rely on editor_state polling and console checking instead of manual domain reload
- Simplified workflow by removing unnecessary manual recompilation step
* Change name of menu items resource as the LLM seems it
* refactor: reorganize tests into src/tests/integration directory
- Moved all test files from root tests/ to MCPForUnity/UnityMcpServer~/src/tests/integration/ for better organization
- Added conftest.py with telemetry and dependency stubs to simplify test setup
- Removed redundant path manipulation and module loading code from individual test files
* feat: expand Unity test workflow triggers
- Run tests on all branches instead of only main
- Add pull request trigger to catch issues before merge
- Maintain path filtering to run only when relevant files change
* chore: add GitHub Actions workflow for Python tests
- Configured automated testing on push and pull requests using pytest
- Set up uv for dependency management and Python 3.10 environment
- Added test results artifact upload for debugging failed runs
* refactor: update import path for fastmcp Context
* docs: update development setup instructions to use uv
- Changed installation commands from pip to uv pip for better dependency management
- Updated test running instructions to use uv run pytest
- Added examples for running integration and unit tests separately
* Formatting [skip ci]
* refactor: optimize CI workflow with path filters and dependency installation
- Added path filters to only trigger tests when Python source or workflow files change
- Split dependency installation into sync and dev install steps for better clarity
- Fixed YAML indentation for improved readability
* Update .github/workflows/python-tests.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: standardize test mode values to match Unity's naming convention
- Changed default mode from "edit" to "EditMode" in C# code
- Updated Python tool to use "EditMode" and "PlayMode" instead of lowercase variants
* refactor: convert test imports to relative imports
- Changed absolute imports to relative imports in integration tests for better package structure
- Removed test packages from pyproject.toml package list
* refactor: use Field with default_factory for mutable default in TagsResponse
* refactor: remove duplicate PrefabStageUtility call
* Update this as well [skip ci]
* Update MCPForUnity/UnityMcpServer~/src/tests/integration/test_script_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* chore: remove pull_request triggers from test workflows [skip ci]
It's already covered by pushes
* refactor: update resource function return types to include MCPResponse union
* refactor: remove manual domain reload tool
- Removed reload_domain tool as Unity handles script recompilation automatically
- Updated documentation to reflect automatic compilation workflow
- Simplified script management workflow instructions in server description
* refactor: add context support to resource handlers
- Updated all resource handlers to accept Context parameter for Unity instance routing
- Replaced direct async_send_command_with_retry calls with async_send_with_unity_instance wrapper
- Added imports for get_unity_instance_from_context and async_send_with_unity_instance helpers
* fix: correct grammar in menu items documentation
* docs: update README with expanded tools and resources documentation
- Added new tools: manage_prefabs, create_script, delete_script, get_sha
- Added new resources: editor state, windows, project info, layers, and tags
- Clarified manage_script as compatibility router with recommendation to use newer edit tools
- Fixed run_test to run_tests for consistency
* refactor: convert unity_instances function to async [skip ci]
- Changed function signature from synchronous to async
- Added await keywords to ctx.info() and ctx.error() calls to properly handle async context methods
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-11-06 04:06:48 +08:00
|
|
|
UnityEditor.SceneManagement.PrefabStage stage = PrefabStageUtility.GetCurrentPrefabStage();
|
2025-09-27 07:28:56 +08:00
|
|
|
Assert.IsNotNull(stage, "Prefab stage should be open after open_stage.");
|
|
|
|
|
Assert.AreEqual(prefabPath, stage.assetPath, "Opened stage should match prefab path.");
|
|
|
|
|
|
Move Get commands to editor resources + Run Python tests every update (#368)
* Add a function to reload the domain
Closes #357
* feat: restructure server instructions into workflow-focused format
- Reorganized instructions from flat bullet list into categorized workflow sections
- Emphasized critical script management workflow with numbered steps
- Improved readability and scannability for AI agents using the MCP server
It doesn't make sense to repeat the fucnction tools, they're already parsed
* docs: reorder tool list alphabetically in README + add reload_domain tool
* feat: add Unity editor state and project info resources
- Implemented resources for querying active tool, editor state, prefab stage, selection, and open windows
- Added project configuration resources for layers and project metadata
- Organized new resources into Editor and Project namespaces for better structure
* feat: clarify script management workflow in system prompt
- Expanded guidance to include scripts created by any tool, not just manage_script
- Added "etc" to tools examples for better clarity
* refactor: remove reload_domain tool and update script management workflow
- Removed reload_domain tool as Unity automatically recompiles scripts when modified
- Updated script management instructions to rely on editor_state polling and console checking instead of manual domain reload
- Simplified workflow by removing unnecessary manual recompilation step
* Change name of menu items resource as the LLM seems it
* refactor: reorganize tests into src/tests/integration directory
- Moved all test files from root tests/ to MCPForUnity/UnityMcpServer~/src/tests/integration/ for better organization
- Added conftest.py with telemetry and dependency stubs to simplify test setup
- Removed redundant path manipulation and module loading code from individual test files
* feat: expand Unity test workflow triggers
- Run tests on all branches instead of only main
- Add pull request trigger to catch issues before merge
- Maintain path filtering to run only when relevant files change
* chore: add GitHub Actions workflow for Python tests
- Configured automated testing on push and pull requests using pytest
- Set up uv for dependency management and Python 3.10 environment
- Added test results artifact upload for debugging failed runs
* refactor: update import path for fastmcp Context
* docs: update development setup instructions to use uv
- Changed installation commands from pip to uv pip for better dependency management
- Updated test running instructions to use uv run pytest
- Added examples for running integration and unit tests separately
* Formatting [skip ci]
* refactor: optimize CI workflow with path filters and dependency installation
- Added path filters to only trigger tests when Python source or workflow files change
- Split dependency installation into sync and dev install steps for better clarity
- Fixed YAML indentation for improved readability
* Update .github/workflows/python-tests.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: standardize test mode values to match Unity's naming convention
- Changed default mode from "edit" to "EditMode" in C# code
- Updated Python tool to use "EditMode" and "PlayMode" instead of lowercase variants
* refactor: convert test imports to relative imports
- Changed absolute imports to relative imports in integration tests for better package structure
- Removed test packages from pyproject.toml package list
* refactor: use Field with default_factory for mutable default in TagsResponse
* refactor: remove duplicate PrefabStageUtility call
* Update this as well [skip ci]
* Update MCPForUnity/UnityMcpServer~/src/tests/integration/test_script_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* chore: remove pull_request triggers from test workflows [skip ci]
It's already covered by pushes
* refactor: update resource function return types to include MCPResponse union
* refactor: remove manual domain reload tool
- Removed reload_domain tool as Unity handles script recompilation automatically
- Updated documentation to reflect automatic compilation workflow
- Simplified script management workflow instructions in server description
* refactor: add context support to resource handlers
- Updated all resource handlers to accept Context parameter for Unity instance routing
- Replaced direct async_send_command_with_retry calls with async_send_with_unity_instance wrapper
- Added imports for get_unity_instance_from_context and async_send_with_unity_instance helpers
* fix: correct grammar in menu items documentation
* docs: update README with expanded tools and resources documentation
- Added new tools: manage_prefabs, create_script, delete_script, get_sha
- Added new resources: editor state, windows, project info, layers, and tags
- Clarified manage_script as compatibility router with recommendation to use newer edit tools
- Fixed run_test to run_tests for consistency
* refactor: convert unity_instances function to async [skip ci]
- Changed function signature from synchronous to async
- Added await keywords to ctx.info() and ctx.error() calls to properly handle async context methods
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-11-06 04:06:48 +08:00
|
|
|
var stageInfo = ToJObject(MCPForUnity.Editor.Resources.Editor.PrefabStage.HandleCommand(new JObject()));
|
2025-09-27 07:28:56 +08:00
|
|
|
Assert.IsTrue(stageInfo.Value<bool>("success"), "get_prefab_stage should succeed when stage is open.");
|
|
|
|
|
|
|
|
|
|
var data = stageInfo["data"] as JObject;
|
|
|
|
|
Assert.IsNotNull(data, "Stage info should include data payload.");
|
|
|
|
|
Assert.IsTrue(data.Value<bool>("isOpen"));
|
|
|
|
|
Assert.AreEqual(prefabPath, data.Value<string>("assetPath"));
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
AssetDatabase.DeleteAsset(prefabPath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void CloseStage_ReturnsSuccess_WhenNoStageOpen()
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
var closeResult = ToJObject(ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "close_stage"
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(closeResult.Value<bool>("success"), "close_stage should succeed even if no stage is open.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void CloseStage_ClosesOpenPrefabStage()
|
|
|
|
|
{
|
|
|
|
|
string prefabPath = CreateTestPrefab("CloseStageCube");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "open_stage",
|
|
|
|
|
["prefabPath"] = prefabPath
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var closeResult = ToJObject(ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "close_stage"
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(closeResult.Value<bool>("success"), "close_stage should succeed when stage is open.");
|
|
|
|
|
Assert.IsNull(PrefabStageUtility.GetCurrentPrefabStage(), "Prefab stage should be closed after close_stage.");
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
AssetDatabase.DeleteAsset(prefabPath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void SaveOpenStage_SavesDirtyChanges()
|
|
|
|
|
{
|
|
|
|
|
string prefabPath = CreateTestPrefab("SaveStageCube");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "open_stage",
|
|
|
|
|
["prefabPath"] = prefabPath
|
|
|
|
|
});
|
|
|
|
|
|
Move Get commands to editor resources + Run Python tests every update (#368)
* Add a function to reload the domain
Closes #357
* feat: restructure server instructions into workflow-focused format
- Reorganized instructions from flat bullet list into categorized workflow sections
- Emphasized critical script management workflow with numbered steps
- Improved readability and scannability for AI agents using the MCP server
It doesn't make sense to repeat the fucnction tools, they're already parsed
* docs: reorder tool list alphabetically in README + add reload_domain tool
* feat: add Unity editor state and project info resources
- Implemented resources for querying active tool, editor state, prefab stage, selection, and open windows
- Added project configuration resources for layers and project metadata
- Organized new resources into Editor and Project namespaces for better structure
* feat: clarify script management workflow in system prompt
- Expanded guidance to include scripts created by any tool, not just manage_script
- Added "etc" to tools examples for better clarity
* refactor: remove reload_domain tool and update script management workflow
- Removed reload_domain tool as Unity automatically recompiles scripts when modified
- Updated script management instructions to rely on editor_state polling and console checking instead of manual domain reload
- Simplified workflow by removing unnecessary manual recompilation step
* Change name of menu items resource as the LLM seems it
* refactor: reorganize tests into src/tests/integration directory
- Moved all test files from root tests/ to MCPForUnity/UnityMcpServer~/src/tests/integration/ for better organization
- Added conftest.py with telemetry and dependency stubs to simplify test setup
- Removed redundant path manipulation and module loading code from individual test files
* feat: expand Unity test workflow triggers
- Run tests on all branches instead of only main
- Add pull request trigger to catch issues before merge
- Maintain path filtering to run only when relevant files change
* chore: add GitHub Actions workflow for Python tests
- Configured automated testing on push and pull requests using pytest
- Set up uv for dependency management and Python 3.10 environment
- Added test results artifact upload for debugging failed runs
* refactor: update import path for fastmcp Context
* docs: update development setup instructions to use uv
- Changed installation commands from pip to uv pip for better dependency management
- Updated test running instructions to use uv run pytest
- Added examples for running integration and unit tests separately
* Formatting [skip ci]
* refactor: optimize CI workflow with path filters and dependency installation
- Added path filters to only trigger tests when Python source or workflow files change
- Split dependency installation into sync and dev install steps for better clarity
- Fixed YAML indentation for improved readability
* Update .github/workflows/python-tests.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: standardize test mode values to match Unity's naming convention
- Changed default mode from "edit" to "EditMode" in C# code
- Updated Python tool to use "EditMode" and "PlayMode" instead of lowercase variants
* refactor: convert test imports to relative imports
- Changed absolute imports to relative imports in integration tests for better package structure
- Removed test packages from pyproject.toml package list
* refactor: use Field with default_factory for mutable default in TagsResponse
* refactor: remove duplicate PrefabStageUtility call
* Update this as well [skip ci]
* Update MCPForUnity/UnityMcpServer~/src/tests/integration/test_script_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* chore: remove pull_request triggers from test workflows [skip ci]
It's already covered by pushes
* refactor: update resource function return types to include MCPResponse union
* refactor: remove manual domain reload tool
- Removed reload_domain tool as Unity handles script recompilation automatically
- Updated documentation to reflect automatic compilation workflow
- Simplified script management workflow instructions in server description
* refactor: add context support to resource handlers
- Updated all resource handlers to accept Context parameter for Unity instance routing
- Replaced direct async_send_command_with_retry calls with async_send_with_unity_instance wrapper
- Added imports for get_unity_instance_from_context and async_send_with_unity_instance helpers
* fix: correct grammar in menu items documentation
* docs: update README with expanded tools and resources documentation
- Added new tools: manage_prefabs, create_script, delete_script, get_sha
- Added new resources: editor state, windows, project info, layers, and tags
- Clarified manage_script as compatibility router with recommendation to use newer edit tools
- Fixed run_test to run_tests for consistency
* refactor: convert unity_instances function to async [skip ci]
- Changed function signature from synchronous to async
- Added await keywords to ctx.info() and ctx.error() calls to properly handle async context methods
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-11-06 04:06:48 +08:00
|
|
|
UnityEditor.SceneManagement.PrefabStage stage = PrefabStageUtility.GetCurrentPrefabStage();
|
2025-09-27 07:28:56 +08:00
|
|
|
Assert.IsNotNull(stage, "Stage should be open before modifying.");
|
|
|
|
|
|
|
|
|
|
stage.prefabContentsRoot.transform.localScale = new Vector3(2f, 2f, 2f);
|
|
|
|
|
|
|
|
|
|
var saveResult = ToJObject(ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "save_open_stage"
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(saveResult.Value<bool>("success"), "save_open_stage should succeed when stage is open.");
|
|
|
|
|
Assert.IsFalse(stage.scene.isDirty, "Stage scene should not be dirty after saving.");
|
|
|
|
|
|
|
|
|
|
GameObject reloaded = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
|
|
|
|
|
Assert.AreEqual(new Vector3(2f, 2f, 2f), reloaded.transform.localScale, "Saved prefab asset should include changes from open stage.");
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
AssetDatabase.DeleteAsset(prefabPath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void SaveOpenStage_ReturnsError_WhenNoStageOpen()
|
|
|
|
|
{
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
|
|
|
|
|
var saveResult = ToJObject(ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "save_open_stage"
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Assert.IsFalse(saveResult.Value<bool>("success"), "save_open_stage should fail when no stage is open.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void CreateFromGameObject_CreatesPrefabAndLinksInstance()
|
|
|
|
|
{
|
|
|
|
|
EnsureTempDirectoryExists();
|
|
|
|
|
StageUtility.GoToMainStage();
|
|
|
|
|
|
|
|
|
|
string prefabPath = Path.Combine(TempDirectory, "SceneObjectSaved.prefab").Replace('\\', '/');
|
|
|
|
|
GameObject sceneObject = new GameObject("ScenePrefabSource");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var result = ToJObject(ManagePrefabs.HandleCommand(new JObject
|
|
|
|
|
{
|
|
|
|
|
["action"] = "create_from_gameobject",
|
|
|
|
|
["target"] = sceneObject.name,
|
|
|
|
|
["prefabPath"] = prefabPath
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(result.Value<bool>("success"), "create_from_gameobject should succeed for a valid scene object.");
|
|
|
|
|
|
|
|
|
|
var data = result["data"] as JObject;
|
|
|
|
|
Assert.IsNotNull(data, "Response data should include prefab information.");
|
|
|
|
|
|
|
|
|
|
string savedPath = data.Value<string>("prefabPath");
|
|
|
|
|
Assert.AreEqual(prefabPath, savedPath, "Returned prefab path should match the requested path.");
|
|
|
|
|
|
|
|
|
|
GameObject prefabAsset = AssetDatabase.LoadAssetAtPath<GameObject>(savedPath);
|
|
|
|
|
Assert.IsNotNull(prefabAsset, "Prefab asset should exist at the saved path.");
|
|
|
|
|
|
|
|
|
|
int instanceId = data.Value<int>("instanceId");
|
|
|
|
|
var linkedInstance = EditorUtility.InstanceIDToObject(instanceId) as GameObject;
|
|
|
|
|
Assert.IsNotNull(linkedInstance, "Linked instance should resolve from instanceId.");
|
|
|
|
|
Assert.AreEqual(savedPath, PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(linkedInstance), "Instance should be connected to the new prefab.");
|
|
|
|
|
|
|
|
|
|
sceneObject = linkedInstance;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
if (AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(prefabPath) != null)
|
|
|
|
|
{
|
|
|
|
|
AssetDatabase.DeleteAsset(prefabPath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sceneObject != null)
|
|
|
|
|
{
|
|
|
|
|
if (PrefabUtility.IsPartOfPrefabInstance(sceneObject))
|
|
|
|
|
{
|
|
|
|
|
PrefabUtility.UnpackPrefabInstance(
|
|
|
|
|
sceneObject,
|
|
|
|
|
PrefabUnpackMode.Completely,
|
|
|
|
|
InteractionMode.AutomatedAction
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
UnityEngine.Object.DestroyImmediate(sceneObject, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string CreateTestPrefab(string name)
|
|
|
|
|
{
|
|
|
|
|
EnsureTempDirectoryExists();
|
|
|
|
|
|
|
|
|
|
GameObject temp = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
|
|
|
temp.name = name;
|
|
|
|
|
|
|
|
|
|
string path = Path.Combine(TempDirectory, name + ".prefab").Replace('\\', '/');
|
|
|
|
|
PrefabUtility.SaveAsPrefabAsset(temp, path, out bool success);
|
|
|
|
|
UnityEngine.Object.DestroyImmediate(temp);
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(success, "PrefabUtility.SaveAsPrefabAsset should succeed for test prefab.");
|
|
|
|
|
return path;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void EnsureTempDirectoryExists()
|
|
|
|
|
{
|
|
|
|
|
if (!AssetDatabase.IsValidFolder("Assets/Temp"))
|
|
|
|
|
{
|
|
|
|
|
AssetDatabase.CreateFolder("Assets", "Temp");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!AssetDatabase.IsValidFolder(TempDirectory))
|
|
|
|
|
{
|
|
|
|
|
AssetDatabase.CreateFolder("Assets/Temp", "ManagePrefabsTests");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static JObject ToJObject(object result)
|
|
|
|
|
{
|
|
|
|
|
return result as JObject ?? JObject.FromObject(result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|