/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Joshua Galecki
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.test.robots;
import static robocode.util.Utils.normalRelativeAngle;
import org.junit.Test;
import robocode.control.events.RoundStartedEvent;
import robocode.control.events.TurnEndedEvent;
import robocode.control.snapshot.IRobotSnapshot;
import net.sf.robocode.test.helpers.Assert;
import net.sf.robocode.test.helpers.RobocodeTestBed;
/**
* @author Joshua Galecki (original)
*/
public class TestRateControl extends RobocodeTestBed {
int turnNumber;
double originalHeading;
double originalX;
double originalGunHeading;
double originalRadarHeading;
@Test
public void run() {
super.run();
}
@Override
public String getRobotNames() {
return "tested.robots.RateControl,sample.Target";
}
@Override
public String getInitialPositions() {
return "(320,220,0), (50,50,0)"; // Make sure the robot doesn't start too near to a wall
}
@Override
public void onRoundStarted(final RoundStartedEvent event) {
super.onRoundStarted(event);
IRobotSnapshot rate = event.getStartSnapshot().getRobots()[0];
originalHeading = rate.getBodyHeading();
originalX = rate.getX();
}
@Override
public void onTurnEnded(TurnEndedEvent event) {
super.onTurnEnded(event);
turnNumber = event.getTurnSnapshot().getTurn();
IRobotSnapshot rate = event.getTurnSnapshot().getRobots()[0];
// Test turnRate
if (turnNumber == 10) {
Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading));
}
if (turnNumber == 20) {
Assert.assertNear(-Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading));
}
if (turnNumber == 25) {
// Test that turnRate was set to zero
Assert.assertNear(-Math.PI / 4, normalRelativeAngle(rate.getBodyHeading() - originalHeading));
// Test velocityRate
double theta = rate.getBodyHeading();
double deltaX = rate.getX() - originalX;
double distanceTravelled = deltaX / Math.sin(theta);
Assert.assertNear(9, distanceTravelled);
}
if (turnNumber == 35) {
double theta = rate.getBodyHeading();
double deltaX = rate.getX() - originalX;
double distanceTravelled = deltaX / Math.sin(theta);
Assert.assertNear(-35, distanceTravelled);
originalGunHeading = rate.getGunHeading();
}
if (turnNumber == 45) {
// Test that velocityRate was set to zero
double theta = rate.getBodyHeading();
double deltaX = rate.getX() - originalX;
double distanceTravelled = deltaX / Math.sin(theta);
Assert.assertNear(-47, distanceTravelled);
// test gunRotationRate
Assert.assertNear(Math.PI / 2, normalRelativeAngle(rate.getGunHeading() - originalGunHeading));
}
if (turnNumber == 55) {
Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getGunHeading() - originalGunHeading));
originalRadarHeading = rate.getRadarHeading();
}
if (turnNumber == 65) {
// test that gunRotationRate was set to zero
Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getGunHeading() - originalGunHeading));
// test radarRotationRate
Assert.assertNear(Math.PI / 2, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading));
}
if (turnNumber == 75) {
Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading));
}
if (turnNumber == 76) {
// test that radarRotationRate was set to zero
Assert.assertNear(Math.PI / 4, normalRelativeAngle(rate.getRadarHeading() - originalRadarHeading));
}
}
}