blob: 3f2aa4606d13ea98b73ba6277d93e85775d1f066 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include <simloop.h>
#include <test.h>
#include <timer.h>
/// An initial render should always trigger on frame 0.
TEST_CASE(simloop_initial_render) {
constexpr int UPDATE_FPS = 10;
Timer timer = {};
Simloop simloop = simloop_make(&(SimloopArgs){
.update_fps = UPDATE_FPS, .max_render_fps = 0, .timer = &timer});
SimloopOut simout;
simloop_update(&simloop, &simout);
TEST_TRUE(simout.should_render);
}
/// A simulation loop with no render frame cap.
TEST_CASE(simloop_test_no_render_frame_cap) {
constexpr int UPDATE_FPS = 10;
const time_delta STEP = sec_to_time_delta(1);
const time_delta SIM_TIME_SEC = sec_to_time_delta(30);
Timer timer = {};
Simloop simloop = simloop_make(&(SimloopArgs){
.update_fps = UPDATE_FPS, .max_render_fps = 0, .timer = &timer});
SimloopOut simout;
for (time_delta t = STEP; t < SIM_TIME_SEC; t += STEP) {
timer_advance(&timer, t);
simloop_update(&simloop, &simout);
TEST_TRUE(simout.should_render);
TEST_EQUAL(simout.updates_pending, UPDATE_FPS);
}
}
/// A simulation loop with a render frame cap.
TEST_CASE(simloop_test_with_render_frame_cap) {
constexpr int UPDATE_FPS = 10;
constexpr int RENDER_FPS = 5;
const time_delta STEP = sec_to_time_delta(0.1);
const time_delta SIM_TIME_SEC = sec_to_time_delta(30);
const time_delta EXPECT_UPDATE = sec_to_time_delta(1.0 / (double)UPDATE_FPS);
const time_delta EXPECT_RENDER = sec_to_time_delta(1.0 / (double)RENDER_FPS);
Timer timer = {};
Simloop simloop = simloop_make(&(SimloopArgs){
.update_fps = UPDATE_FPS, .max_render_fps = 0, .timer = &timer});
SimloopOut simout;
for (time_delta t = STEP; t < SIM_TIME_SEC; t += STEP) {
timer_advance(&timer, t);
simloop_update(&simloop, &simout);
TEST_TRUE(((STEP % EXPECT_RENDER) == 0) ? simout.should_render : true);
TEST_TRUE(((STEP % EXPECT_UPDATE) == 0) ? simout.updates_pending : true);
}
}
int main() { return 0; }
|