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