using System.Text.RegularExpressions; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; namespace Watermelon.Tests { /// /// Tests for PoolGeneric<T>: typed component retrieval, lifecycle, and reuse. /// Uses TestBehaviour (defined in PoolTestBase) as the component type. /// [TestFixture] public class PoolGenericTests : PoolTestBase { private Transform _container; [SetUp] public void SetUp() => _container = CreateContainer(); // ─── Init ───────────────────────────────────────────────────────────── [Test] public void Init_RegistersPool_InPoolManager() { new PoolGeneric(CreatePrefab(), "GenInit", _container); Assert.IsTrue(PoolManager.HasPool("GenInit")); } [Test] public void Init_MissingComponent_DoesNotRegister() { LogAssert.Expect(LogType.Error, new Regex("no attached component")); new PoolGeneric(CreatePrefab("NoBehaviour"), "GenMissing", _container); Assert.IsFalse(PoolManager.HasPool("GenMissing")); } [Test] public void Init_NullPrefab_DoesNotRegister() { LogAssert.Expect(LogType.Error, new Regex("no attached prefab")); new PoolGeneric(null, "GenNullPrefab", _container); Assert.IsFalse(PoolManager.HasPool("GenNullPrefab")); } // ─── GetPooledObject ────────────────────────────────────────────────── [Test] public void GetPooledObject_ReturnsActiveObject() { var pool = new PoolGeneric(CreatePrefab(), "GenGetObj", _container); var go = pool.GetPooledObject(); Assert.IsNotNull(go); Assert.IsTrue(go.activeSelf); } [Test] public void GetPooledObject_ReturnedObject_HasRequiredComponent() { var pool = new PoolGeneric(CreatePrefab(), "GenHasComp", _container); var go = pool.GetPooledObject(); Assert.IsNotNull(go.GetComponent()); } [Test] public void GetPooledObject_ReusesDeactivatedObject() { var pool = new PoolGeneric(CreatePrefab(), "GenReuse", _container); var go1 = pool.GetPooledObject(); go1.SetActive(false); var go2 = pool.GetPooledObject(); Assert.AreSame(go1, go2); } [Test] public void GetPooledObject_AllActive_CreatesDistinctObject() { var pool = new PoolGeneric(CreatePrefab(), "GenDistinct", _container); var go1 = pool.GetPooledObject(); var go2 = pool.GetPooledObject(); Assert.AreNotSame(go1, go2); } // ─── GetPooledComponent ─────────────────────────────────────────────── [Test] public void GetPooledComponent_ReturnsTypedComponent() { var pool = new PoolGeneric(CreatePrefab(), "GenTyped", _container); var comp = pool.GetPooledComponent(); Assert.IsNotNull(comp); Assert.IsInstanceOf(comp); } [Test] public void GetPooledComponent_ComponentIsOnActiveObject() { var pool = new PoolGeneric(CreatePrefab(), "GenActive", _container); var comp = pool.GetPooledComponent(); Assert.IsTrue(comp.gameObject.activeSelf); } [Test] public void GetPooledComponent_ReusesDeactivatedComponent() { var pool = new PoolGeneric(CreatePrefab(), "GenCompReuse", _container); var comp1 = pool.GetPooledComponent(); comp1.gameObject.SetActive(false); var comp2 = pool.GetPooledComponent(); Assert.AreSame(comp1, comp2); } // ─── CreatePoolObjects ──────────────────────────────────────────────── [Test] public void CreatePoolObjects_PreWarmsCorrectCount() { var pool = new PoolGeneric(CreatePrefab(), "GenPrewarm", _container); pool.CreatePoolObjects(4); Assert.AreEqual(4, _container.childCount); } [Test] public void CreatePoolObjects_AllPrewarmed_HaveRequiredComponent() { var pool = new PoolGeneric(CreatePrefab(), "GenCompPrewarm", _container); pool.CreatePoolObjects(3); for (int i = 0; i < _container.childCount; i++) Assert.IsNotNull(_container.GetChild(i).GetComponent()); } // ─── ReturnToPoolEverything ─────────────────────────────────────────── [Test] public void ReturnToPoolEverything_DeactivatesAll() { var pool = new PoolGeneric(CreatePrefab(), "GenReturn", _container); var go1 = pool.GetPooledObject(); var go2 = pool.GetPooledObject(); pool.ReturnToPoolEverything(); Assert.IsFalse(go1.activeSelf); Assert.IsFalse(go2.activeSelf); } [Test] public void ReturnToPoolEverything_AfterReturn_ComponentIsReused() { var pool = new PoolGeneric(CreatePrefab(), "GenCompReturn", _container); var comp1 = pool.GetPooledComponent(); pool.ReturnToPoolEverything(); var comp2 = pool.GetPooledComponent(); Assert.AreSame(comp1, comp2); } } }