1 #include "avatarTest.h"
2 #include "signalHelpers.h"
3 
4 #include "testUtils.h"
5 #include "signalHelpers.h"
6 #include "setupHelpers.h"
7 #include "viewTest.h"
8 #include "controller.h"
9 
10 #include <Eris/Account.h>
11 #include <Eris/Avatar.h>
12 #include <Eris/Entity.h>
13 #include <Eris/Operations.h>
14 #include <Eris/View.h>
15 #include <Eris/TypeInfo.h>
16 #include <Eris/PollDefault.h>
17 
18 #include <sigc++/functors/mem_fun.h>
19 
20 #include <Atlas/Objects/Operation.h>
21 #include <Atlas/Objects/Anonymous.h>
22 #include <Atlas/Objects/Entity.h>
23 
24 #include <wfmath/timestamp.h>
25 
26 using WFMath::TimeStamp;
27 using WFMath::TimeDiff;
28 
29 using namespace Atlas::Objects::Operation;
30 using Atlas::Objects::Entity::Anonymous;
31 using Atlas::Objects::Root;
32 
testWield(Controller & ctl)33 void testWield(Controller& ctl)
34 {
35     AutoConnection con = stdConnect();
36     AutoAccount acc = stdLogin("account_B", "sweede", con.get());
37 
38     ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
39     ctl.setEntityVisibleToAvatar("_hammer_1", "acc_b_character");
40 
41     AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
42     Eris::View* v = av->getView();
43     {
44         WaitForAppearance wf(v, "_hammer_1");
45         wf.run();
46     }
47 
48     Eris::EntityRef hammerRef(v->getEntity("_hammer_1"));
49     assert(hammerRef);
50 
51     av->wield(hammerRef.get());
52 
53     TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
54     while (!av->getWielded() && (TimeStamp::now() < end)) {
55         Eris::PollDefault::poll();
56     }
57 
58     assert(av->getWielded()->getId() == "_hammer_1");
59     const Eris::TypeInfoArray& ops = av->getWielded()->getUseOperations();
60 
61     assert(ops[0]->getName() == "strike");
62     assert(ops[1]->getName() == "tap");
63 }
64 
testDeleteWielded(Controller & ctl)65 void testDeleteWielded(Controller& ctl)
66 {
67     AutoConnection con = stdConnect();
68     AutoAccount acc = stdLogin("account_B", "sweede", con.get());
69 
70     ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
71     ctl.setEntityVisibleToAvatar("_hammer_1", "acc_b_character");
72 
73     AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
74     Eris::View* v = av->getView();
75     {
76         WaitForAppearance wf(v, "_hammer_1");
77         wf.run();
78     }
79 
80     Eris::EntityRef hammerRef(v->getEntity("_hammer_1"));
81     assert(hammerRef);
82     av->wield(hammerRef.get());
83 
84     TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
85     while (!av->getWielded() && (TimeStamp::now() < end)) {
86         Eris::PollDefault::poll();
87     }
88 
89     Eris::TestInjector i(con.get());
90     SignalCounter0 hammerDeleted, hammerRefChanged;
91 
92     hammerRef->BeingDeleted.connect(sigc::mem_fun(hammerDeleted, &SignalCounter0::fired));
93     hammerRef.Changed.connect(sigc::mem_fun(hammerRefChanged, &SignalCounter0::fired));
94     {
95         Delete del;
96         Anonymous arg;
97         arg->setId("_hammer_1");
98         del->setArgs1(arg);
99 
100         Sight st;
101         st->setArgs1(del);
102         st->setTo("acc_b_character");
103 
104         i.inject(st);
105     }
106 
107     assert(hammerDeleted.fireCount());
108     assert(!hammerRef);
109     assert(hammerRefChanged.fireCount());
110     assert(!av->getWielded());
111 }
112 
113 class Hearer : public sigc::trackable
114 {
115 public:
Hearer()116     Hearer() :
117         m_count(0),
118         m_source(NULL)
119     {;}
120 
fired(Eris::Entity * ent,const RootOperation & op)121     void fired(Eris::Entity* ent, const RootOperation& op)
122     {
123         ++m_count;
124         m_op = op;
125         m_source = ent;
126     }
127 
fireCount() const128     int fireCount() const
129     { return m_count; }
130 
argOp() const131     const RootOperation argOp() const
132     {
133         return m_op;
134     }
135 
source() const136     Eris::Entity* source() const
137     {
138         return m_source;
139     }
140 
reset()141     void reset()
142     {
143         m_count = 0;
144     }
145 private:
146     int m_count;
147     RootOperation m_op;
148     Eris::Entity* m_source;
149 };
150 
151 
testHear(Controller & ctl)152 void testHear(Controller& ctl)
153 {
154     AutoConnection con = stdConnect();
155     AutoAccount acc = stdLogin("account_B", "sweede", con.get());
156 
157     ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
158     ctl.setEntityVisibleToAvatar("_table_1", "acc_b_character");
159     ctl.setEntityVisibleToAvatar("_vase_1", "acc_b_character");
160 
161     AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
162     Eris::View* v = av->getView();
163     {
164         WaitForAppearance wf(v, "_vase_1");
165         wf.run();
166     }
167 
168     Eris::TestInjector i(con.get());
169     Hearer heard;
170 
171     av->Hear.connect(sigc::mem_fun(heard, &Hearer::fired));
172 
173     {
174         Talk talk;
175         Atlas::Objects::Entity::Anonymous arg;
176         arg->setAttr("what", "shitcock!");
177         talk->setArgs1(arg);
178         talk->setFrom("_vase_1");
179 
180         Sound snd;
181         snd->setArgs1(talk);
182         snd->setTo("acc_b_character");
183         snd->setFrom("_vase_1");
184 
185         i.inject(snd);
186     }
187 
188     assert(heard.fireCount());
189     RootOperation heardOp = heard.argOp();
190     assert(heardOp->getClassNo() == TALK_NO);
191     const std::vector<Root>& args = heardOp->getArgs();
192 
193     assert(args.front()->hasAttr("what"));
194     assert(args.front()->getAttr("what") == "shitcock!");
195 
196     assert(heard.source()->getId() == "_vase_1");
197 }
198 
testLogoutRequest(Controller & ctl)199 void testLogoutRequest(Controller& ctl)
200 {
201 
202     AutoConnection con = stdConnect();
203     AutoAccount acc = stdLogin("account_B", "sweede", con.get());
204     ctl.setEntityVisibleToAvatar("_hut_01", "acc_b_character");
205 
206     AutoAvatar av = AvatarGetter(acc.get()).take("acc_b_character");
207     Eris::TestInjector i(con.get());
208 
209     Atlas::Objects::Operation::Logout logout;
210     logout->setTo(av->getId());
211 
212 
213     SignalCounter1<Eris::Avatar*> avatarDeactivated;
214 
215     acc->AvatarDeactivated.connect(sigc::mem_fun(avatarDeactivated, &SignalCounter1<Eris::Avatar*>::fired));
216 
217     i.inject(logout);
218     TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
219     while (avatarDeactivated.fireCount() == 0 && (TimeStamp::now() < end)) {
220         Eris::PollDefault::poll();
221     }
222 
223     assert(avatarDeactivated.fireCount() != 0);
224     assert(acc->isLoggedIn());
225     assert(acc->getActiveCharacters().size() == 0);
226 
227     //The avatar has been destroyed when logging out, so we shouldn't let the unique_ptr do that too.
228     av.release();
229 
230 }
231 
testTransferRequest(Controller & ctl)232 void testTransferRequest(Controller& ctl)
233 {
234 
235     AutoConnection con = stdConnect();
236     AutoAccount acc = stdLogin("account_C", "turnip", con.get());
237     ctl.setEntityVisibleToAvatar("_hut_01", "acc_c_character");
238 
239     AutoAvatar av = AvatarGetter(acc.get()).take("acc_c_character");
240     Eris::TestInjector i(con.get());
241 
242 
243     std::vector<Root> logout_args;
244 
245     Anonymous op_arg;
246     op_arg->setId(av->getId());
247     logout_args.push_back(op_arg);
248 
249     Atlas::Objects::Operation::Logout logout;
250     Anonymous transferArg;
251     transferArg->setAttr("teleport_host", "teleport_host");
252     transferArg->setAttr("teleport_port", 6768);
253     transferArg->setAttr("possess_key", "possess_key");
254     transferArg->setAttr("possess_entity_id", "possess_entity_id");
255     logout_args.push_back(transferArg);
256 
257     logout->setTo(av->getId());
258     logout->setArgs(logout_args);
259 
260 
261     SignalCounter1<const Eris::TransferInfo&> transferRequested;
262 
263     av->TransferRequested.connect(sigc::mem_fun(transferRequested, &SignalCounter1<const Eris::TransferInfo&>::fired));
264 
265     i.inject(logout);
266 
267     TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
268     while (transferRequested.fireCount() == 0 && (TimeStamp::now() < end)) {
269         Eris::PollDefault::poll();
270     }
271 
272     assert(transferRequested.fireCount() == 1);
273     assert(acc->isLoggedIn());
274     assert(acc->getActiveCharacters().size() == 0);
275 
276     //The avatar has been destroyed when logging out, so we shouldn't let the unique_ptr do that too.
277     av.release();
278 
279 }
280 
testTransferRequestWithInvalidOp(Controller & ctl)281 void testTransferRequestWithInvalidOp(Controller& ctl)
282 {
283 
284     AutoConnection con = stdConnect();
285     AutoAccount acc = stdLogin("account_C", "turnip", con.get());
286     ctl.setEntityVisibleToAvatar("_hut_01", "acc_c_character");
287 
288     AutoAvatar av = AvatarGetter(acc.get()).take("acc_c_character");
289     Eris::TestInjector i(con.get());
290 
291 
292     std::vector<Root> logout_args;
293 
294     Anonymous op_arg;
295     op_arg->setId(av->getId());
296     logout_args.push_back(op_arg);
297 
298     Atlas::Objects::Operation::Logout logout;
299     Anonymous transferArg;
300     transferArg->setAttr("teleport_host", "teleport_host");
301 //    transferArg->setAttr("teleport_port", 6768);
302     transferArg->setAttr("possess_key", "possess_key");
303     transferArg->setAttr("possess_entity_id", "possess_entity_id");
304     logout_args.push_back(transferArg);
305 
306     logout->setTo(av->getId());
307     logout->setArgs(logout_args);
308 
309 
310     SignalCounter1<const Eris::TransferInfo&> transferRequested;
311     SignalCounter1<Eris::Avatar*> avatarDeactivated;
312 
313     av->TransferRequested.connect(sigc::mem_fun(transferRequested, &SignalCounter1<const Eris::TransferInfo&>::fired));
314     acc->AvatarDeactivated.connect(sigc::mem_fun(avatarDeactivated, &SignalCounter1<Eris::Avatar*>::fired));
315 
316     i.inject(logout);
317 
318     TimeStamp end = TimeStamp::now() + TimeDiff(5 * 1000);
319     while (avatarDeactivated.fireCount() == 0 && (TimeStamp::now() < end)) {
320         Eris::PollDefault::poll();
321     }
322 
323     assert(avatarDeactivated.fireCount() == 1);
324     assert(transferRequested.fireCount() == 0);
325     assert(acc->isLoggedIn());
326     assert(acc->getActiveCharacters().size() == 0);
327 
328     //The avatar has been destroyed when logging out, so we shouldn't let the unique_ptr do that too.
329     av.release();
330 
331 }
332