InstantiatePrefabCommandTests.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using NUnit.Framework;
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System.IO;
  5. using LLM.Editor.Commands;
  6. using LLM.Editor.Data;
  7. using LLM.Editor.Helper;
  8. namespace LLM.Editor.Tests.Unit
  9. {
  10. [TestFixture]
  11. public class InstantiatePrefabCommandTests
  12. {
  13. private const string TestPrefabName = "TempTestPrefab.prefab";
  14. private string _testPrefabPath;
  15. private GameObject _prefabObject;
  16. private CommandContext _context;
  17. private GameObject _instantiatedObject;
  18. [SetUp]
  19. public void SetUp()
  20. {
  21. _context = new CommandContext();
  22. // Create a dummy prefab asset
  23. _testPrefabPath = Path.Combine("Assets", TestPrefabName);
  24. var sourceObject = new GameObject("MyPrefab");
  25. _prefabObject = PrefabUtility.SaveAsPrefabAsset(sourceObject, _testPrefabPath);
  26. Object.DestroyImmediate(sourceObject);
  27. Assert.IsNotNull(_prefabObject, "Setup failed: Could not create test prefab.");
  28. // Register the prefab asset with the context
  29. var guid = AssetDatabase.AssetPathToGUID(_testPrefabPath);
  30. var pid = new PersistentIdentifier { logicalName = "my_prefab_1", guid = guid };
  31. _context.IdentifierMap["my_prefab_1"] = pid;
  32. }
  33. [TearDown]
  34. public void TearDown()
  35. {
  36. // Clean up the instantiated object and the prefab asset
  37. if (_instantiatedObject != null)
  38. {
  39. Object.DestroyImmediate(_instantiatedObject);
  40. }
  41. if (File.Exists(_testPrefabPath))
  42. {
  43. AssetDatabase.DeleteAsset(_testPrefabPath);
  44. }
  45. }
  46. [Test]
  47. public void Execute_WithValidPrefabId_InstantiatesObjectAndCreatesNewLogicalName()
  48. {
  49. // Arrange
  50. var parameters = new InstantiatePrefabParams { prefabIdentifier = "my_prefab_1" };
  51. var command = new InstantiatePrefabCommand(parameters.ToJson());
  52. // Act
  53. var outcome = command.Execute(_context);
  54. // Assert
  55. Assert.AreEqual(CommandOutcome.Success, outcome);
  56. // Check that a *new* logical name for the instance was created
  57. Assert.IsNotNull(_context.CurrentSubject);
  58. var newLogicalName = (string)_context.CurrentSubject;
  59. Assert.AreNotEqual("my_prefab_1", newLogicalName);
  60. Assert.IsTrue(newLogicalName.StartsWith(_prefabObject.name));
  61. Assert.IsTrue(_context.IdentifierMap.ContainsKey(newLogicalName));
  62. // Find the instantiated object using the path registered by the command itself
  63. var instancePid = _context.IdentifierMap[newLogicalName];
  64. _instantiatedObject = EditorUtility.InstanceIDToObject(instancePid.instanceID) as GameObject;
  65. Assert.IsNotNull(_instantiatedObject, "Prefab should be instantiated and found via its registered instance ID.");
  66. }
  67. [Test]
  68. public void Execute_WithInvalidPrefabId_ReturnsError()
  69. {
  70. // Arrange
  71. var parameters = new InstantiatePrefabParams { prefabIdentifier = "invalid_prefab_id" };
  72. var command = new InstantiatePrefabCommand(parameters.ToJson());
  73. // Act
  74. var outcome = command.Execute(_context);
  75. // Assert
  76. Assert.AreEqual(CommandOutcome.Error, outcome);
  77. Assert.IsNotNull(_context.ErrorMessage);
  78. Assert.IsTrue(_context.ErrorMessage.Contains("Could not resolve prefab"));
  79. }
  80. }
  81. }