1 #include "viewTest.h"
2 #include "testUtils.h"
3 #include "controller.h"
4 #include "signalHelpers.h"
5 #include "setupHelpers.h"
6
7 #include <Eris/Account.h>
8 #include <Eris/Avatar.h>
9 #include <Eris/Entity.h>
10 #include <Eris/View.h>
11 #include <Eris/PollDefault.h>
12 #include <Eris/Operations.h>
13 #include <Eris/Task.h>
14
15 #include <sigc++/functors/mem_fun.h>
16
17 #include <Atlas/Objects/Operation.h>
18 #include <Atlas/Objects/Anonymous.h>
19 #include <Atlas/Objects/Entity.h>
20 #include <wfmath/timestamp.h>
21
22 #pragma warning(disable: 4068) //unknown pragma
23
24 using std::cout;
25 using std::endl;
26
27 using WFMath::TimeStamp;
28 using WFMath::TimeDiff;
29
30 class ViewObserver
31 {
32 public:
ViewObserver(Eris::View * v)33 ViewObserver(Eris::View* v)
34 {
35 v->Appearance.connect(sigc::mem_fun(*this, &ViewObserver::onAppear));
36 v->Disappearance.connect(sigc::mem_fun(*this, &ViewObserver::onDisappear));
37 }
38
getAppearCount(Eris::Entity * e)39 int getAppearCount(Eris::Entity* e)
40 {
41 return m_appears[e];
42 }
43
getDisappearCount(Eris::Entity * e)44 int getDisappearCount(Eris::Entity* e)
45 {
46 return m_disappears[e];
47 }
48 private:
onAppear(Eris::Entity * e)49 void onAppear(Eris::Entity* e)
50 {
51 m_appears[e]++;
52 }
53
onDisappear(Eris::Entity * e)54 void onDisappear(Eris::Entity* e)
55 {
56 m_disappears[e]++;
57 }
58
59 std::map<Eris::Entity*, int> m_appears,
60 m_disappears;
61 };
62
63 class CharacterGetter
64 {
65 public:
CharacterGetter(Eris::Avatar * av)66 CharacterGetter(Eris::Avatar* av) :
67 m_done(false)
68 {
69 av->GotCharacterEntity.connect(sigc::mem_fun(*this, &CharacterGetter::onGetCharacter));
70 }
71
run()72 void run()
73 {
74 while (!m_done) Eris::PollDefault::poll();
75 }
76 private:
onGetCharacter(Eris::Entity *)77 void onGetCharacter(Eris::Entity*)
78 {
79 m_done = true;
80 }
81
82 bool m_done;
83 };
84
85
WaitForAppearance(Eris::View * v,const std::string & eid)86 WaitForAppearance::WaitForAppearance(Eris::View* v, const std::string& eid) :
87 m_view(v)
88 {
89 waitFor(eid);
90 v->Appearance.connect(sigc::mem_fun(*this, &WaitForAppearance::onAppear));
91 }
92
waitFor(const std::string & eid)93 void WaitForAppearance::waitFor(const std::string& eid)
94 {
95 Eris::Entity* e = m_view->getEntity(eid);
96 if (e && e->isVisible()) {
97 return;
98 }
99
100 m_waiting.insert(eid);
101 }
102
run()103 void WaitForAppearance::run()
104 {
105 TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
106
107 while (!m_waiting.empty() && (TimeStamp::now() < end)) {
108 Eris::PollDefault::poll();
109 }
110
111 if (!m_waiting.empty()) {
112 cout << "timed out waiting for:" << endl;
113 std::set<std::string>::const_iterator it;
114 for (it = m_waiting.begin(); it != m_waiting.end(); ++it) {
115 cout << "\t" << *it << endl;
116 }
117 }
118 }
119
onAppear(Eris::Entity * e)120 void WaitForAppearance::onAppear(Eris::Entity* e)
121 {
122 m_waiting.erase(e->getId());
123 }
124
125
WaitForDisappearance(Eris::View * v,const std::string & eid)126 WaitForDisappearance::WaitForDisappearance(Eris::View* v, const std::string& eid) :
127 m_view(v)
128 {
129 waitFor(eid);
130 v->Disappearance.connect(sigc::mem_fun(*this, &WaitForDisappearance::onDisappear));
131 }
132
waitFor(const std::string & eid)133 void WaitForDisappearance::waitFor(const std::string& eid)
134 {
135 Eris::Entity* e = m_view->getEntity(eid);
136 if (!e || !e->isVisible()) {
137 std::cerr << "wait on invisible entity " << eid << std::endl;
138 return;
139 }
140
141 m_waiting.insert(eid);
142 }
143
run()144 void WaitForDisappearance::run()
145 {
146 while (!m_waiting.empty()) Eris::PollDefault::poll();
147 }
148
onDisappear(Eris::Entity * e)149 void WaitForDisappearance::onDisappear(Eris::Entity* e)
150 {
151 m_waiting.erase(e->getId());
152 }
153
154 #pragma mark -
155
testCharacterInitialVis(Controller & ctl)156 void testCharacterInitialVis(Controller& ctl)
157 {
158 AutoConnection con = stdConnect();
159 AutoAccount player = stdLogin("account_B", "sweede", con.get());
160 ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
161
162 AvatarGetter ag(player.get());
163 ag.returnOnSuccess();
164 AutoAvatar av = ag.take("acc_b_character");
165
166 Eris::View* v = av->getView();
167 ViewObserver vob(v);
168
169 CharacterGetter cg(av.get());
170 cg.run();
171
172 assert(vob.getAppearCount(av->getEntity()) == 1);
173 assert(vob.getDisappearCount(av->getEntity()) == 0);
174 }
175
testAppearance(Controller & ctl)176 void testAppearance(Controller& ctl)
177 {
178 AutoConnection con = stdConnect();
179 AutoAccount acc = stdLogin("account_B", "sweede", con.get());
180
181 ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
182 AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
183
184 Eris::View* v = av->getView();
185
186 ctl.setEntityVisibleToAvatar("_potato_1", av.get());
187 ctl.setEntityVisibleToAvatar("_potato_2", av.get());
188 ctl.setEntityVisibleToAvatar("_pig_01", av.get());
189 ctl.setEntityVisibleToAvatar("_field_01", av.get());
190
191 {
192 WaitForAppearance wf(v, "_field_01");
193 wf.waitFor("_pig_01");
194 wf.waitFor("_potato_2");
195 wf.run();
196 }
197
198 ctl.setEntityInvisibleToAvatar("_field_01", av.get());
199 WaitForDisappearance df(v, "_field_01");
200 df.waitFor("_pig_01");
201 df.waitFor("_potato_2");
202
203 df.run();
204
205 ctl.setEntityVisibleToAvatar("_potato_1", av.get());
206 //
207 ctl.setEntityVisibleToAvatar("_pig_02", av.get());
208 ctl.setEntityVisibleToAvatar("_field_01", av.get());
209
210 {
211 WaitForAppearance af2(v, "_field_01");
212 af2.waitFor("_potato_1");
213 af2.run();
214 }
215 }
216
testLookQueue(Controller & ctl)217 void testLookQueue(Controller& ctl)
218 {
219 AutoConnection con = stdConnect();
220 AutoAccount acc = stdLogin("account_B", "sweede", con.get());
221 ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
222
223 ctl.command("add-many-objects", "acc_b_character");
224 AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
225
226 Eris::View* v = av->getView();
227
228 {
229 WaitForAppearance wf(v, "_oak300");
230 wf.run();
231 }
232 }
233
testEntityCreation(Controller & ctl)234 void testEntityCreation(Controller& ctl)
235 {
236 AutoConnection con = stdConnect();
237 AutoAccount acc = stdLogin("account_B", "sweede", con.get());
238
239 ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
240 AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
241 Eris::View* v = av->getView();
242
243 Eris::TestInjector i(con.get());
244
245 SignalRecorder1<Eris::Entity*> created, appeared;
246 v->EntityCreated.connect(sigc::mem_fun(created, &SignalRecorder1<Eris::Entity*>::fired));
247 v->Appearance.connect(sigc::mem_fun(appeared, &SignalRecorder1<Eris::Entity*>::fired));
248
249 {
250 Atlas::Objects::Operation::Appearance app;
251 app->setTo("acc_b_character");
252 Atlas::Objects::Entity::Anonymous arg;
253 arg->setId("magic_id_1");
254 app->setArgs1(arg);
255
256 i.inject(app);
257 assert(created.fireCount() == 0);
258 assert(appeared.fireCount() == 0);
259 }
260
261 {
262 Atlas::Objects::Operation::Create cr;
263 Atlas::Objects::Entity::GameEntity arg;
264 arg->setId("magic_id_1");
265 arg->setName("foom");
266 arg->setLoc("_hut_01");
267 cr->setArgs1(arg);
268
269 Atlas::Objects::Operation::Sight st;
270 st->setTo("acc_b_character");
271 st->setArgs1(cr);
272
273 i.inject(st);
274 assert(created.fireCount() == 1);
275 assert(appeared.fireCount() == 1);
276 }
277
278 created.reset();
279 appeared.reset();
280
281 {
282 Atlas::Objects::Operation::Create cr;
283 Atlas::Objects::Entity::GameEntity arg;
284 arg->setId("magic_id_2");
285 arg->setName("wibble");
286 arg->setLoc("_hut_01");
287 cr->setArgs1(arg);
288
289 Atlas::Objects::Operation::Sight st;
290 st->setTo("acc_b_character");
291 st->setArgs1(cr);
292
293 i.inject(st);
294 assert(created.fireCount() == 0);
295 assert(appeared.fireCount() == 0);
296 }
297
298 {
299 Atlas::Objects::Operation::Appearance app;
300 app->setTo("acc_b_character");
301 Atlas::Objects::Entity::Anonymous arg;
302 arg->setId("magic_id_2");
303 app->setArgs1(arg);
304
305 i.inject(app);
306 assert(created.fireCount() == 1);
307 assert(appeared.fireCount() == 1);
308 }
309 }
310
testUnseen(Controller & ctl)311 void testUnseen(Controller& ctl)
312 {
313 AutoConnection con = stdConnect();
314 AutoAccount acc = stdLogin("account_B", "sweede", con.get());
315
316 ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
317
318 AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
319 Eris::View* v = av->getView();
320
321 ctl.setEntityVisibleToAvatar("_potato_1", av.get());
322 ctl.setEntityVisibleToAvatar("_potato_2", av.get());
323 ctl.setEntityVisibleToAvatar("_pig_01", av.get());
324 ctl.setEntityVisibleToAvatar("_field_01", av.get());
325
326 {
327 WaitForAppearance wf(v, "_field_01");
328 wf.waitFor("_potato_2");
329 wf.run();
330 }
331
332 Eris::EntityRef potatoRef(v->getEntity("_potato_2"));
333 assert(potatoRef);
334
335 Eris::TestInjector i(con.get());
336 SignalCounter0 potatoDeleted;
337 potatoRef->BeingDeleted.connect(sigc::mem_fun(potatoDeleted, &SignalCounter0::fired));
338
339 {
340 Atlas::Objects::Operation::Unseen un;
341 Atlas::Objects::Entity::Anonymous arg;
342 arg->setId("_potato_2");
343 un->setArgs1(arg);
344 un->setTo("acc_b_character");
345
346 i.inject(un);
347 assert(potatoDeleted.fireCount() == 1);
348 assert(!potatoRef);
349 }
350 }
351
testTasks(Controller & ctl)352 void testTasks(Controller& ctl)
353 {
354 AutoConnection con = stdConnect();
355 AutoAccount acc = stdLogin("account_C", "turnip", con.get());
356
357 ctl.setEntityVisibleToAvatar("_hut_01", "acc_c_character");
358 AutoAvatar av = AvatarGetter(acc.get()).take("acc_c_character");
359
360 {
361 WaitForAppearance wf(av->getView(), "_hut_01");
362 wf.run();
363 }
364
365 SignalRecorder1<Eris::Task*> taskAdded;
366 av->getEntity()->TaskAdded.connect(sigc::mem_fun(&taskAdded, &SignalRecorder1<Eris::Task*>::fired));
367
368 Eris::TestInjector i(con.get());
369 {
370 Atlas::Objects::Operation::Set st;
371 Atlas::Objects::Entity::Anonymous arg;
372 arg->setId("acc_c_character");
373 Atlas::Message::ListType tasks;
374 Atlas::Message::MapType task;
375 task["name"] = "fishing";
376 task["progress"] = 0.5;
377 tasks.push_back(task);
378 arg->setAttr("tasks", tasks);
379 st->setArgs1(arg);
380
381 Atlas::Objects::Operation::Sight sight;
382 sight->setTo("acc_c_character");
383 sight->setArgs1(st);
384
385 i.inject(sight);
386 assert(taskAdded.fireCount() == 1);
387 assert(taskAdded.lastArg0()->name() == "fishing");
388 assert(taskAdded.lastArg0()->progress() == 0.5);
389 assert(taskAdded.lastArg0()->isComplete() == false);
390
391 const Eris::TaskArray& etasks(av->getEntity()->getTasks());
392 assert(etasks.size() == 1);
393 assert(etasks[0]->name() == "fishing");
394 }
395
396 }
397
398
399