/* * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2016 The Catrobat Team * (<http://developer.catrobat.org/credits>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * An additional term exception under section 7 of the GNU Affero * General Public License, version 3, is available at * http://developer.catrobat.org/license_additional_term * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.catrobat.catroid.test.physics; import android.util.Log; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Contact; import org.catrobat.catroid.content.CollisionScript; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.content.bricks.PlaceAtBrick; import org.catrobat.catroid.physics.PhysicsCollision; import org.catrobat.catroid.physics.PhysicsCollisionBroadcast; import org.catrobat.catroid.physics.PhysicsObject; import org.catrobat.catroid.test.utils.Reflection; import java.util.HashMap; import java.util.List; import java.util.Map; public class PhysicsCollisionBetweenTest extends PhysicsCollisionBaseTest { private static final String TAG = PhysicsCollisionBetweenTest.class.getSimpleName(); public PhysicsCollisionBetweenTest() { spritePosition = new Vector2(0.0f, 100.0f); sprite2Position = new Vector2(0.0f, -200.0f); physicsObject1Type = PhysicsObject.Type.DYNAMIC; physicsObject2Type = PhysicsObject.Type.FIXED; } @Override public void beginContactCallback(Contact contact) { try { super.beginContactCallback(contact); Map<Integer, PhysicsCollisionBroadcast> physicsCollisionBroadcasts = (Map<Integer, PhysicsCollisionBroadcast>) Reflection.getPrivateField(PhysicsCollision.class, physicsCollisionTestListener, "physicsCollisionBroadcasts"); assertTrue("Map must contain one element", physicsCollisionBroadcasts.size() == 2); Object[] parameters = { sprite, sprite2 }; Reflection.ParameterList paramList = new Reflection.ParameterList(parameters); String key = (String) Reflection.invokeMethod(PhysicsCollision.class, physicsCollisionTestListener, "generateKey", paramList); PhysicsCollisionBroadcast collisionBroadcast = physicsCollisionBroadcasts.get(key); assertEquals("collision broadcast counter must be equal to beginCounter - endCounter", collisionBroadcast .getContactCounter(), getContactDifference()); } catch (Exception exception) { Log.e(TAG, Log.getStackTraceString(exception)); fail("An unexpected exception was captured. See Logcat for details"); } } @Override public void endContactCallback(Contact contact) { try { super.endContactCallback(contact); Map<Integer, PhysicsCollisionBroadcast> physicsCollisionBroadcasts = (Map<Integer, PhysicsCollisionBroadcast>) Reflection.getPrivateField(PhysicsCollision.class, physicsCollisionTestListener, "physicsCollisionBroadcasts"); if (getContactDifference() == 0) { assertTrue("Map must contain zero elements", physicsCollisionBroadcasts.size() == 0); } else { assertTrue("Map must contain one element", physicsCollisionBroadcasts.size() == 2); } } catch (Exception exception) { Log.e(TAG, Log.getStackTraceString(exception)); fail("An unexpected exception was captured. See Logcat for details"); } } public void testIfBroadcastsAreCorrectPreparedAndFired() { assertTrue("collision rate is not zero before step", isContactRateOk()); assertTrue("no collision detected", simulateFullCollision()); assertTrue("collision rate is not zero after step", isContactRateOk()); } public void testCollisionBroadcastOfTwoSprites() { assertTrue("getLookData of sprite is null", sprite.look.getLookData() != null); assertTrue("getLookData of sprite2 is null", sprite2.look.getLookData() != null); CollisionScript secondSpriteCollisionScript = new CollisionScript(""); secondSpriteCollisionScript.setAndReturnBroadcastMessage(sprite2.getName(), sprite.getName()); secondSpriteCollisionScript.getScriptBrick(); int testXValue = 444; int testYValue = 555; PlaceAtBrick testBrick = new PlaceAtBrick(testXValue, testYValue); secondSpriteCollisionScript.addBrick(testBrick); sprite2.addScript(secondSpriteCollisionScript); sprite2.createStartScriptActionSequenceAndPutToMap(new HashMap<String, List<String>>()); simulateFullCollision(); while (!allActionsOfAllSpritesAreFinished()) { for (Sprite spriteOfList : project.getDefaultScene().getSpriteList()) { spriteOfList.look.act(1.0f); } } assertEquals("X Value of Sprite was not set", (float) testXValue, sprite2.look .getXInUserInterfaceDimensionUnit()); assertEquals("Y Value of Sprite was not set", (float) testYValue, sprite2.look .getYInUserInterfaceDimensionUnit()); } public boolean allActionsOfAllSpritesAreFinished() { for (Sprite spriteOfList : project.getDefaultScene().getSpriteList()) { if (!spriteOfList.look.getAllActionsAreFinished()) { return false; } } return true; } }