CreateGameObjectCommandTests.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using UnityEngine;
  2. using NUnit.Framework;
  3. using LLM.Editor.Data;
  4. using LLM.Editor.Helper;
  5. using LLM.Editor.Commands;
  6. using System.Collections.Generic;
  7. namespace LLM.Editor.Tests.Unit
  8. {
  9. [TestFixture]
  10. public class CreateGameObjectCommandTests
  11. {
  12. private CommandContext _context;
  13. private List<GameObject> _objectsToCleanUp;
  14. [SetUp]
  15. public void SetUp()
  16. {
  17. _context = new CommandContext();
  18. _objectsToCleanUp = new List<GameObject>();
  19. }
  20. [TearDown]
  21. public void TearDown()
  22. {
  23. foreach (var obj in _objectsToCleanUp)
  24. {
  25. if (obj != null)
  26. {
  27. Object.DestroyImmediate(obj);
  28. }
  29. }
  30. }
  31. private GameObject FindObjectInScene(string name)
  32. {
  33. var obj = GameObject.Find(name);
  34. if (obj != null)
  35. {
  36. _objectsToCleanUp.Add(obj);
  37. }
  38. return obj;
  39. }
  40. [Test]
  41. public void Execute_WithValidName_CreatesEmptyGameObject()
  42. {
  43. // Arrange
  44. var parameters = new CreateGameObjectParams { gameObjectName = "MyEmptyObject", logicalName = "TestEmpty_1" };
  45. var command = new CreateGameObjectCommand(parameters.ToJson());
  46. // Act
  47. var outcome = command.Execute(_context);
  48. var createdObject = FindObjectInScene("MyEmptyObject");
  49. // Assert
  50. Assert.AreEqual(CommandOutcome.Success, outcome);
  51. Assert.IsNotNull(createdObject, "GameObject should be created in the scene.");
  52. Assert.AreEqual("MyEmptyObject", createdObject.name);
  53. Assert.AreEqual("TestEmpty_1", _context.CurrentSubject, "Context's current subject should be the logical name.");
  54. Assert.IsTrue(_context.IdentifierMap.ContainsKey("TestEmpty_1"), "Identifier map should contain the logical name.");
  55. }
  56. [Test]
  57. public void Execute_WithValidPrimitiveType_CreatesPrimitive()
  58. {
  59. // Arrange
  60. var parameters = new CreateGameObjectParams { gameObjectName = "MyCube", logicalName = "TestCube_1", primitiveType = "Cube" };
  61. var command = new CreateGameObjectCommand(parameters.ToJson());
  62. // Act
  63. var outcome = command.Execute(_context);
  64. var createdObject = FindObjectInScene("MyCube");
  65. // Assert
  66. Assert.AreEqual(CommandOutcome.Success, outcome);
  67. Assert.IsNotNull(createdObject);
  68. Assert.AreEqual("MyCube", createdObject.name);
  69. Assert.IsNotNull(createdObject.GetComponent<MeshFilter>(), "Created object should have a MeshFilter component.");
  70. Assert.AreEqual("TestCube_1", _context.CurrentSubject);
  71. }
  72. [Test]
  73. public void Execute_WithInvalidPrimitiveType_ReturnsError()
  74. {
  75. // Arrange
  76. var parameters = new CreateGameObjectParams { gameObjectName = "MyInvalid", logicalName = "TestInvalid_1", primitiveType = "InvalidShape" };
  77. var command = new CreateGameObjectCommand(parameters.ToJson());
  78. // Act
  79. var outcome = command.Execute(_context);
  80. var createdObject = FindObjectInScene("MyInvalid");
  81. // Assert
  82. Assert.AreEqual(CommandOutcome.Error, outcome);
  83. Assert.IsNull(createdObject, "No GameObject should be created on error.");
  84. Assert.IsNotNull(_context.ErrorMessage);
  85. Assert.IsTrue(_context.ErrorMessage.Contains("Invalid primitive type"));
  86. }
  87. [Test]
  88. public void Execute_WithMissingGameObjectName_ReturnsError()
  89. {
  90. // Arrange
  91. var parameters = new CreateGameObjectParams { gameObjectName = "", logicalName = "TestMissingName_1" };
  92. var command = new CreateGameObjectCommand(parameters.ToJson());
  93. // Act
  94. var outcome = command.Execute(_context);
  95. // Assert
  96. Assert.AreEqual(CommandOutcome.Error, outcome);
  97. Assert.IsNotNull(_context.ErrorMessage);
  98. Assert.IsTrue(_context.ErrorMessage.Contains("A name for the GameObject is required"));
  99. }
  100. [Test]
  101. public void Execute_WithoutLogicalName_GeneratesAndSavesOne()
  102. {
  103. // Arrange
  104. var parameters = new CreateGameObjectParams { gameObjectName = "MyObjectWithGeneratedName" };
  105. var command = new CreateGameObjectCommand(parameters.ToJson());
  106. // Act
  107. var outcome = command.Execute(_context);
  108. var createdObject = FindObjectInScene("MyObjectWithGeneratedName");
  109. // Assert
  110. Assert.AreEqual(CommandOutcome.Success, outcome);
  111. Assert.IsNotNull(createdObject);
  112. Assert.IsNotNull(_context.CurrentSubject, "A logical name should have been generated and set as the subject.");
  113. Assert.IsTrue(((string)_context.CurrentSubject).StartsWith("MyObjectWithGeneratedName_"));
  114. Assert.IsTrue(_context.IdentifierMap.ContainsKey((string)_context.CurrentSubject));
  115. }
  116. }
  117. }