/*
* 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.uitest.stage;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.common.LookData;
import org.catrobat.catroid.common.ScreenValues;
import org.catrobat.catroid.content.Project;
import org.catrobat.catroid.content.SingleSprite;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.content.StartScript;
import org.catrobat.catroid.content.WhenScript;
import org.catrobat.catroid.content.bricks.ComeToFrontBrick;
import org.catrobat.catroid.content.bricks.PlaceAtBrick;
import org.catrobat.catroid.content.bricks.SetBrightnessBrick;
import org.catrobat.catroid.content.bricks.SetSizeToBrick;
import org.catrobat.catroid.content.bricks.SetTransparencyBrick;
import org.catrobat.catroid.content.bricks.TurnLeftBrick;
import org.catrobat.catroid.io.StorageHandler;
import org.catrobat.catroid.stage.StageActivity;
import org.catrobat.catroid.ui.MainMenuActivity;
import org.catrobat.catroid.uitest.annotation.Device;
import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase;
import org.catrobat.catroid.uitest.util.UiTestUtils;
import org.catrobat.catroid.utils.UtilUi;
import java.io.File;
public class StageTestComplex extends BaseActivityInstrumentationTestCase<MainMenuActivity> {
private static final int PROJECT_WIDTH = 480;
private static final int PROJECT_HEIGHT = 800;
private static final byte[] RED_PIXEL = { (byte) 237, 28, 36, (byte) 255 };
private static final byte[] RED_BRIGHTNESS_PIXEL = { (byte) 109, 0, 0, (byte) 255 };
private static final byte[] GREEN_PIXEL = { 34, (byte) 177, 76, (byte) 255 };
private static final byte[] YELLOW_PIXEL = { (byte) 255, (byte) 242, 0, (byte) 255 };
private static final byte[] BLUE_PIXEL = { 0, (byte) 162, (byte) 232, (byte) 255 };
private static final byte[] WHITE_PIXEL = { (byte) 255, (byte) 255, (byte) 255, (byte) 255 };
private static final byte[] BLACK_PIXEL = { (byte) 0, (byte) 0, (byte) 0, (byte) 255 };
private static final byte[] BLACK_BRIGHTNESS_PIXEL = { (byte) -124, (byte) -124, (byte) -124, (byte) 255 };
private float screenScaleFactorX = 1.0F;
private float screenScaleFactorY = 1.0F;
public StageTestComplex() {
super(MainMenuActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
screenScaleFactorX = ((float) ScreenValues.SCREEN_WIDTH) / ((float) PROJECT_WIDTH);
screenScaleFactorY = ((float) ScreenValues.SCREEN_HEIGHT) / ((float) PROJECT_HEIGHT);
createProject();
UiTestUtils.prepareStageForTest();
UiTestUtils.getIntoSpritesFromMainMenu(solo);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
}
@Device
public void testShowTexture() {
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(1400);
byte[] screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinatesWithTolerance(screenArray, WHITE_PIXEL, 0, 0, 0);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, -41, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, -41, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, -2, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, -2, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -41
);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, YELLOW_PIXEL, -21, 21);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, WHITE_PIXEL, 0, 0);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLACK_PIXEL, -54, 55);
clickOnProjectCoordinate(21, -21);
solo.sleep(300);
screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 21, 21);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 0, 0);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 21 - 40, 21 - 40);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, 21 - 41, 21 - 41);
clickOnProjectCoordinate(-21, -21);
solo.sleep(300);
screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, WHITE_PIXEL, -31, 21);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 21, 21);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_PIXEL, -41, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -41);
clickOnProjectCoordinate(21, 21);
solo.sleep(300);
screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -41);
clickOnProjectCoordinate(-21, 21);
solo.sleep(300);
screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_BRIGHTNESS_PIXEL, -21, -21);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, RED_BRIGHTNESS_PIXEL, -21, -21 + 27);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -2);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 1, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, GREEN_PIXEL, 40, -41);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 21, 21);
clickOnProjectCoordinate(-50, -50);
solo.sleep(300);
screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLACK_BRIGHTNESS_PIXEL, -54, 55);
}
public void testBehaviourWithoutBricks() {
Project project = ProjectManager.getInstance().getCurrentProject();
assertNotNull("current project was null", project);
Sprite blueSprite = project.getDefaultScene().getSpriteList().get(5);
while (blueSprite.getNumberOfScripts() > 0) {
blueSprite.removeScript(blueSprite.getScript(0));
}
assertEquals("there shouldn't be any script left", 0, blueSprite.getNumberOfScripts());
assertEquals("there shouldn't be any script left", 0, blueSprite.getNumberOfBricks());
StorageHandler.getInstance().loadProject(project.getName(), getActivity());
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(1400);
byte[] screenArray = StageActivity.stageListener.getPixels(0, 0, ScreenValues.SCREEN_WIDTH, ScreenValues.SCREEN_HEIGHT);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 0, 0);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, -19, -19
);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, -19, 19);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 19, -19);
comparePixelColorArrayWithScreenArrayAtProjectCoordinates(screenArray, BLUE_PIXEL, 19, 19);
solo.sleep(2000);
}
private void clickOnProjectCoordinate(int x, int y) {
solo.clickOnScreen((ScreenValues.SCREEN_WIDTH / 2) + (x * screenScaleFactorX), (ScreenValues.SCREEN_HEIGHT / 2) + (y * screenScaleFactorY));
}
private void createProject() {
ScreenValues.SCREEN_HEIGHT = PROJECT_HEIGHT;
ScreenValues.SCREEN_WIDTH = PROJECT_WIDTH;
Project project = new Project(getActivity(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
// yellow Sprite
Sprite yellowSprite = new SingleSprite("yellowSprite");
StartScript yellowStartScript = new StartScript();
LookData yellowLookData = new LookData();
String yellowImageName = "yellow_image.bmp";
yellowLookData.setLookName(yellowImageName);
yellowSprite.getLookDataList().add(yellowLookData);
yellowStartScript.addBrick(new PlaceAtBrick(-21, 21));
yellowSprite.addScript(yellowStartScript);
WhenScript yellowWhenScript = new WhenScript();
SetTransparencyBrick yellowSetTransparencyBrick = new SetTransparencyBrick(100d);
yellowWhenScript.addBrick(yellowSetTransparencyBrick);
yellowSprite.addScript(yellowWhenScript);
// blue Sprite
Sprite blueSprite = new SingleSprite("blueSprite");
StartScript blueStartScript = new StartScript();
LookData blueLookData = new LookData();
String blueImageName = "blue_image.bmp";
blueLookData.setLookName(blueImageName);
blueSprite.getLookDataList().add(blueLookData);
blueStartScript.addBrick(new PlaceAtBrick(21, 21));
blueSprite.addScript(blueStartScript);
WhenScript blueWhenScript = new WhenScript();
SetSizeToBrick blueSetSizeToBrick = new SetSizeToBrick(200d);
blueWhenScript.addBrick(blueSetSizeToBrick);
blueSprite.addScript(blueWhenScript);
// green Sprite
Sprite greenSprite = new SingleSprite("greenSprite");
StartScript greenStartScript = new StartScript();
LookData greenLookData = new LookData();
String greenImageName = "green_image.bmp";
greenLookData.setLookName(greenImageName);
greenSprite.getLookDataList().add(greenLookData);
greenStartScript.addBrick(new PlaceAtBrick(21, -21));
greenSprite.addScript(greenStartScript);
WhenScript greenWhenScript = new WhenScript();
ComeToFrontBrick greenComeToFrontBrick = new ComeToFrontBrick();
greenWhenScript.addBrick(greenComeToFrontBrick);
greenSprite.addScript(greenWhenScript);
// red Sprite
Sprite redSprite = new SingleSprite("redSprite");
StartScript redStartScript = new StartScript();
LookData redLookData = new LookData();
String redImageName = "red_image.bmp";
redLookData.setLookName(redImageName);
redSprite.getLookDataList().add(redLookData);
redStartScript.addBrick(new PlaceAtBrick(-21, -21));
redSprite.addScript(redStartScript);
WhenScript redWhenScript = new WhenScript();
ComeToFrontBrick redComeToFrontBrick = new ComeToFrontBrick();
SetBrightnessBrick redSetBrightnessBrick = new SetBrightnessBrick(50d);
TurnLeftBrick redTurnLeftBrick = new TurnLeftBrick(45d);
redWhenScript.addBrick(redComeToFrontBrick);
redWhenScript.addBrick(redSetBrightnessBrick);
redWhenScript.addBrick(redTurnLeftBrick);
redSprite.addScript(redWhenScript);
// black Sprite
Sprite blackSprite = new SingleSprite("blackSprite");
StartScript blackStartScript = new StartScript();
LookData blackLookData = new LookData();
String blackImageName = "black_image.bmp";
blackLookData.setLookName(blackImageName);
blackSprite.getLookDataList().add(blackLookData);
blackStartScript.addBrick(new PlaceAtBrick(-50, 50));
blackSprite.addScript(blackStartScript);
WhenScript blackWhenScript = new WhenScript();
ComeToFrontBrick blackComeToFrontBrick = new ComeToFrontBrick();
SetBrightnessBrick blackSetBrightnessBrick = new SetBrightnessBrick(150d);
blackWhenScript.addBrick(blackComeToFrontBrick);
blackWhenScript.addBrick(blackSetBrightnessBrick);
blackSprite.addScript(blackWhenScript);
project.getDefaultScene().addSprite(blackSprite);
project.getDefaultScene().addSprite(yellowSprite);
project.getDefaultScene().addSprite(redSprite);
project.getDefaultScene().addSprite(greenSprite);
project.getDefaultScene().addSprite(blueSprite);
StorageHandler.getInstance().saveProject(project);
File yellowImageFile = UiTestUtils.saveFileToProject(project.getName(), project.getDefaultScene().getName(), yellowImageName,
org.catrobat.catroid.test.R.raw.yellow_image, getInstrumentation().getContext(),
UiTestUtils.FileTypes.IMAGE);
File greenImageFile = UiTestUtils.saveFileToProject(project.getName(), project.getDefaultScene().getName(), greenImageName,
org.catrobat.catroid.test.R.raw.green_image, getInstrumentation().getContext(),
UiTestUtils.FileTypes.IMAGE);
File blueImageFile = UiTestUtils.saveFileToProject(project.getName(), project.getDefaultScene().getName(), blueImageName,
org.catrobat.catroid.test.R.raw.blue_image, getInstrumentation().getContext(),
UiTestUtils.FileTypes.IMAGE);
File redImageFile = UiTestUtils.saveFileToProject(project.getName(), project.getDefaultScene().getName(), redImageName,
org.catrobat.catroid.test.R.raw.red_image, getInstrumentation().getContext(),
UiTestUtils.FileTypes.IMAGE);
File blackImageFile = UiTestUtils.saveFileToProject(project.getName(), project.getDefaultScene().getName(), blackImageName,
org.catrobat.catroid.test.R.raw.black_image, getInstrumentation().getContext(),
UiTestUtils.FileTypes.IMAGE);
yellowLookData.setLookFilename(yellowImageFile.getName());
greenLookData.setLookFilename(greenImageFile.getName());
blueLookData.setLookFilename(blueImageFile.getName());
redLookData.setLookFilename(redImageFile.getName());
blackLookData.setLookFilename(blackImageFile.getName());
StorageHandler.getInstance().saveProject(project);
ProjectManager.getInstance().setProject(project);
UtilUi.updateScreenWidthAndHeight(getActivity());
}
private void comparePixelColorArrayWithScreenArrayAtProjectCoordinates(byte[] screenArray, byte[] pixelArray, int x, int y) {
comparePixelColorArrayWithScreenArrayAtProjectCoordinatesWithTolerance(screenArray, pixelArray, x, y, 10);
}
private void comparePixelColorArrayWithScreenArrayAtProjectCoordinatesWithTolerance(byte[] screenArray, byte[] pixelArray, int x,
int y, int tolerance) {
assertEquals("Length of pixel array not 4", 4, pixelArray.length);
int convertedX = (int) Math.ceil((x * screenScaleFactorX) + (ScreenValues.SCREEN_WIDTH / 2));
int convertedY = (int) Math.ceil((y * screenScaleFactorY) + (ScreenValues.SCREEN_HEIGHT / 2));
byte[] screenPixel = new byte[4];
for (int i = 0; i < 4; i++) {
screenPixel[i] = screenArray[((convertedX * 3) + convertedX + (convertedY * ScreenValues.SCREEN_WIDTH * 4)) + i];
}
assertEquals("Pixels don't have same content. x:" + x + "->" + convertedX + " y:" + y + "->" + convertedY, pixelArray[0] & 0xFF, screenPixel[0] & 0xFF, tolerance);
assertEquals("Pixels don't have same content. x:" + x + "->" + convertedX + " y:" + y + "->" + convertedY, pixelArray[1] & 0xFF, screenPixel[1] & 0xFF, tolerance);
assertEquals("Pixels don't have same content. x:" + x + "->" + convertedX + " y:" + y + "->" + convertedY, pixelArray[2] & 0xFF, screenPixel[2] & 0xFF, tolerance);
assertEquals("Pixels don't have same content. x:" + x + "->" + convertedX + " y:" + y + "->" + convertedY, pixelArray[3] & 0xFF, screenPixel[3] & 0xFF, tolerance);
}
}