EscapeShooter/My project/Assets/Project Files/Modules/Tween/Tests/TweenCaseCollectionTests.cs

244 lines
7.5 KiB
C#

using NUnit.Framework;
namespace Watermelon.Tests
{
/// <summary>
/// Tests for TweenCaseCollection — batch tracking, OnComplete callback, Kill/Complete paths.
///
/// Key scenario: collection.OnComplete must fire even when tweens are Kill()ed,
/// not just when they Complete() naturally. This is the bug fixed via OnTerminated.
/// </summary>
[TestFixture]
public class TweenCaseCollectionTests : TweenTestBase
{
// ─── IsComplete ────────────────────────────────────────────────────────
[Test]
public void IsComplete_EmptyCollection_ReturnsTrue()
{
var col = new TweenCaseCollection();
Assert.IsTrue(col.IsComplete());
}
[Test]
public void IsComplete_WithActiveTween_ReturnsFalse()
{
var col = new TweenCaseCollection();
col.AddTween(NewTween());
Assert.IsFalse(col.IsComplete());
}
[Test]
public void IsComplete_AfterAllComplete_ReturnsTrue()
{
var t1 = NewTween(0.1f);
var t2 = NewTween(0.1f);
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
TickFor(0.2f);
Assert.IsTrue(col.IsComplete());
}
[Test]
public void IsComplete_AfterAllKilled_ReturnsTrue()
{
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
t1.Kill();
t2.Kill();
// Kill() sets IsActive=false immediately — no Tick needed
Assert.IsTrue(col.IsComplete());
}
[Test]
public void IsComplete_WhenOneStillActive_ReturnsFalse()
{
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
t1.Kill();
Assert.IsFalse(col.IsComplete()); // t2 still running
}
// ─── OnComplete callback ───────────────────────────────────────────────
[Test]
public void OnComplete_FiresWhenAllNaturallyComplete()
{
bool fired = false;
var t1 = NewTween(0.1f);
var t2 = NewTween(0.1f);
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.OnComplete(() => fired = true);
TickFor(0.2f);
Assert.IsTrue(fired);
}
[Test]
public void OnComplete_NotFiredUntilAllDone()
{
bool fired = false;
var t1 = NewTween(0.1f);
var t2 = NewTween(0.5f);
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.OnComplete(() => fired = true);
TickFor(0.15f); // only t1 done
Assert.IsFalse(fired);
TickFor(0.4f); // t2 done too
Assert.IsTrue(fired);
}
// ─── Kill path (bug fix verification) ─────────────────────────────────
[Test]
public void OnComplete_FiresWhenBothKilled()
{
// Previously: Kill() cleared TweenCompleted delegate → callback lost.
// Now: Kill() fires TweenTerminated → collection notified correctly.
bool fired = false;
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.OnComplete(() => fired = true);
t1.Kill();
Assert.IsFalse(fired); // t2 still active
t2.Kill();
Assert.IsTrue(fired); // all killed → collection done
}
[Test]
public void OnComplete_FiresForMixedCompleteAndKill()
{
bool fired = false;
var t1 = NewTween(0.1f); // will complete naturally
var t2 = NewTween(); // will be killed
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.OnComplete(() => fired = true);
TickFor(0.2f); // t1 completes, t2 still running
Assert.IsFalse(fired);
t2.Kill(); // kills t2 → all done
Assert.IsTrue(fired);
}
[Test]
public void OnComplete_NotFiredWhenOnlyOneKilled_OtherStillRunning()
{
bool fired = false;
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.OnComplete(() => fired = true);
t1.Kill();
Assert.IsFalse(fired);
}
// ─── Batch Kill / Complete ─────────────────────────────────────────────
[Test]
public void Kill_StopsAllTweens()
{
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.Kill();
Assert.IsFalse(t1.IsActive);
Assert.IsFalse(t2.IsActive);
}
[Test]
public void Complete_CompletesAllTweens()
{
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.AddTween(t2);
col.Complete();
Assert.IsTrue(t1.IsCompleted);
Assert.IsTrue(t2.IsCompleted);
}
[Test]
public void Kill_TriggersOnCompleteCallback()
{
bool fired = false;
var t1 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.OnComplete(() => fired = true);
col.Kill();
Assert.IsTrue(fired);
}
[Test]
public void Complete_TriggersOnCompleteCallback()
{
bool fired = false;
var t1 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col.OnComplete(() => fired = true);
col.Complete();
Assert.IsTrue(fired);
}
// ─── Operator + ────────────────────────────────────────────────────────
[Test]
public void OperatorPlus_NullCollection_CreatesNewAndAdds()
{
var tween = NewTween();
TweenCaseCollection col = null;
col += tween;
Assert.IsNotNull(col);
Assert.IsFalse(col.IsComplete());
}
[Test]
public void OperatorPlus_ExistingCollection_Appends()
{
var t1 = NewTween();
var t2 = NewTween();
var col = new TweenCaseCollection();
col.AddTween(t1);
col = col + t2;
Assert.AreEqual(2, col.TweenCases.Count);
}
}
}