File: EventTest.cpp

package info (click to toggle)
dasher 5.0.0~beta~repack-7
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 70,172 kB
  • sloc: xml: 181,314; cpp: 70,870; java: 8,020; python: 3,579; makefile: 943; sh: 324; ansic: 223; perl: 71
file content (157 lines) | stat: -rw-r--r-- 4,936 bytes parent folder | download | duplicates (5)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include "gtest/gtest.h"
#include "../../Src/TestPlatform/MockInterfaceBase.h"
#include "../../Src/TestPlatform/MockSettingsStore.h"
#include "../../Src/DasherCore/EventHandler.h"
#include "../../Src/DasherCore/SettingsStore.h"

//A Dasher component that allows tests to easily determine whether
//or not it was notified of an event which it subscribed to.
class DummyComponent : public Dasher::CDasherComponent {

  public:
    
    int evtCount;
    std::vector<Dasher::CEvent*> receivedEvents;
    
    DummyComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore) :
             Dasher::CDasherComponent(pEventHandler, pSettingsStore, std::vector<int>()) {
      evtCount = 0;
    }
    
    virtual void HandleEvent(Dasher::CEvent *pEvent) {
      evtCount++;
      receivedEvents.push_back(pEvent);
    }
};

//An extension of DummyComponent that fires a CStartEvent every time its HandleEvent is called
class RecursionComponent : public DummyComponent {
  
  public:
  
    RecursionComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore) :
             DummyComponent(pEventHandler, pSettingsStore) {
    }
    
    void HandleEvent(Dasher::CEvent *pEvent) {
      
      evtCount++;
      m_pEventHandler->InsertEvent(new Dasher::CStartEvent());
    }
};

//Test fixture - sets up the EventHandler, SettingsStore, and InterfaceBase instances.
class EventTest : public ::testing::Test {
  
  public:
  
    EventTest() {
      
      interfaceBase = new CMockInterfaceBase();
      evtHandler = new Dasher::CEventHandler(interfaceBase);
      settingsStore = new CMockSettingsStore(evtHandler);
    }
    
  protected:
  
    Dasher::CEventHandler *evtHandler;
    CMockInterfaceBase *interfaceBase;
    CMockSettingsStore *settingsStore;
};

//very basic test - subscribe 5 components, fire one event, and assert that they all were notified
TEST_F(EventTest, BasicTest) {  
  
  std::vector<DummyComponent*> components;
  
  for(int c = 0; c < 5; c++) {
    
    DummyComponent *newComponent = new DummyComponent(evtHandler, settingsStore);
    components.push_back(newComponent);
    evtHandler->RegisterListener(newComponent, EV_PARAM_NOTIFY);
  }
  
  evtHandler->InsertEvent(new CParameterNotificationEvent(0));
  
  for(std::vector<DummyComponent*>::iterator iter = components.begin(); iter != components.end(); ++iter) {
    EXPECT_EQ((*iter)->evtCount, 1);
  }

}

//stress test - register a lot of listeners, fire a lot of events, and EXPECT that 
//everything was notified without crashing
TEST_F(EventTest, StressTest) {
  
  std::vector<DummyComponent*> components;
  
  for(int c = 0; c < 1000; c++) {
    
    DummyComponent *newComponent = new DummyComponent(evtHandler, settingsStore);
    components.push_back(newComponent);
    evtHandler->RegisterListener(newComponent, EV_PARAM_NOTIFY);
  }
  
  for(int c = 0; c < 1000; c++) {
    evtHandler->InsertEvent(new CParameterNotificationEvent(0));
  }
  
  for(std::vector<DummyComponent*>::iterator iter = components.begin(); iter != components.end(); ++iter) {
    EXPECT_EQ((*iter)->evtCount, 1000);
  }
}

//test for proper behavior when components call InsertEvent in their HandleEvent
TEST_F(EventTest, RecursionTest) {
  
  RecursionComponent *rec1 = new RecursionComponent(evtHandler, settingsStore);
  RecursionComponent *rec2 = new RecursionComponent(evtHandler, settingsStore);
  DummyComponent *listener = new DummyComponent(evtHandler, settingsStore);
  
  evtHandler->RegisterListener(rec1, EV_PARAM_NOTIFY);
  evtHandler->RegisterListener(rec2, EV_PARAM_NOTIFY);
  evtHandler->RegisterListener(listener, EV_START);
  
  evtHandler->InsertEvent(new Dasher::CParameterNotificationEvent(0));
  
  EXPECT_EQ(rec1->evtCount, 1);
  EXPECT_EQ(rec2->evtCount, 1);
  EXPECT_EQ(listener->evtCount, 2);
}

//register listeners for one event, fire a different event, and
//check that they DON'T receieve that event
TEST_F(EventTest, StaysQuiet) {
  
  DummyComponent *listener1 = new DummyComponent(evtHandler, settingsStore);
  DummyComponent *listener2 = new DummyComponent(evtHandler, settingsStore);
  
  evtHandler->RegisterListener(listener1, EV_GAME_NODE_DRAWN);
  evtHandler->RegisterListener(listener2, EV_COMMAND);
  
  evtHandler->InsertEvent(new Dasher::CParameterNotificationEvent(0));
  
  EXPECT_EQ(listener1->evtCount, 0);
  EXPECT_EQ(listener2->evtCount, 0);
}

//verify that events are fired in the order we claim them to be
TEST_F(EventTest, EventOrdering) {
  
  std::vector<CEvent*> events;
  
  DummyComponent *listener = new DummyComponent(evtHandler, settingsStore);
  
  evtHandler->RegisterListener(listener, EV_START);
  
  for(int c = 0; c < 5; c++) {
    
    Dasher::CStartEvent *curEvt = new Dasher::CStartEvent();
    events.push_back(curEvt);
    evtHandler->InsertEvent(curEvt);
  }
  
  for(int c = 0; c < 5; c++) {
    EXPECT_EQ(events[c], listener->receivedEvents[c]); 
  }
}