1 /* $Id$ */
2 /***************************************************************************
3  *                   (C) Copyright 2003-2010 - Stendhal                    *
4  ***************************************************************************
5  ***************************************************************************
6  *                                                                         *
7  *   This program is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU General Public License as published by  *
9  *   the Free Software Foundation; either version 2 of the License, or     *
10  *   (at your option) any later version.                                   *
11  *                                                                         *
12  ***************************************************************************/
13 package games.stendhal.client;
14 
15 import static org.junit.Assert.assertFalse;
16 import static org.junit.Assert.assertTrue;
17 
18 import org.junit.After;
19 import org.junit.AfterClass;
20 import org.junit.Before;
21 import org.junit.BeforeClass;
22 import org.junit.Test;
23 
24 import marauroa.common.game.RPObject;
25 
26 public class PerceptionToObjectTest {
27 
28 	private class ObjectChangeListenerAdapter implements
29 			ObjectChangeListener {
30 
31 
ObjectChangeListenerAdapter()32 		private ObjectChangeListenerAdapter() {
33 
34 		}
35 
36 		@Override
deleted()37 		public void deleted() {
38 
39 		}
40 
41 		@Override
modifiedAdded(final RPObject changes)42 		public void modifiedAdded(final RPObject changes) {
43 
44 		}
45 
46 		@Override
modifiedDeleted(final RPObject changes)47 		public void modifiedDeleted(final RPObject changes) {
48 
49 		}
50 	}
51 
52 	@BeforeClass
setUpBeforeClass()53 	public static void setUpBeforeClass() throws Exception {
54 	}
55 
56 	@AfterClass
tearDownAfterClass()57 	public static void tearDownAfterClass() throws Exception {
58 	}
59 
60 	@Before
setUp()61 	public void setUp() throws Exception {
62 	}
63 
64 	@After
tearDown()65 	public void tearDown() throws Exception {
66 	}
67 
68 	/**
69 	 * Tests for onClear2Listeners1Object.
70 	 */
71 	@Test
testOnClear2Listeners1Object()72 	public final void testOnClear2Listeners1Object() {
73 		final PerceptionToObject pto = new PerceptionToObject();
74 		final RPObject testvalues = new RPObject();
75 
76 		final ObjectChangeListener listener1 = new ObjectChangeListenerAdapter() {
77 			@Override
78 			public void deleted() {
79 				testvalues.put("listener1", "");
80 
81 			}
82 		};
83 		final ObjectChangeListener listener2 = new ObjectChangeListenerAdapter() {
84 			@Override
85 			public void deleted() {
86 				testvalues.put("listener2", "");
87 			}
88 		};
89 
90 		RPObject observed = new RPObject();
91 		observed.setID(new RPObject.ID(1, "zone"));
92 		assertFalse(testvalues.has("listener1"));
93 		assertFalse(testvalues.has("listener2"));
94 
95 		pto.register(observed, listener1);
96 		pto.register(observed, listener2);
97 
98 		assertTrue(pto.map.get(observed.getID()).contains(listener2));
99 		assertTrue(pto.map.get(observed.getID()).contains(listener1));
100 
101 		pto.onClear();
102 
103 
104 		assertTrue(testvalues.has("listener2"));
105 		assertTrue(testvalues.has("listener1"));
106 	}
107 
108 	// TODO: remove listener from pto must remove all references
109 
110 
111 
112 	/**
113 	 * Tests for onClear.
114 	 */
115 	@Test
testOnClear()116 	public final void testOnClear() {
117 		final String attribute = "clear";
118 		final PerceptionToObject pto = new PerceptionToObject();
119 		final RPObject object = new RPObject();
120 		object.setID(new RPObject.ID(1, "zone"));
121 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
122 
123 			@Override
124 			public void deleted() {
125 				object.put(attribute, "");
126 			}
127 
128 		};
129 		final RPObject object2 = new RPObject();
130 		object2.setID(new RPObject.ID(2, "zone"));
131 
132 		pto.register(object, listener);
133 		pto.register(object2, listener);
134 		assertTrue("object is contained in map after register of listener", pto.map.containsKey(object.getID()));
135 
136 		assertFalse("deleted not yet called", object.has(attribute));
137 
138 		assertTrue(pto.map.containsKey(object2.getID()));
139 		assertFalse(object2.has(attribute));
140 
141 		pto.onClear();
142 
143 		assertTrue(object.has(attribute));
144 		assertFalse(object2.has(attribute));
145 
146 		assertFalse(pto.map.containsKey(object.getID()));
147 		assertFalse(pto.map.containsKey(object2.getID()));
148 	}
149 
150 	/**
151 	 * Tests for onDeleted.
152 	 */
153 	@Test
testOnDeleted()154 	public final void testOnDeleted() {
155 		final String attribute = "deleted";
156 		final PerceptionToObject pto = new PerceptionToObject();
157 		final RPObject object = new RPObject();
158 		object.setID(new RPObject.ID(1, "zone"));
159 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
160 
161 			@Override
162 			public void deleted() {
163 				object.put(attribute, "");
164 			}
165 
166 		};
167 		final RPObject object2 = new RPObject();
168 		object2.setID(new RPObject.ID(2, "zone"));
169 
170 		pto.register(object, listener);
171 		pto.register(object2, listener);
172 		assertTrue(pto.map.containsKey(object.getID()));
173 
174 		assertFalse(object.has(attribute));
175 
176 		assertTrue(pto.map.containsKey(object2.getID()));
177 		assertFalse(object2.has(attribute));
178 
179 		pto.onDeleted(object);
180 
181 		assertFalse(pto.map.containsKey(object.getID()));
182 		assertTrue(object.has(attribute));
183 		assertTrue(pto.map.containsKey(object2.getID()));
184 		assertFalse(object2.has(attribute));
185 	}
186 
187 	/**
188 	 * Tests for onException.
189 	 */
190 	@Test
testOnException()191 	public final void testOnException() {
192 		final String attribute = "clear";
193 		final PerceptionToObject pto = new PerceptionToObject();
194 		final RPObject object = new RPObject();
195 		object.setID(new RPObject.ID(1, "zone"));
196 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
197 
198 			@Override
199 			public void deleted() {
200 				object.put(attribute, "");
201 			}
202 
203 		};
204 		final RPObject object2 = new RPObject();
205 		object2.setID(new RPObject.ID(2, "zone"));
206 
207 		pto.register(object, listener);
208 		pto.register(object2, listener);
209 		assertTrue(pto.map.containsKey(object.getID()));
210 
211 		assertFalse(object.has(attribute));
212 
213 		assertTrue(pto.map.containsKey(object2.getID()));
214 		assertFalse(object2.has(attribute));
215 
216 		pto.onException(null, null);
217 
218 		assertTrue(object.has(attribute));
219 		assertFalse(pto.map.containsKey(object.getID()));
220 		assertFalse(pto.map.containsKey(object2.getID()));
221 	}
222 
223 	/**
224 	 * Tests for onModifiedAdded.
225 	 */
226 	@Test
testOnModifiedAdded()227 	public final void testOnModifiedAdded() {
228 		final PerceptionToObject pto = new PerceptionToObject();
229 		final RPObject object = new RPObject();
230 		object.setID(new RPObject.ID(1, "zone"));
231 		final String attribute = "modifiedadded";
232 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
233 
234 			@Override
235 			public void modifiedAdded(final RPObject changes) {
236 				object.add(attribute, 1);
237 			}
238 		};
239 
240 		final RPObject changes = new RPObject();
241 		changes.setID(new RPObject.ID(object.getID().getObjectID(), object.getID().getZoneID()));
242 		final RPObject object2 = new RPObject();
243 		object2.setID(new RPObject.ID(2, "zone"));
244 
245 		pto.register(object, listener);
246 		pto.register(object2, listener);
247 		assertTrue(pto.map.containsKey(object.getID()));
248 		assertFalse(object.has(attribute));
249 
250 		assertTrue(pto.map.containsKey(object2.getID()));
251 		assertFalse(object2.has(attribute));
252 
253 		pto.onModifiedAdded(object, changes);
254 
255 		assertTrue(pto.map.containsKey(object.getID()));
256 		assertTrue(object.has(attribute));
257 		assertTrue(pto.map.containsKey(object2.getID()));
258 		assertFalse(object2.has(attribute));
259 	}
260 
261 	/**
262 	 * Tests for onModifiedDeleted.
263 	 */
264 	@Test
testOnModifiedDeleted()265 	public final void testOnModifiedDeleted() {
266 		final PerceptionToObject pto = new PerceptionToObject();
267 		final RPObject object = new RPObject();
268 		object.setID(new RPObject.ID(1, "zone"));
269 		final String attribute = "modifieddeleted";
270 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
271 
272 			@Override
273 			public void modifiedDeleted(final RPObject changes) {
274 				object.add(attribute, 1);
275 			}
276 		};
277 
278 		final RPObject changes = new RPObject();
279 		changes.setID(new RPObject.ID(object.getID().getObjectID(), object.getID().getZoneID()));
280 		final RPObject object2 = new RPObject();
281 		object2.setID(new RPObject.ID(2, "zone"));
282 
283 		pto.register(object, listener);
284 		pto.register(object2, listener);
285 		assertTrue(pto.map.containsKey(object.getID()));
286 		assertFalse(object.has(attribute));
287 
288 		assertTrue(pto.map.containsKey(object2.getID()));
289 		assertFalse(object2.has(attribute));
290 
291 		pto.onModifiedDeleted(object, changes);
292 
293 		assertTrue(pto.map.containsKey(object.getID()));
294 		assertTrue(object.has(attribute));
295 		assertTrue(pto.map.containsKey(object2.getID()));
296 		assertFalse(object2.has(attribute));
297 
298 	}
299 
300 	/**
301 	 * Tests for onMyRPObject.
302 	 */
303 	@Test
testOnMyRPObject()304 	public final void testOnMyRPObject() {
305 		final PerceptionToObject pto = new PerceptionToObject();
306 		final RPObject object = new RPObject();
307 		object.setID(new RPObject.ID(1, "zone"));
308 		final String attribute = "modifieddeleted";
309 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter() {
310 
311 			@Override
312 			public void modifiedDeleted(final RPObject changes) {
313 				object.add(attribute, 1);
314 			}
315 		};
316 
317 		final RPObject changes = new RPObject();
318 		changes.setID(new RPObject.ID(object.getID().getObjectID(), object.getID().getZoneID()));
319 		final RPObject object2 = new RPObject();
320 		object2.setID(new RPObject.ID(2, "zone"));
321 
322 		pto.register(object, listener);
323 		pto.register(object2, listener);
324 		assertTrue(pto.map.containsKey(object.getID()));
325 		assertFalse(object.has(attribute));
326 
327 		assertTrue(pto.map.containsKey(object2.getID()));
328 		assertFalse(object2.has(attribute));
329 
330 		pto.onModifiedDeleted(object, changes);
331 
332 		assertTrue(pto.map.containsKey(object.getID()));
333 		assertTrue(object.has(attribute));
334 		assertTrue(pto.map.containsKey(object2.getID()));
335 		assertFalse(object2.has(attribute));
336 	}
337 
338 
339 	/**
340 	 * Tests for registerUnregister.
341 	 */
342 	@Test
testRegisterUnregister()343 	public final void testRegisterUnregister() {
344 		final PerceptionToObject pto = new PerceptionToObject();
345 		final RPObject object = new RPObject();
346 		object.setID(new RPObject.ID(1, "zone"));
347 		final ObjectChangeListener listener = new ObjectChangeListenerAdapter();
348 
349 		final RPObject changes = new RPObject();
350 		changes.setID(new RPObject.ID(object.getID().getObjectID(), object.getID().getZoneID()));
351 		final RPObject object2 = new RPObject();
352 		object2.setID(new RPObject.ID(2, "zone"));
353 		final RPObject object3 = new RPObject();
354 		object3.setID(new RPObject.ID(3, "zone"));
355 
356 		pto.register(object, listener);
357 		pto.register(object2, listener);
358 		pto.register(object3, new ObjectChangeListenerAdapter());
359 		assertTrue(pto.map.containsKey(object.getID()));
360 		assertTrue(pto.map.containsKey(object2.getID()));
361 		assertTrue(pto.map.containsKey(object3.getID()));
362 
363 
364 		pto.unregister(listener);
365 		assertTrue(pto.map.get(object.getID()).isEmpty());
366 		assertTrue(pto.map.get(object2.getID()).isEmpty());
367 		assertFalse(pto.map.get(object3.getID()).isEmpty());
368 
369 	}
370 
371 	/**
372 	 * Tests for absentObject.
373 	 */
374 	@Test
testabsentObject()375 	public final void testabsentObject() {
376 		PerceptionToObject pto = new PerceptionToObject();
377 		assertTrue(pto.map.isEmpty());
378 		RPObject object = new RPObject();
379 		object.setID(new RPObject.ID(1, "ZONE"));
380 
381 		pto.onClear();
382 		pto.onDeleted(object);
383 		pto.onException(null, null);
384 		pto.onModifiedAdded(object, null);
385 		pto.onModifiedDeleted(object, null);
386 		pto.onMyRPObject(object, null);
387 		pto.onMyRPObject(null, object);
388 
389 
390 	}
391 
392 }
393