package com.indignado.logicbricks.systems.sensors;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.indignado.logicbricks.components.BlackBoardComponent;
import com.indignado.logicbricks.components.IdentityComponent;
import com.indignado.logicbricks.components.RigidBodiesComponents;
import com.indignado.logicbricks.core.CategoryBitsManager;
import com.indignado.logicbricks.core.controllers.ConditionalController;
import com.indignado.logicbricks.core.data.Axis2D;
import com.indignado.logicbricks.core.data.LogicBrick;
import com.indignado.logicbricks.core.data.Property;
import com.indignado.logicbricks.core.sensors.RaySensor;
import com.indignado.logicbricks.systems.sensors.base.ActuatorTest;
import com.indignado.logicbricks.systems.sensors.base.BaseSensorSystemTest;
import com.indignado.logicbricks.utils.Log;
import com.indignado.logicbricks.utils.builders.controllers.ConditionalControllerBuilder;
import com.indignado.logicbricks.utils.builders.sensors.RaySensorBuilder;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author Rubentxu
*/
public class RaySensorSystemTest extends BaseSensorSystemTest<RaySensor, RaySensorSystem> {
RaySensor sensor;
IdentityComponent identityPlayer;
IdentityComponent identityGround;
private Body bodyPlayer;
private Body bodyGround;
@Override
public void tearDown() {
player = null;
sensor = null;
identityPlayer = null;
identityGround = null;
}
@Override
protected void createContext() {
// Create Player Entity
CategoryBitsManager categoryBitsManager = new CategoryBitsManager();
entityBuilder.initialize();
identityPlayer = entityBuilder.getComponent(IdentityComponent.class);
identityPlayer.tag = "Player";
identityPlayer.category = categoryBitsManager.getCategoryBits(identityPlayer.tag);
bodyPlayer = bodyBuilder
.fixture(bodyBuilder.fixtureDefBuilder()
.boxShape(1, 1)
.restitution(0f))
.position(0, 8)
.mass(1f)
.type(BodyDef.BodyType.DynamicBody)
.build();
RigidBodiesComponents rigidByPlayer = entityBuilder.getComponent(RigidBodiesComponents.class);
rigidByPlayer.rigidBodies.add(bodyPlayer);
sensor =builders.getBrickBuilder(RaySensorBuilder.class)
.setAxis(Axis2D.Ynegative)
.setRange(4.0F)
.setName("sensorPlayer")
.getBrick();
ConditionalController controllerGround =builders.getBrickBuilder(ConditionalControllerBuilder.class)
.setOp(ConditionalController.Op.OP_AND)
.getBrick();
ActuatorTest actuatorTest = new ActuatorTest();
player = entityBuilder
.addController(controllerGround, "Default")
.connectToSensor(sensor)
.connectToActuator(actuatorTest)
.getEntity();
// Create Ground Entity
entityBuilder.initialize();
identityGround = entityBuilder.getComponent(IdentityComponent.class);
identityGround.tag = "Ground";
identityGround.category = categoryBitsManager.getCategoryBits(identityGround.tag);
BlackBoardComponent blackBoardGround = entityBuilder.getComponent(BlackBoardComponent.class);
blackBoardGround.addProperty(new Property("GroundProperty", "Value"));
bodyGround = bodyBuilder
.fixture(bodyBuilder.fixtureDefBuilder()
.boxShape(3, 1)
.restitution(0f))
.position(0, 0)
.mass(1f)
.type(BodyDef.BodyType.StaticBody)
.build();
RigidBodiesComponents rigidByGround = entityBuilder.getComponent(RigidBodiesComponents.class);
rigidByGround.rigidBodies.add(bodyGround);
Entity ground = entityBuilder.getEntity();
engine.addEntity(ground);
}
@Test
public void rayAxisYnegativeTest() {
identityPlayer.collisionMask = (short) identityGround.category;
engine.addEntity(player);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "A) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "B) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "C) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "D) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "E) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
}
@Test
public void radarAxisYnegativeTargetTagTest() {
identityPlayer.collisionMask = (short) identityGround.category;
sensor.targetTag = "Ground";
engine.addEntity(player);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "A) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "B) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "C) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "D) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "E) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
}
@Test
public void radarAxisYnegativeTargetTagInvalidTest() {
identityPlayer.collisionMask = (short) identityGround.category;
sensor.targetTag = "test";
engine.addEntity(player);
engine.update(1);
Log.debug("RadarSensorSystemTest", "A) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, -1.5F));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "B) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, -1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "C) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "D) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "E) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
}
@Test
public void radarAxisYnegativeTargetPropertyTest() {
identityPlayer.collisionMask = (short) identityGround.category;
sensor.targetPropertyName = "GroundProperty";
engine.addEntity(player);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "A) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "B) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "C) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "D) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertTrue(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 80f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "E) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState);
}
@Test
public void radarAxisYnegativeTargetPropertyInvalidTest() {
identityPlayer.collisionMask = (short) identityGround.category;
sensor.targetPropertyName = "test";
engine.addEntity(player);
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "A) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, -1.5F));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "B) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, -1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "C) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "D) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
bodyPlayer.setLinearVelocity(new Vector2(0, 1.5f));
game.singleStep(1);
Log.debug("RadarSensorSystemTest", "E) Player position %s Ground position %s", bodyPlayer.getPosition(), bodyGround.getPosition());
assertFalse(sensor.positive);
assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState);
}
}