1 module tests.nodes.time_machine;
2 
3 import core.time;
4 
5 import fluid;
6 
7 @safe:
8 
9 alias timeTracker = nodeBuilder!TimeTracker;
10 
11 class TimeTracker : Node {
12 
13     TimeIO timeIO;
14     MonoTime lastFrame;
15     Duration frameTime;
16 
17     override void resizeImpl(Vector2) {
18         require(timeIO);
19         lastFrame = timeIO.now();
20     }
21 
22     override void drawImpl(Rectangle, Rectangle) {
23         frameTime = timeIO.timeSince(lastFrame);
24         lastFrame = timeIO.now();
25     }
26 
27 }
28 
29 @("TimeMachine can manipulate TimeIO output")
30 unittest {
31 
32     auto machine = timeMachine();
33     auto event1 = machine.now();
34     machine += 5.seconds;
35 
36     auto event2 = machine.now();
37     machine += 4.seconds;
38 
39     auto event3 = machine.now();
40 
41     assert(event2 == event1 + 5.seconds);
42     assert(event3 == event1 + 9.seconds);
43     assert(event3 == event2 + 4.seconds);
44 
45 }
46 
47 @("TimeMachine's output is readable by nodes")
48 unittest {
49 
50     auto machine = timeMachine();
51     auto tracker = timeTracker();
52     auto root = chain(machine, tracker);
53 
54     root.draw();
55     machine += 5.seconds;
56     root.draw();
57     assert(tracker.frameTime == 5.seconds);
58 
59     machine += 16.msecs;
60     root.draw();
61     assert(tracker.frameTime == 16.msecs);
62 
63     machine += 4.msecs;
64     machine += 5.msecs;
65     root.draw();
66     assert(tracker.frameTime == 9.msecs);
67 
68 }