using GFramework.Core.Abstractions.coroutine;
using GFramework.Core.coroutine.instructions;
using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
///
/// 等待指令的单元测试类
/// 测试内容包括:
/// - Delay指令
/// - WaitOneFrame指令
/// - WaitForFrames指令
/// - WaitUntil指令
/// - WaitWhile指令
/// - WaitForCoroutine指令
///
[TestFixture]
public class YieldInstructionTests
{
///
/// 验证Delay指令初始状态为未完成
///
[Test]
public void Delay_Should_Not_Be_Done_Initially()
{
var delay = new Delay(1.0);
Assert.That(delay.IsDone, Is.False);
}
///
/// 验证Delay指令应该在指定时间后完成
///
[Test]
public void Delay_Should_Be_Done_After_Specified_Time()
{
var delay = new Delay(1.0);
delay.Update(0.5);
Assert.That(delay.IsDone, Is.False);
delay.Update(0.5);
Assert.That(delay.IsDone, Is.True);
}
///
/// 验证Delay指令可以处理零秒延迟
///
[Test]
public void Delay_Should_Handle_Zero_Seconds()
{
var delay = new Delay(0);
Assert.That(delay.IsDone, Is.True);
}
///
/// 验证Delay指令可以处理负数秒数
///
[Test]
public void Delay_Should_Handle_Negative_Seconds()
{
var delay = new Delay(-1.0);
Assert.That(delay.IsDone, Is.True);
}
///
/// 验证WaitOneFrame指令初始状态为未完成
///
[Test]
public void WaitOneFrame_Should_Not_Be_Done_Initially()
{
var wait = new WaitOneFrame();
Assert.That(wait.IsDone, Is.False);
}
///
/// 验证WaitOneFrame指令应该在第一次Update后完成
///
[Test]
public void WaitOneFrame_Should_Be_Done_After_First_Update()
{
var wait = new WaitOneFrame();
wait.Update(0.1);
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitForFrames指令初始状态为未完成
///
[Test]
public void WaitForFrames_Should_Not_Be_Done_Initially()
{
var wait = new WaitForFrames(3);
Assert.That(wait.IsDone, Is.False);
}
///
/// 验证WaitForFrames指令应该在指定帧数后完成
///
[Test]
public void WaitForFrames_Should_Be_Done_After_Specified_Frames()
{
var wait = new WaitForFrames(3);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.False);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.False);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitForFrames指令可以处理最小帧数1
///
[Test]
public void WaitForFrames_Should_Handle_Minimum_Frames_Of_1()
{
var wait = new WaitForFrames(1);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitForFrames指令可以处理0帧数(会被修正为1)
///
[Test]
public void WaitForFrames_Should_Handle_Zero_Frames_As_1()
{
var wait = new WaitForFrames(0);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitForFrames指令可以处理负数帧数(会被修正为1)
///
[Test]
public void WaitForFrames_Should_Handle_Negative_Frames_As_1()
{
var wait = new WaitForFrames(-5);
wait.Update(0.1);
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitForFrames指令每次Update减少剩余帧数
///
[Test]
public void WaitForFrames_Should_Decrement_On_Each_Update()
{
var wait = new WaitForFrames(5);
for (var i = 5; i > 0; i--)
{
Assert.That(wait.IsDone, Is.False, $"Should not be done at frame {5 - i + 1}");
wait.Update(0.1);
}
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitUntil指令使用谓词函数
///
[Test]
public void WaitUntil_Should_Use_Predicate_Function()
{
var conditionMet = false;
var wait = new WaitUntil(() => conditionMet);
Assert.That(wait.IsDone, Is.False);
conditionMet = true;
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitUntil指令应该在条件满足时完成
///
[Test]
public void WaitUntil_Should_Be_Done_When_Condition_Is_True()
{
var counter = 0;
var wait = new WaitUntil(() => counter >= 3);
Assert.That(wait.IsDone, Is.False);
counter = 1;
Assert.That(wait.IsDone, Is.False);
counter = 2;
Assert.That(wait.IsDone, Is.False);
counter = 3;
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitUntil指令抛出ArgumentNullException当predicate为null
///
[Test]
public void WaitUntil_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()
{
Assert.Throws(() => new WaitUntil(null!));
}
///
/// 验证WaitWhile指令使用谓词函数
///
[Test]
public void WaitWhile_Should_Use_Predicate_Function()
{
var callCount = 0;
var shouldContinue = true;
var wait = new WaitWhile(() =>
{
callCount++;
return shouldContinue;
});
// 访问 IsDone,会触发 predicate
Assert.That(wait.IsDone, Is.False);
Assert.That(callCount, Is.GreaterThan(0),
"Predicate should be evaluated when checking IsDone");
var previousCount = callCount;
shouldContinue = false;
// 再次访问 IsDone,应再次调用 predicate,并改变结果
Assert.That(wait.IsDone, Is.True);
Assert.That(callCount, Is.GreaterThan(previousCount),
"Predicate should be re-evaluated when condition changes");
}
///
/// 验证WaitWhile指令应该在条件为假时完成
///
[Test]
public void WaitWhile_Should_Be_Done_When_Condition_Is_False()
{
var continueWaiting = true;
var wait = new WaitWhile(() => continueWaiting);
Assert.That(wait.IsDone, Is.False);
continueWaiting = false;
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitWhile指令应该在条件为真时持续等待
///
[Test]
public void WaitWhile_Should_Continue_Waiting_While_Condition_Is_True()
{
var continueWaiting = true;
var wait = new WaitWhile(() => continueWaiting);
Assert.That(wait.IsDone, Is.False);
for (var i = 0; i < 10; i++)
{
Assert.That(wait.IsDone, Is.False);
}
continueWaiting = false;
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitWhile指令抛出ArgumentNullException当predicate为null
///
[Test]
public void WaitWhile_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()
{
Assert.Throws(() => new WaitWhile(null!));
}
///
/// 验证WaitForCoroutine指令初始状态为未完成
///
[Test]
public void WaitForCoroutine_Should_Not_Be_Done_Initially()
{
var wait = new WaitForCoroutine();
Assert.That(wait.IsDone, Is.False);
}
///
/// 验证WaitForCoroutine指令的Update方法不影响状态
///
[Test]
public void WaitForCoroutine_Update_Should_Not_Affect_State()
{
var wait = new WaitForCoroutine();
wait.Update(0.1);
Assert.That(wait.IsDone, Is.False);
wait.Update(1.0);
Assert.That(wait.IsDone, Is.False);
}
///
/// 验证Delay指令实现IYieldInstruction接口
///
[Test]
public void Delay_Should_Implement_IYieldInstruction_Interface()
{
var delay = new Delay(1.0);
Assert.That(delay, Is.InstanceOf());
}
///
/// 验证WaitOneFrame指令实现IYieldInstruction接口
///
[Test]
public void WaitOneFrame_Should_Implement_IYieldInstruction_Interface()
{
var wait = new WaitOneFrame();
Assert.That(wait, Is.InstanceOf());
}
///
/// 验证WaitForFrames指令实现IYieldInstruction接口
///
[Test]
public void WaitForFrames_Should_Implement_IYieldInstruction_Interface()
{
var wait = new WaitForFrames(3);
Assert.That(wait, Is.InstanceOf());
}
///
/// 验证WaitUntil指令实现IYieldInstruction接口
///
[Test]
public void WaitUntil_Should_Implement_IYieldInstruction_Interface()
{
var wait = new WaitUntil(() => true);
Assert.That(wait, Is.InstanceOf());
}
///
/// 验证WaitWhile指令实现IYieldInstruction接口
///
[Test]
public void WaitWhile_Should_Implement_IYieldInstruction_Interface()
{
var wait = new WaitWhile(() => false);
Assert.That(wait, Is.InstanceOf());
}
///
/// 验证WaitForCoroutine指令实现IYieldInstruction接口
///
[Test]
public void WaitForCoroutine_Should_Implement_IYieldInstruction_Interface()
{
var wait = new WaitForCoroutine();
Assert.That(wait, Is.InstanceOf());
}
///
/// 验证WaitUntil指令在Update后立即检查条件
///
[Test]
public void WaitUntil_Should_Evaluate_Condition_Immediately()
{
var counter = 0;
var wait = new WaitUntil(() => counter >= 1);
Assert.That(wait.IsDone, Is.False);
counter = 1;
Assert.That(wait.IsDone, Is.True);
}
///
/// 验证WaitWhile指令在Update后立即检查条件
///
[Test]
public void WaitWhile_Should_Evaluate_Condition_Immediately()
{
var callCount = 0;
var continueWaiting = true;
var wait = new WaitWhile(() =>
{
callCount++;
return continueWaiting;
});
// 初始检查,确保谓词被调用
Assert.That(wait.IsDone, Is.False);
Assert.That(callCount, Is.EqualTo(1), "Predicate should be called once initially");
// 改变条件并验证谓词再次被调用
continueWaiting = false;
Assert.That(wait.IsDone, Is.True);
Assert.That(callCount, Is.EqualTo(2), "Predicate should be called again after condition change");
}
}