Extra2D/tests/test_timer_module.cpp

406 lines
9.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include <module/timer_module.h>
using namespace extra2d;
// ============================================================================
// TimerModule 基础测试
// ============================================================================
TEST(TimerModule, BasicProperties) {
TimerModule timer;
// 测试基本属性
EXPECT_STREQ("Timer", timer.name());
EXPECT_EQ(ModuleType::Core, timer.type());
EXPECT_EQ(Pri::System, timer.priority());
}
TEST(TimerModule, InitShutdown) {
TimerModule timer;
// 测试初始化和关闭
EXPECT_TRUE(timer.init());
timer.shutdown();
}
TEST(TimerModule, TimeScale) {
TimerModule timer;
// 测试时间缩放默认值
EXPECT_FLOAT_EQ(1.0f, timer.getTimeScale());
// 测试设置时间缩放
timer.setTimeScale(2.0f);
EXPECT_FLOAT_EQ(2.0f, timer.getTimeScale());
timer.setTimeScale(0.5f);
EXPECT_FLOAT_EQ(0.5f, timer.getTimeScale());
// 测试边界值
timer.setTimeScale(0.0f);
EXPECT_FLOAT_EQ(0.0f, timer.getTimeScale());
}
// ============================================================================
// 一次性定时器测试
// ============================================================================
TEST(TimerModule, ScheduleOnce) {
TimerModule timer;
timer.init();
bool called = false;
TimerId id = timer.scheduleOnce(0.1f, [&called]() {
called = true;
});
EXPECT_NE(INVALID_TIMER_ID, id);
EXPECT_EQ(1, timer.getActiveCount());
// 模拟时间流逝(未到达触发时间)
timer.update(0.05f);
EXPECT_FALSE(called);
EXPECT_EQ(1, timer.getActiveCount());
// 模拟时间流逝(到达触发时间)
timer.update(0.05f);
EXPECT_TRUE(called);
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
TEST(TimerModule, ScheduleOnceImmediate) {
TimerModule timer;
timer.init();
bool called = false;
TimerId id = timer.scheduleOnce(0.0f, [&called]() {
called = true;
});
EXPECT_NE(INVALID_TIMER_ID, id);
// 立即触发
timer.update(0.0f);
EXPECT_TRUE(called);
timer.shutdown();
}
TEST(TimerModule, CancelTimer) {
TimerModule timer;
timer.init();
bool called = false;
TimerId id = timer.scheduleOnce(0.1f, [&called]() {
called = true;
});
// 取消定时器
timer.cancel(id);
// 模拟时间流逝
timer.update(0.2f);
EXPECT_FALSE(called);
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
TEST(TimerModule, CancelInvalidTimer) {
TimerModule timer;
timer.init();
// 取消不存在的定时器不应崩溃
EXPECT_NO_THROW(timer.cancel(99999));
timer.shutdown();
}
// ============================================================================
// 重复定时器测试
// ============================================================================
TEST(TimerModule, ScheduleRepeat) {
TimerModule timer;
timer.init();
int callCount = 0;
TimerId id = timer.scheduleRepeat(0.1f, 3, [&callCount]() {
callCount++;
});
EXPECT_NE(INVALID_TIMER_ID, id);
// 第一次触发
timer.update(0.1f);
EXPECT_EQ(1, callCount);
// 第二次触发
timer.update(0.1f);
EXPECT_EQ(2, callCount);
// 第三次触发
timer.update(0.1f);
EXPECT_EQ(3, callCount);
// 定时器应已自动移除
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
TEST(TimerModule, ScheduleRepeatInfinite) {
TimerModule timer;
timer.init();
int callCount = 0;
TimerId id = timer.scheduleRepeat(0.1f, 0, [&callCount]() {
callCount++;
});
// 触发多次
for (int i = 0; i < 10; i++) {
timer.update(0.1f);
}
EXPECT_EQ(10, callCount);
EXPECT_EQ(1, timer.getActiveCount());
// 取消无限定时器
timer.cancel(id);
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
// ============================================================================
// 每帧更新定时器测试
// ============================================================================
TEST(TimerModule, ScheduleUpdate) {
TimerModule timer;
timer.init();
float totalDt = 0.0f;
int callCount = 0;
TimerId id = timer.scheduleUpdate([&](float dt) {
totalDt += dt;
callCount++;
});
EXPECT_NE(INVALID_TIMER_ID, id);
// 模拟多帧
timer.update(0.016f);
timer.update(0.016f);
timer.update(0.016f);
EXPECT_EQ(3, callCount);
EXPECT_FLOAT_EQ(0.048f, totalDt);
// 取消更新定时器
timer.cancel(id);
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
// ============================================================================
// 暂停和恢复测试
// ============================================================================
TEST(TimerModule, PauseResume) {
TimerModule timer;
timer.init();
int callCount = 0;
TimerId id = timer.scheduleRepeat(0.1f, 0, [&callCount]() {
callCount++;
});
// 正常触发一次
timer.update(0.1f);
EXPECT_EQ(1, callCount);
// 暂停
timer.pause(id);
timer.update(0.1f);
EXPECT_EQ(1, callCount); // 不应增加
// 恢复
timer.resume(id);
timer.update(0.1f);
EXPECT_EQ(2, callCount);
timer.shutdown();
}
TEST(TimerModule, PauseInvalidTimer) {
TimerModule timer;
timer.init();
// 暂停不存在的定时器不应崩溃
EXPECT_NO_THROW(timer.pause(99999));
EXPECT_NO_THROW(timer.resume(99999));
timer.shutdown();
}
// ============================================================================
// 时间缩放测试
// ============================================================================
TEST(TimerModule, TimeScaleEffect) {
TimerModule timer;
timer.init();
int callCount = 0;
timer.scheduleRepeat(1.0f, 0, [&callCount]() {
callCount++;
});
// 设置2倍速
timer.setTimeScale(2.0f);
// 实际经过0.5秒但效果相当于1秒
timer.update(0.5f);
EXPECT_EQ(1, callCount);
timer.shutdown();
}
TEST(TimerModule, TimeScaleZero) {
TimerModule timer;
timer.init();
int callCount = 0;
timer.scheduleRepeat(0.1f, 0, [&callCount]() {
callCount++;
});
// 暂停时间
timer.setTimeScale(0.0f);
// 无论经过多少时间,都不会触发
timer.update(1.0f);
timer.update(1.0f);
EXPECT_EQ(0, callCount);
// 恢复时间
timer.setTimeScale(1.0f);
timer.update(0.1f);
EXPECT_EQ(1, callCount);
timer.shutdown();
}
// ============================================================================
// 多定时器测试
// ============================================================================
TEST(TimerModule, MultipleTimers) {
TimerModule timer;
timer.init();
int count1 = 0, count2 = 0, count3 = 0;
TimerId id1 = timer.scheduleOnce(0.1f, [&count1]() { count1++; });
TimerId id2 = timer.scheduleOnce(0.2f, [&count2]() { count2++; });
TimerId id3 = timer.scheduleOnce(0.3f, [&count3]() { count3++; });
EXPECT_EQ(3, timer.getActiveCount());
// 经过0.15秒
timer.update(0.15f);
EXPECT_EQ(1, count1);
EXPECT_EQ(0, count2);
EXPECT_EQ(0, count3);
EXPECT_EQ(2, timer.getActiveCount());
// 再经过0.1秒
timer.update(0.1f);
EXPECT_EQ(1, count1);
EXPECT_EQ(1, count2);
EXPECT_EQ(0, count3);
EXPECT_EQ(1, timer.getActiveCount());
// 再经过0.1秒
timer.update(0.1f);
EXPECT_EQ(1, count1);
EXPECT_EQ(1, count2);
EXPECT_EQ(1, count3);
EXPECT_EQ(0, timer.getActiveCount());
timer.shutdown();
}
TEST(TimerModule, CancelAll) {
TimerModule timer;
timer.init();
int count = 0;
timer.scheduleOnce(0.1f, [&count]() { count++; });
timer.scheduleOnce(0.2f, [&count]() { count++; });
timer.scheduleOnce(0.3f, [&count]() { count++; });
EXPECT_EQ(3, timer.getActiveCount());
// 取消所有
timer.cancelAll();
EXPECT_EQ(0, timer.getActiveCount());
// 确认都不会触发
timer.update(0.5f);
EXPECT_EQ(0, count);
timer.shutdown();
}
// ============================================================================
// 边界条件测试
// ============================================================================
TEST(TimerModule, SelfCancelInCallback) {
TimerModule timer;
timer.init();
TimerId id = INVALID_TIMER_ID;
bool called = false;
// 在回调中取消自己
id = timer.scheduleOnce(0.1f, [&]() {
called = true;
timer.cancel(id);
});
timer.update(0.1f);
EXPECT_TRUE(called);
timer.shutdown();
}
TEST(TimerModule, ScheduleInCallback) {
TimerModule timer;
timer.init();
bool secondCalled = false;
// 在回调中创建新定时器
timer.scheduleOnce(0.1f, [&]() {
timer.scheduleOnce(0.1f, [&]() {
secondCalled = true;
});
});
timer.update(0.1f);
EXPECT_FALSE(secondCalled);
timer.update(0.1f);
EXPECT_TRUE(secondCalled);
timer.shutdown();
}