/* * 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.sensing; import android.graphics.Bitmap; import android.test.InstrumentationTestCase; import com.badlogic.gdx.math.Polygon; import junit.framework.Assert; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.content.Project; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.sensing.CollisionInformation; import org.catrobat.catroid.sensing.CollisionPolygonVertex; import org.catrobat.catroid.test.utils.PhysicsTestUtils; import org.catrobat.catroid.test.utils.TestUtils; import org.catrobat.catroid.utils.Utils; import java.io.File; import java.util.ArrayList; import java.util.Arrays; public class CollisionInformationTest extends InstrumentationTestCase { public void testCheckMetaString() { String isNull = null; Assert.assertFalse("Null string returned true", CollisionInformation.checkMetaDataString(isNull)); String empty = ""; Assert.assertFalse("Empty string returned true", CollisionInformation.checkMetaDataString(empty)); String faulty1 = "1.0;1.0;1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty1)); String faulty2 = "1.0;1.0;1.0;1.0;1.0;1.0|"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty2)); String faulty3 = "1.0;1.0;1.0;1.0;1.0;1.0|1.0;1.0;1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty3)); String faulty4 = "|1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty4)); String faulty5 = "1.0;1.0;1.0;1.0;1.0,1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty5)); String faulty6 = "1.0;1.0;1.0;1.0;1.0;1.0||1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty6)); String faulty7 = "1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertFalse("Faulty string returned true", CollisionInformation.checkMetaDataString(faulty7)); String correct1 = "1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertTrue("Correct string returned false", CollisionInformation.checkMetaDataString(correct1)); String correct2 = "1.0;1.0;1.0;1.0;1.0;1.0|1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertTrue("Correct string returned false", CollisionInformation.checkMetaDataString(correct2)); String correct3 = "1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertTrue("Correct string returned false", CollisionInformation.checkMetaDataString(correct3)); String correct4 = "1.0;1.0;1.0;1.0;1.0;1.0|1.0;1.0;1.0;1.0;1.0;1.0|1.0;1.0;1.0;1.0;1.0;1.0"; Assert.assertTrue("Correct string returned false", CollisionInformation.checkMetaDataString(correct4)); } public void testCreateCollisionPolygonByHitbox() { Bitmap bitmap = Bitmap.createBitmap(200, 100, Bitmap.Config.ALPHA_8); Polygon[] polygons = CollisionInformation.createCollisionPolygonByHitbox(bitmap); Assert.assertTrue("Wrong vertices calculated", Arrays.equals(polygons[0].getVertices(), new float[] { 0.0f, 0.0f, 200.0f, 0.0f, 200.0f, 100.0f, 0.0f, 100.0f })); } public void testGetCollisionPolygonFromPNGMeta() { final int resourceId = org.catrobat.catroid.test.R.raw.polygon_in_file; TestUtils.deleteTestProjects(); Project project = new Project(getInstrumentation().getTargetContext(), TestUtils.DEFAULT_TEST_PROJECT_NAME); StorageHandler.getInstance().saveProject(project); ProjectManager.getInstance().setProject(project); String filename = PhysicsTestUtils.getInternalImageFilenameFromFilename("polygon_in_file.png"); File file = null; try { file = TestUtils.saveFileToProject(TestUtils.DEFAULT_TEST_PROJECT_NAME, project.getDefaultScene().getName(), filename, resourceId, getInstrumentation().getContext(), TestUtils.TYPE_IMAGE_FILE); } catch (Exception e) { Assert.fail("Couldn't load file, exception thrown!"); } Polygon[] collisionPolygons = CollisionInformation.getCollisionPolygonFromPNGMeta(file.getAbsolutePath()); Assert.assertNotNull("CollsionPolygons is null", collisionPolygons); Assert.assertTrue("CollisionPolygons length is 0", collisionPolygons.length != 0); Assert.assertEquals("Wrong amount of collisionPolygons", 1, collisionPolygons.length); Assert.assertTrue("Wrong Collision Polygon", Arrays.equals(collisionPolygons[0].getVertices(), new float[] { 0.0f, 47.0f, 17.0f, 98.0f, 52.0f, 98.0f, 68.0f, 44.0f, 52.0f, 0.0f, 17.0f, 0.0f })); } public void testWriteReadCollisionVerticesToPNGMeta() { TestUtils.deleteTestProjects(); Project project = new Project(getInstrumentation().getTargetContext(), TestUtils.DEFAULT_TEST_PROJECT_NAME); StorageHandler.getInstance().saveProject(project); ProjectManager.getInstance().setProject(project); String filename = "collision_donut.png"; int resourceId = org.catrobat.catroid.test.R.raw.collision_donut; String hashedFileName = Utils.md5Checksum(filename) + "_" + filename; File file = null; try { file = TestUtils.saveFileToProject(TestUtils.DEFAULT_TEST_PROJECT_NAME, project.getDefaultScene().getName(), hashedFileName, resourceId, getInstrumentation().getContext(), TestUtils.TYPE_IMAGE_FILE); } catch (Exception e) { Assert.fail("Couldn't load file, exception thrown!"); } float[] firstVertices = new float[] { 0.0f, 0.0f, 111.0f, 0.0f, 111.0f, 222.0f }; float[] secondVertices = new float[] { 10.0f, 10.0f, 20.0f, 10.0f, 20.0f, 20.0f, 10.0f, 20.0f }; Polygon[] polygons = { new Polygon(firstVertices), new Polygon(secondVertices) }; CollisionInformation.writeCollisionVerticesToPNGMeta(polygons, file.getAbsolutePath()); Polygon[] testPolygons = CollisionInformation.getCollisionPolygonFromPNGMeta(file.getAbsolutePath()); boolean sameVertices = Arrays.equals(testPolygons[0].getVertices(), firstVertices) && Arrays.equals(testPolygons[1].getVertices(), secondVertices); Assert.assertTrue("Not the same vertices have been read from the file! ", sameVertices); } public void testWriteReadEmptyCollisionVerticesToPNGMeta() { TestUtils.deleteTestProjects(); Project project = new Project(getInstrumentation().getTargetContext(), TestUtils.DEFAULT_TEST_PROJECT_NAME); StorageHandler.getInstance().saveProject(project); ProjectManager.getInstance().setProject(project); String filename = "collision_donut.png"; int resourceId = org.catrobat.catroid.test.R.raw.collision_donut; String hashedFileName = Utils.md5Checksum(filename) + "_" + filename; File file = null; try { file = TestUtils.saveFileToProject(TestUtils.DEFAULT_TEST_PROJECT_NAME, project.getDefaultScene().getName(), hashedFileName, resourceId, getInstrumentation().getContext(), TestUtils.TYPE_IMAGE_FILE); } catch (Exception e) { Assert.fail("Couldn't load file, exception thrown!"); } Polygon[] polygons = new Polygon[0]; CollisionInformation.writeCollisionVerticesToPNGMeta(polygons, file.getAbsolutePath()); Polygon[] testPolygons = CollisionInformation.getCollisionPolygonFromPNGMeta(file.getAbsolutePath()); Assert.assertTrue("Test polygon size is not 0! Reading and/or writing failed", testPolygons.length == 0); } private float[] getFloatArrayFromCollisionPolygonVertexArrayList(ArrayList<CollisionPolygonVertex> arrayList) { float[] array = new float[arrayList.size() * 4]; for (int i = 0; i < arrayList.size(); i++) { array[i * 4] = arrayList.get(i).startX; array[i * 4 + 1] = arrayList.get(i).startY; array[i * 4 + 2] = arrayList.get(i).endX; array[i * 4 + 3] = arrayList.get(i).endY; } return array; } public void testCreateHorizontalAndVerticalVertices() { boolean[][] grid = new boolean[][] { { false, false, true, true, true, false, false }, { false, false, true, false, true, false, false }, { true, true, true, true, true, true, true }, { true, false, true, false, true, false, true }, { true, true, true, true, true, true, true }, { false, false, true, false, true, false, false }, { false, false, true, true, true, false, false } }; int width = grid.length; int height = grid[0].length; float[] horizontalCorrect = new float[] { 2.0f, 0.0f, 5.0f, 0.0f, 3.0f, 1.0f, 4.0f, 1.0f, 0.0f, 2.0f, 2.0f, 2.0f, 1.0f, 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 2.0f, 3.0f, 3.0f, 4.0f, 3.0f, 5.0f, 2.0f, 7.0f, 2.0f, 5.0f, 3.0f, 6.0f, 3.0f, 0.0f, 5.0f, 2.0f, 5.0f, 1.0f, 4.0f, 2.0f, 4.0f, 3.0f, 4.0f, 4.0f, 4.0f, 3.0f, 5.0f, 4.0f, 5.0f, 5.0f, 4.0f, 6.0f, 4.0f, 5.0f, 5.0f, 7.0f, 5.0f, 2.0f, 7.0f, 5.0f, 7.0f, 3.0f, 6.0f, 4.0f, 6.0f }; float[] verticalCorrect = new float[] { 0.0f, 2.0f, 0.0f, 5.0f, 1.0f, 3.0f, 1.0f, 4.0f, 2.0f, 0.0f, 2.0f, 2.0f, 3.0f, 1.0f, 3.0f, 2.0f, 2.0f, 3.0f, 2.0f, 4.0f, 3.0f, 3.0f, 3.0f, 4.0f, 2.0f, 5.0f, 2.0f, 7.0f, 3.0f, 5.0f, 3.0f, 6.0f, 5.0f, 0.0f, 5.0f, 2.0f, 4.0f, 1.0f, 4.0f, 2.0f, 4.0f, 3.0f, 4.0f, 4.0f, 5.0f, 3.0f, 5.0f, 4.0f, 4.0f, 5.0f, 4.0f, 6.0f, 5.0f, 5.0f, 5.0f, 7.0f, 7.0f, 2.0f, 7.0f, 5.0f, 6.0f, 3.0f, 6.0f, 4.0f }; ArrayList<CollisionPolygonVertex> horizontal = CollisionInformation.createHorizontalVertices(grid, width, height); ArrayList<CollisionPolygonVertex> vertical = CollisionInformation.createVerticalVertices(grid, width, height); float[] horizontalTest = getFloatArrayFromCollisionPolygonVertexArrayList(horizontal); float[] verticalTest = getFloatArrayFromCollisionPolygonVertexArrayList(vertical); Assert.assertEquals("Horizontal size not matching", horizontalCorrect.length, horizontalTest.length); Assert.assertEquals("Vertical size not matching", verticalCorrect.length, verticalTest.length); Assert.assertTrue("Horizontal vertices wrongly calculated", Arrays.equals(horizontalTest, horizontalCorrect)); Assert.assertTrue("Vertical vertices wrongly calculated", Arrays.equals(verticalTest, verticalCorrect)); } }