1 
2 #include <r_util.h>
3 #include "minunit.h"
4 
5 typedef struct {
6 	int count;
7 	int last_type;
8 	void *last_data;
9 } EventTestAcc;
10 
callback_test(REvent * ev,int type,void * user,void * data)11 static void callback_test(REvent *ev, int type, void *user, void *data) {
12 	EventTestAcc *acc = user;
13 	acc->count++;
14 	acc->last_type = type;
15 	acc->last_data = data;
16 }
17 
test_r_event(void)18 bool test_r_event(void) {
19 	REvent *ev = r_event_new ((void *)0x1337);
20 	mu_assert_notnull (ev, "r_event_new ()");
21 	mu_assert_ptreq (ev->user, (void *)0x1337, "ev->user");
22 
23 	EventTestAcc acc_all = { 0 };
24 	EventTestAcc acc_specific = { 0 };
25 
26 	REventCallbackHandle handle_all = r_event_hook (ev, R_EVENT_ALL, callback_test, &acc_all);
27 	REventCallbackHandle handle_specific = r_event_hook (ev, R_EVENT_META_SET, callback_test, &acc_specific);
28 
29 	r_event_send (ev, R_EVENT_META_DEL, (void *)0x4242);
30 
31 	mu_assert_eq (acc_all.count, 1, "all count after event");
32 	mu_assert_eq (acc_all.last_type, R_EVENT_META_DEL, "all type after event");
33 	mu_assert_ptreq (acc_all.last_data, (void *)0x4242, "all type after event");
34 	mu_assert_eq (acc_specific.count, 0, "specific count after other event");
35 
36 	r_event_send (ev, R_EVENT_META_SET, (void *)0xdeadbeef);
37 
38 	mu_assert_eq (acc_all.count, 2, "all count after event");
39 	mu_assert_eq (acc_all.last_type, R_EVENT_META_SET, "all type after event");
40 	mu_assert_ptreq (acc_all.last_data, (void *)0xdeadbeef, "all type after event");
41 
42 	mu_assert_eq (acc_specific.count, 1, "specific count after event");
43 	mu_assert_eq (acc_specific.last_type, R_EVENT_META_SET, "specific type after event");
44 	mu_assert_ptreq (acc_specific.last_data, (void *)0xdeadbeef, "specific type after event");
45 
46 	r_event_unhook (ev, handle_all);
47 	r_event_send (ev, R_EVENT_META_SET, (void *)0xc0ffee);
48 
49 	mu_assert_eq (acc_all.count, 2, "all count after event after being removed");
50 	mu_assert_eq (acc_all.last_type, R_EVENT_META_SET, "all type after event after being removed");
51 	mu_assert_ptreq (acc_all.last_data, (void *)0xdeadbeef, "all type after event after being removed");
52 
53 	mu_assert_eq (acc_specific.count, 2, "specific count after event");
54 	mu_assert_eq (acc_specific.last_type, R_EVENT_META_SET, "specific type after event");
55 	mu_assert_ptreq (acc_specific.last_data, (void *)0xc0ffee, "specific type after event");
56 
57 	r_event_unhook (ev, handle_specific);
58 	r_event_send (ev, R_EVENT_META_SET, (void *)0xc0ffee);
59 
60 	mu_assert_eq (acc_specific.count, 2, "specific count after event after being removed");
61 	mu_assert_eq (acc_specific.last_type, R_EVENT_META_SET, "specific type after event after being removed");
62 	mu_assert_ptreq (acc_specific.last_data, (void *)0xc0ffee, "specific type after event after being removed");
63 
64 	r_event_free (ev);
65 
66 	mu_end;
67 }
68 
all_tests()69 int all_tests() {
70 	mu_run_test (test_r_event);
71 	return tests_passed != tests_run;
72 }
73 
main(int argc,char ** argv)74 int main(int argc, char **argv) {
75 	return all_tests();
76 }
77