summaryrefslogtreecommitdiffhomepage
path: root/test/kernel_test/event.test.cc
blob: 6e342c6bce0c34dd6f2c05adadcb06e5335a6fc4 (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/// \file event.test.cc
/// \brief Event handling API tests.
/// \author Amlal El Mahrouss (amlal at nekernel dot org)

#include <libSystem/SystemKit/System.h>
#include <public/frameworks/KernelTest.fwrk/headers/TestCase.h>

/// \note Mock event listener
static Bool event_listener_called = NO;

static Void mock_event_listener(VoidPtr data) {
  event_listener_called = YES;
}

/// \note EvtAddListener tests
KT_DECL_TEST(EvtAddListenerValid, []() -> bool {
  REF_TYPE listener_ref;
  listener_ref.__hash = 0x1234;
  listener_ref.__self = (VoidPtr) mock_event_listener;

  EvtAddListener("test_event", (Ref) &listener_ref);
  return YES;
});

KT_DECL_TEST(EvtAddListenerNull, []() -> bool {
  EvtAddListener(nullptr, nullptr);
  return YES;
});

/// \note EvtRemoveListener tests
KT_DECL_TEST(EvtRemoveListenerValid, []() -> bool {
  REF_TYPE listener_ref;
  listener_ref.__hash = 0x1234;
  listener_ref.__self = (VoidPtr) mock_event_listener;

  EvtAddListener("remove_test", (Ref) &listener_ref);
  EvtRemoveListener("remove_test", (Ref) &listener_ref);
  return YES;
});

KT_DECL_TEST(EvtRemoveListenerNull, []() -> bool {
  EvtRemoveListener(nullptr, nullptr);
  return YES;
});

/// \note EvtDispatchEvent tests
KT_DECL_TEST(EvtDispatchEventValid, []() -> bool {
  REF_TYPE listener_ref;
  listener_ref.__hash = 0x5678;
  listener_ref.__self = (VoidPtr) mock_event_listener;

  event_listener_called = NO;

  EvtAddListener("dispatch_test", (Ref) &listener_ref);

  char data[] = "event_data";
  EvtDispatchEvent("dispatch_test", (VoidPtr) data);

  return YES;
});

KT_DECL_TEST(EvtDispatchEventNull, []() -> bool {
  VoidPtr result = EvtDispatchEvent(nullptr, nullptr);
  return result == nullptr;
});

KT_DECL_TEST(EvtDispatchEventNotExist, []() -> bool {
  VoidPtr result = EvtDispatchEvent("nonexistent_event", nullptr);
  return YES;
});

/// \note Event lifecycle test
KT_DECL_TEST(EvtLifecycleTest, []() -> bool {
  REF_TYPE listener_ref;
  listener_ref.__hash = 0xABCD;
  listener_ref.__self = (VoidPtr) mock_event_listener;

  EvtAddListener("lifecycle_event", (Ref) &listener_ref);

  char data[] = "test";
  EvtDispatchEvent("lifecycle_event", (VoidPtr) data);

  EvtRemoveListener("lifecycle_event", (Ref) &listener_ref);

  return YES;
});

/// \brief Run event tests.
SInt32 KT_TEST_MAIN() {
  KT_RUN_TEST(EvtAddListenerValid);
  KT_RUN_TEST(EvtAddListenerNull);

  KT_RUN_TEST(EvtRemoveListenerValid);
  KT_RUN_TEST(EvtRemoveListenerNull);

  KT_RUN_TEST(EvtDispatchEventValid);
  KT_RUN_TEST(EvtDispatchEventNull);
  KT_RUN_TEST(EvtDispatchEventNotExist);

  KT_RUN_TEST(EvtLifecycleTest);

  return KT_TEST_SUCCESS;
}