1 /* Public domain */
2 /*
3 * This application tests the AG_Timer(3) interface.
4 */
5 #include "agartest.h"
6
7 typedef struct {
8 AG_TestInstance _inherit;
9 AG_Timer to[3], toReg;
10 AG_Window *win;
11 Uint tick, period;
12 } MyTestInstance;
13
14 static Uint32
Timeout1(AG_Timer * to,AG_Event * event)15 Timeout1(AG_Timer *to, AG_Event *event)
16 {
17 MyTestInstance *ti = AG_PTR(1);
18 TestMsg(ti, "This message should appear first");
19 return (0);
20 }
21
22 static Uint32
Timeout2(AG_Timer * to,AG_Event * event)23 Timeout2(AG_Timer *to, AG_Event *event)
24 {
25 MyTestInstance *ti = AG_PTR(1);
26 TestMsg(ti, "This message should appear second");
27 return (0);
28 }
29
30 static Uint32
Timeout3(AG_Timer * to,AG_Event * event)31 Timeout3(AG_Timer *to, AG_Event *event)
32 {
33 MyTestInstance *ti = AG_PTR(1);
34 TestMsg(ti, "This message should appear last");
35 return (0);
36 }
37
38 static Uint32
TimeoutRegular(AG_Timer * to,AG_Event * event)39 TimeoutRegular(AG_Timer *to, AG_Event *event)
40 {
41 MyTestInstance *ti = AG_PTR(1);
42 TestMsg(ti, "Tick %u", ti->tick++);
43 return (to->ival);
44 }
45
46
47 static void
TestOneShot(AG_Event * event)48 TestOneShot(AG_Event *event)
49 {
50 MyTestInstance *ti = AG_PTR(1);
51
52 TestMsg(ti, "Testing 3 one-shot timers");
53 if (AG_AddTimer(ti->win, &ti->to[0], 1000, Timeout1, "%p", ti) == -1 ||
54 AG_AddTimer(ti->win, &ti->to[1], 2000, Timeout2, "%p", ti) == -1 ||
55 AG_AddTimer(ti->win, &ti->to[2], 2100, Timeout3, "%p", ti) == -1) {
56 TestMsg(ti, "AddTimer: %s", AG_GetError());
57 }
58 }
59
60 static void
StartPeriodic(AG_Event * event)61 StartPeriodic(AG_Event *event)
62 {
63 MyTestInstance *ti = AG_PTR(1);
64
65 ti->tick = 0;
66 TestMsg(ti, "Testing periodic timer at %u ms", ti->period);
67 if (AG_AddTimer(ti->win, &ti->toReg, ti->period,
68 TimeoutRegular, "%p", ti) == -1) {
69 TestMsg(ti, "AddTimer: %s", AG_GetError());
70 }
71 }
72
73 static void
StopPeriodic(AG_Event * event)74 StopPeriodic(AG_Event *event)
75 {
76 MyTestInstance *ti = AG_PTR(1);
77
78 TestMsg(ti, "Stopping periodic timer");
79 AG_DelTimer(ti->win, &ti->toReg);
80 }
81
82 static int
Init(void * obj)83 Init(void *obj)
84 {
85 MyTestInstance *ti = obj;
86
87 ti->win = NULL;
88 ti->tick = 0;
89 ti->period = 1000;
90 AG_InitTimer(&ti->to[0], "testTimer1", 0);
91 AG_InitTimer(&ti->to[1], "testTimer2", 0);
92 AG_InitTimer(&ti->to[2], "testTimer3", 0);
93 AG_InitTimer(&ti->toReg, "testTimerReg", 0);
94
95 return (0);
96 }
97
98 static void
StartTimerInspector(AG_Event * event)99 StartTimerInspector(AG_Event *event)
100 {
101 MyTestInstance *ti = AG_PTR(1);
102 AG_Window *win;
103
104 if ((win = DEV_TimerInspector()) != NULL) {
105 AG_WindowAttach(ti->win, win);
106 AG_WindowShow(win);
107 }
108 }
109
110 static int
TestGUI(void * obj,AG_Window * win)111 TestGUI(void *obj, AG_Window *win)
112 {
113 MyTestInstance *ti = obj;
114 AG_Box *hBox;
115 AG_Numerical *num;
116
117 ti->win = win;
118 AG_LabelNewS(win, 0, "Test for AG_Timer(3) facility");
119 AG_LabelNew(win, 0, "timeOps: %s", agTimeOps->name);
120 AG_ButtonNewFn(win, AG_BUTTON_HFILL, "Open Timer Inspector",
121 StartTimerInspector, "%p", ti);
122 AG_SeparatorNewHoriz(win);
123
124 hBox = AG_BoxNewHoriz(win, 0);
125 {
126 AG_ButtonNewFn(hBox, 0, "Test One-Shot", TestOneShot, "%p", ti);
127 AG_ButtonNewFn(hBox, 0, "Start Periodic", StartPeriodic, "%p", ti);
128 AG_ButtonNewFn(hBox, 0, "Stop Periodic", StopPeriodic, "%p", ti);
129 }
130 num = AG_NumericalNew(win, 0, "ms", "Period: ");
131 AG_BindUint(num, "value", &ti->period);
132 return (0);
133 }
134
135 const AG_TestCase timeoutsTest = {
136 "timeouts",
137 N_("Test AG_Timer(3) facility"),
138 "1.5.0",
139 0,
140 sizeof(MyTestInstance),
141 Init,
142 NULL,
143 NULL, /* test */
144 TestGUI,
145 NULL /* bench */
146 };
147