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