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