1 /***************************************************************************
2  *                   (C) Copyright 2003-2016 - Stendhal                    *
3  ***************************************************************************
4  ***************************************************************************
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 package games.stendhal.common;
13 
14 import static org.hamcrest.Matchers.is;
15 import static org.junit.Assert.assertFalse;
16 import static org.junit.Assert.assertThat;
17 import static org.junit.Assert.assertTrue;
18 
19 import java.awt.geom.Rectangle2D;
20 import java.util.BitSet;
21 
22 import org.junit.BeforeClass;
23 import org.junit.Test;
24 
25 import games.stendhal.client.entity.Player;
26 import games.stendhal.client.util.UserInterfaceTestHelper;
27 import games.stendhal.common.tiled.LayerDefinition;
28 import games.stendhal.server.core.engine.StendhalRPRuleProcessor;
29 import games.stendhal.server.maps.MockStendlRPWorld;
30 import utilities.PlayerTestHelper;
31 
32 public class CollisionMapTest {
33 
34 	@BeforeClass
setUpBeforeClass()35 	public static void setUpBeforeClass() throws Exception {
36 		UserInterfaceTestHelper.initUserInterface();
37 	}
38 
39 	/**
40 	 * Tests for collissionMap.
41 	 */
42 	@Test
testCollissionMap()43 	public void testCollissionMap() {
44 		final CollisionMap map = new CollisionMap(1, 1);
45 		assertThat(map.getWidth(), is(1));
46 		assertThat(map.getHeight(), is(1));
47 		final CollisionMap map2x2 = new CollisionMap(2, 2);
48 		assertThat(map2x2.getWidth(), is(2));
49 		assertThat(map2x2.getHeight(), is(2));
50 	}
51 
52 	/**
53 	 * Tests for collides.
54 	 */
55 	@Test
testcollides()56 	public void testcollides() {
57 		final CollisionMap map = new CollisionMap(2, 2);
58 		assertFalse(map.get(0, 0));
59 		assertFalse(map.get(1, 0));
60 		assertFalse(map.get(0, 1));
61 		assertFalse(map.get(1, 1));
62 		map.set(1, 0);
63 		assertFalse(map.get(0, 0));
64 		assertTrue(map.get(1, 0));
65 		assertFalse(map.get(0, 1));
66 		assertFalse(map.get(1, 1));
67 
68 		assertTrue(map.collides(0, 0, 2, 2));
69 	}
70 
71 	/**
72 	 * Tests for collides2.
73 	 */
74 	@Test
testcollides2()75 	public void testcollides2() {
76 		final CollisionMap map = new CollisionMap(4, 4);
77 		map.set(0, 0);
78 		map.set(3, 0);
79 		map.set(0, 3);
80 		map.set(3, 3);
81 		assertTrue(map.collides(0, 0, 4, 4));
82 
83 		assertTrue(map.collides(0, 0, 2, 2));
84 		assertFalse(map.collides(0, 1, 2, 2));
85 		assertTrue(map.collides(0, 2, 2, 2));
86 		assertTrue("edge", map.collides(0, 3, 2, 2));
87 
88 		assertFalse(map.collides(1, 0, 2, 2));
89 		assertFalse(map.collides(1, 1, 2, 2));
90 		assertFalse(map.collides(1, 2, 2, 2));
91 		assertTrue("edge", map.collides(1, 3, 2, 2));
92 
93 		assertTrue(map.collides(2, 0, 2, 2));
94 		assertFalse(map.collides(2, 1, 2, 2));
95 		assertTrue(map.collides(2, 2, 2, 2));
96 		assertTrue("edge", map.collides(2, 3, 2, 2));
97 
98 		assertTrue("edge", map.collides(3, 0, 2, 2));
99 		assertTrue("edge", map.collides(3, 1, 2, 2));
100 		assertTrue("edge", map.collides(3, 2, 2, 2));
101 		assertTrue("edge", map.collides(3, 3, 2, 2));
102 	}
103 
104 	/**
105 	 * Tests for collidesEdges.
106 	 */
107 	@Test
testcollidesEdges()108 	public void testcollidesEdges() {
109 		final CollisionMap map = new CollisionMap(4, 4);
110 		assertFalse(map.collides(0, 0, 2, 2));
111 		assertFalse(map.collides(0, 1, 2, 2));
112 		assertFalse(map.collides(0, 2, 2, 2));
113 		assertTrue("edge", map.collides(0, 3, 2, 2));
114 
115 		assertFalse(map.collides(1, 0, 2, 2));
116 		assertFalse(map.collides(1, 1, 2, 2));
117 		assertFalse(map.collides(1, 2, 2, 2));
118 		assertTrue("edge", map.collides(1, 3, 2, 2));
119 
120 		assertFalse(map.collides(2, 0, 2, 2));
121 		assertFalse(map.collides(2, 1, 2, 2));
122 		assertFalse(map.collides(2, 2, 2, 2));
123 		assertTrue("edge", map.collides(2, 3, 2, 2));
124 
125 		assertTrue("edge", map.collides(3, 0, 2, 2));
126 		assertTrue("edge", map.collides(3, 1, 2, 2));
127 		assertTrue("edge", map.collides(3, 2, 2, 2));
128 		assertTrue("edge", map.collides(3, 3, 2, 2));
129 	}
130 
131 	/**
132 	 * Tests for bitsetlogic.
133 	 */
134 	@Test
testbitsetlogic()135 	public void testbitsetlogic() {
136 		final BitSet setallfalse = new BitSet(7);
137 		final BitSet invert = (BitSet) setallfalse.clone();
138 		assertThat(invert.length(), is(0));
139 
140 		invert.flip(0, 6);
141 		assertThat(invert.length(), is(6));
142 		final BitSet set = new BitSet();
143 		set.set(3);
144 		set.set(4);
145 		set.set(5);
146 		set.set(7);
147 		set.set(8);
148 
149 		final BitSet subset = set.get(2, 6);
150 
151 		assertFalse(subset.get(0));
152 		assertTrue(subset.get(1));
153 		assertTrue(subset.get(2));
154 		assertTrue(subset.get(3));
155 		assertFalse(subset.get(4));
156 		assertFalse(subset.get(5));
157 
158 		final BitSet subset2 = set.get(2, 8);
159 
160 		assertFalse(subset2.get(0));
161 		assertTrue(subset2.get(1));
162 		assertTrue(subset2.get(2));
163 		assertTrue(subset2.get(3));
164 		assertFalse(subset2.get(4));
165 		assertTrue(subset2.get(5));
166 		assertFalse(subset2.get(6));
167 	}
168 
169 	/**
170 	 * Tests for clear.
171 	 */
172 	@Test
testClear()173 	public void testClear() {
174 		final CollisionMap map = new CollisionMap(4, 4);
175 		map.set(0, 0);
176 		map.set(3, 0);
177 		map.set(0, 3);
178 		map.set(3, 3);
179 		assertTrue(map.collides(0, 0, 4, 4));
180 		map.clear();
181 		assertFalse(map.collides(0, 0, 4, 4));
182 	}
183 
184 	/**
185 	 * Tests for setCollideRectangle2D2x1.
186 	 */
187 	@Test
testsetCollideRectangle2D2x1()188 	public void testsetCollideRectangle2D2x1() {
189 		final CollisionMap map = new CollisionMap(4, 4);
190 		Rectangle2D shape = new Rectangle2D.Double(1.0, 2.0, 2.0, 1.0);
191 		map.set(shape);
192 		assertFalse(map.get(0, 0));
193 		assertFalse(map.get(0, 1));
194 		assertFalse(map.get(0, 2));
195 		assertFalse(map.get(0, 3));
196 
197 		assertFalse(map.get(1, 0));
198 		assertFalse(map.get(1, 1));
199 		assertTrue(map.get(1, 2));
200 		assertFalse(map.get(1, 3));
201 
202 		assertFalse(map.get(2, 0));
203 		assertFalse(map.get(2, 1));
204 		assertTrue(map.get(2, 2));
205 		assertFalse(map.get(2, 3));
206 
207 		assertFalse(map.get(3, 0));
208 		assertFalse(map.get(3, 1));
209 		assertFalse(map.get(3, 2));
210 		assertFalse(map.get(3, 3));
211 	}
212 
213 	/**
214 	 * Tests for setCollideRectangle2D2x3.
215 	 */
216 	@Test
testsetCollideRectangle2D2x3()217 	public void testsetCollideRectangle2D2x3() {
218 		final CollisionMap map = new CollisionMap(4, 4);
219 		Rectangle2D shape = new Rectangle2D.Double(1.0, 0.0, 2.0, 3.0);
220 		map.set(shape);
221 		assertFalse(map.get(0, 0));
222 		assertFalse(map.get(0, 1));
223 		assertFalse(map.get(0, 2));
224 		assertFalse(map.get(0, 3));
225 
226 		assertTrue(map.get(1, 0));
227 		assertTrue(map.get(1, 1));
228 		assertTrue(map.get(1, 2));
229 		assertFalse(map.get(1, 3));
230 
231 		assertTrue(map.get(2, 0));
232 		assertTrue(map.get(2, 1));
233 		assertTrue(map.get(2, 2));
234 		assertFalse(map.get(2, 3));
235 
236 		assertFalse(map.get(3, 0));
237 		assertFalse(map.get(3, 1));
238 		assertFalse(map.get(3, 2));
239 		assertFalse(map.get(3, 3));
240 	}
241 
242 
243 	/**
244 	 * Tests for createLayerDefintion.
245 	 */
246 	@Test
testCreateLayerDefintion()247 	public void testCreateLayerDefintion() {
248 		LayerDefinition layer;
249 		final int width = 3;
250 		final int height = 4;
251 		layer = new LayerDefinition(width, height);
252 		layer.build();
253 		layer.set(1, 2, 1);
254 		layer.set(2, 3, 1);
255 
256 		final CollisionMap map = new CollisionMap(layer);
257 		assertThat(map.getWidth(), is(3));
258 		assertThat(map.getHeight(), is(4));
259 		for (int x = 0; x < width; x++) {
260 			for (int y = 0; y < height; y++) {
261 				final boolean isSet = layer.getTileAt(x, y) != 0;
262 				assertThat(x + ";" + y, map.get(x, y), is(isSet));
263 			}
264 		}
265 
266 	}
267 
268 	/**
269 	 * Tests for collidesEntity.
270 	 */
271 	@Test
testCollidesEntity()272 	public void testCollidesEntity() {
273 		final CollisionMap map = new CollisionMap(4, 4);
274 		map.set(1, 1);
275 		Player bob = new Player();
276 		PlayerTestHelper.generatePlayerRPClasses();
277 		StendhalRPRuleProcessor.get();
278 		MockStendlRPWorld.get();
279 		games.stendhal.server.entity.player.Player serverbob = games.stendhal.server.entity.player.Player
280 				.createZeroLevelPlayer("bob", null);
281 		serverbob.setPosition(0, 0);
282 		bob.initialize(serverbob);
283 
284 		assertThat(bob.getWidth(), is(1.0));
285 		assertThat(bob.getWidth(), is(1.0));
286 		assertThat(bob.getX(), is(0.0));
287 		assertThat(bob.getY(), is(0.0));
288 
289 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
290 				.getWidth(), (int) bob.getHeight()));
291 		serverbob.setPosition(0, 1);
292 		bob.initialize(serverbob);
293 		assertThat(bob.getX(), is(0.0));
294 		assertThat(bob.getY(), is(1.0));
295 
296 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
297 				.getWidth(), (int) bob.getHeight()));
298 		serverbob.setPosition(0, 2);
299 		bob.initialize(serverbob);
300 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
301 				.getWidth(), (int) bob.getHeight()));
302 		serverbob.setPosition(0, 3);
303 		bob.initialize(serverbob);
304 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
305 				.getWidth(), (int) bob.getHeight()));
306 		serverbob.setPosition(1, 0);
307 		bob.initialize(serverbob);
308 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
309 				.getWidth(), (int) bob.getHeight()));
310 		serverbob.setPosition(1, 1);
311 		bob.initialize(serverbob);
312 		assertTrue(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
313 				.getWidth(), (int) bob.getHeight()));
314 		serverbob.setPosition(1, 2);
315 		bob.initialize(serverbob);
316 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
317 				.getWidth(), (int) bob.getHeight()));
318 		serverbob.setPosition(1, 3);
319 		bob.initialize(serverbob);
320 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
321 				.getWidth(), (int) bob.getHeight()));
322 		serverbob.setPosition(2, 0);
323 		bob.initialize(serverbob);
324 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
325 				.getWidth(), (int) bob.getHeight()));
326 		serverbob.setPosition(2, 1);
327 		bob.initialize(serverbob);
328 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
329 				.getWidth(), (int) bob.getHeight()));
330 		serverbob.setPosition(2, 2);
331 		bob.initialize(serverbob);
332 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
333 				.getWidth(), (int) bob.getHeight()));
334 		serverbob.setPosition(2, 3);
335 		bob.initialize(serverbob);
336 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
337 				.getWidth(), (int) bob.getHeight()));
338 		serverbob.setPosition(3, 0);
339 		bob.initialize(serverbob);
340 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
341 				.getWidth(), (int) bob.getHeight()));
342 		serverbob.setPosition(3, 1);
343 		bob.initialize(serverbob);
344 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
345 				.getWidth(), (int) bob.getHeight()));
346 		serverbob.setPosition(3, 2);
347 		bob.initialize(serverbob);
348 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
349 				.getWidth(), (int) bob.getHeight()));
350 		serverbob.setPosition(3, 3);
351 		bob.initialize(serverbob);
352 		assertFalse(map.collides((int) bob.getX(), (int) bob.getY(), (int) bob
353 				.getWidth(), (int) bob.getHeight()));
354 	}
355 
356 }
357