package fi.hbp.angr.logic; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.fail; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.utils.GdxNativesLoader; import fi.hbp.angr.models.Destructible; public class ModelContactListenerTest { World world; GameState gameState; ModelContactListener listener; protected class TestActor extends Actor implements Destructible { DamageModel dm; boolean destroyed = false; Body body; public TestActor(Body body, boolean enableDM) { this.body = body; body.setUserData(this); if (enableDM) { dm = new TestDamageModel(); dm.setHealth(1.0f); } } @Override public DamageModel getDatamageModel() { return dm; } @Override public void setDestroyed() { destroyed = true; } @Override public boolean isDestroyed() { return destroyed; } @Override public Body getBody() { return body; } } @BeforeClass public static void setUpBeforeClass() throws Exception { GdxNativesLoader.load(); } @AfterClass public static void tearDownAfterClass() throws Exception { } @Before public void setUp() throws Exception { world = new World(new Vector2(0.0f, -9.8f), true); gameState = new GameState(); gameState.addPoints(100, false); listener = new ModelContactListener(gameState); world.setContactListener(listener); spawnBox(0.0f, 0.0f, BodyType.StaticBody, false); } protected TestActor spawnBox(float x, float y, BodyType bt, boolean enDM) { PolygonShape ps = new PolygonShape(); ps.setAsBox(1.0f, 1.0f); FixtureDef fd = new FixtureDef(); fd.shape = ps; fd.density = 1.0f; BodyDef bd = new BodyDef(); bd.type = bt; bd.position.set(x, y); bd.active = true; Body body = world.createBody(bd); body.createFixture(fd); TestActor actor = new TestActor(body, enDM); return actor; } @After public void tearDown() throws Exception { listener = null; gameState = null; } @Test public void testModelContactListener() { assertThat(listener.gameState.getScore(), equalTo(100)); } @Test public void testPostSolveScore() { int timeout = 15000; TestActor actor = spawnBox(0.0f, 3.0f, BodyType.DynamicBody, true); assertThat(((Destructible)actor).getDatamageModel().getHealth(), equalTo(1.0f)); do { world.step(0.1f, 6, 2); actor.isDestroyed(); if (--timeout == 0) { fail("No contact"); } } while (world.getContactCount() == 0); world.step(0.1f, 6, 2); world.step(0.1f, 6, 2); assertThat(((Destructible)actor).getDatamageModel().getHealth(), equalTo(0.0f)); assertThat(listener.gameState.getScore(), equalTo(110)); } @Test public void testPostSolveNoScore() { int timeout = 15000; TestActor actor = spawnBox(0.0f, 3.0f, BodyType.DynamicBody, false); do { world.step(60.0f, 6, 2); if (--timeout == 0) { fail("No contact"); } } while (world.getContactCount() == 0); assertThat(actor.isDestroyed(), equalTo(false)); assertThat(listener.gameState.getScore(), equalTo(100)); } }