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