AddComponentToAssetCommandTests.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. public class MyTestCustomComponent : MonoBehaviour {}
  11. [TestFixture]
  12. public class AddComponentToAssetCommandTests
  13. {
  14. private const string TestPrefabPath = "Assets/LLM/Editor/Tests/Prefabs/TempTestPrefab.prefab";
  15. private GameObject _testSceneObject;
  16. private CommandContext _context;
  17. [SetUp]
  18. public void SetUp()
  19. {
  20. // Create a scene object for scene-based tests, with a child
  21. _testSceneObject = new GameObject("TestSceneObject");
  22. var sceneChild = new GameObject("SceneChild");
  23. sceneChild.transform.SetParent(_testSceneObject.transform);
  24. // Create a prefab asset for prefab-based tests
  25. var prefabSourceObject = new GameObject("TestPrefab");
  26. var prefabChild = new GameObject("PrefabChild");
  27. prefabChild.transform.SetParent(prefabSourceObject.transform);
  28. PrefabUtility.SaveAsPrefabAsset(prefabSourceObject, TestPrefabPath);
  29. Object.DestroyImmediate(prefabSourceObject);
  30. // Set up the context with identifiers for both the scene object and the prefab asset
  31. _context = new CommandContext
  32. {
  33. IdentifierMap =
  34. {
  35. [_testSceneObject.GetInstanceID().ToString()] = _testSceneObject.GetInstanceID().ToString(),
  36. [AssetDatabase.AssetPathToGUID(TestPrefabPath)] = AssetDatabase.AssetPathToGUID(TestPrefabPath)
  37. }
  38. };
  39. }
  40. [TearDown]
  41. public void TearDown()
  42. {
  43. if (_testSceneObject != null) Object.DestroyImmediate(_testSceneObject);
  44. AssetDatabase.DeleteAsset(TestPrefabPath);
  45. }
  46. private static AddComponentToAssetCommand CreateCommand(string targetId, string scriptName, string childPath = null)
  47. {
  48. var parameters = new AddComponentParams
  49. {
  50. targetIdentifier = targetId,
  51. scriptName = scriptName,
  52. childPath = childPath
  53. };
  54. return new AddComponentToAssetCommand(parameters.ToJson());
  55. }
  56. [Test]
  57. public void Execute_OnSceneObjectRoot_AddsComponentSuccessfully()
  58. {
  59. // Arrange
  60. var command = CreateCommand(_testSceneObject.GetInstanceID().ToString(), "UnityEngine.Rigidbody");
  61. // Act
  62. var outcome = command.Execute(_context);
  63. // Assert
  64. Assert.AreEqual(CommandOutcome.Success, outcome);
  65. Assert.IsNotNull(_testSceneObject.GetComponent<Rigidbody>());
  66. }
  67. [Test]
  68. public void Execute_OnSceneObjectWithValidChildPath_AddsComponentToChild()
  69. {
  70. // Arrange
  71. var command = CreateCommand(_testSceneObject.GetInstanceID().ToString(), "UnityEngine.BoxCollider", "SceneChild");
  72. // Act
  73. var outcome = command.Execute(_context);
  74. // Assert
  75. var childObject = _testSceneObject.transform.Find("SceneChild");
  76. Assert.AreEqual(CommandOutcome.Success, outcome);
  77. Assert.IsNotNull(childObject.GetComponent<BoxCollider>());
  78. Assert.IsNull(_testSceneObject.GetComponent<BoxCollider>()); // Ensure it wasn't added to the parent
  79. }
  80. [Test]
  81. public void Execute_OnPrefabRoot_AddsComponentToRootInAsset()
  82. {
  83. // Arrange
  84. var prefabGuid = AssetDatabase.AssetPathToGUID(TestPrefabPath);
  85. var command = CreateCommand(prefabGuid, "UnityEngine.SphereCollider");
  86. // Act
  87. var outcome = command.Execute(_context);
  88. // Assert
  89. Assert.AreEqual(CommandOutcome.Success, outcome);
  90. var loadedPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(TestPrefabPath);
  91. Assert.IsNotNull(loadedPrefab.GetComponent<SphereCollider>(), "Component should be added to the prefab asset's root.");
  92. }
  93. [Test]
  94. public void Execute_OnPrefabWithValidChildPath_AddsComponentToChildInAsset()
  95. {
  96. // Arrange
  97. var prefabGuid = AssetDatabase.AssetPathToGUID(TestPrefabPath);
  98. var command = CreateCommand(prefabGuid, "UnityEngine.CapsuleCollider", "PrefabChild");
  99. // Act
  100. var outcome = command.Execute(_context);
  101. // Assert
  102. Assert.AreEqual(CommandOutcome.Success, outcome);
  103. var loadedPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(TestPrefabPath);
  104. var childInPrefab = loadedPrefab.transform.Find("PrefabChild");
  105. Assert.IsNotNull(childInPrefab, "Child object should exist in prefab.");
  106. Assert.IsNotNull(childInPrefab.GetComponent<CapsuleCollider>(), "Component should be added to the child within the prefab asset.");
  107. }
  108. [Test]
  109. public void Execute_WithInvalidScriptName_ReturnsError()
  110. {
  111. // Arrange
  112. var command = CreateCommand(_testSceneObject.GetInstanceID().ToString(), "Invalid.NonExistent.Component");
  113. // Act
  114. var outcome = command.Execute(_context);
  115. // Assert
  116. Assert.AreEqual(CommandOutcome.Error, outcome);
  117. Assert.IsNotNull(_context.ErrorMessage);
  118. Assert.IsTrue(_context.ErrorMessage.Contains("Could not find script type"));
  119. }
  120. }
  121. }