Moved mock.model and mock.dataInput tests into the racevisionGame.tests.mock package.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package mock.dataInput;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.xml.sax.SAXException;
|
||||
import seng302.Model.Boat;
|
||||
import seng302.Model.Mark;
|
||||
import seng302.Model.Polars;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
//import static org.testng.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by cbt24 on 10/05/17.
|
||||
*/
|
||||
public class BoatXMLReaderTest {
|
||||
BoatDataSource boatData;
|
||||
List<Boat> boats;
|
||||
List<Mark> marks;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
try {
|
||||
boatData = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
boats = new ArrayList<>(boatData.getBoats().values());
|
||||
marks = new ArrayList<>(boatData.getMarkerBoats().values());
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void boatsReadNameFromFile() {
|
||||
String[] names = {
|
||||
"Team ORACLE USA","Land Rover BAR","SoftBank Team Japan","Groupama Team France","Artemis Racing","Emirates Team New Zealand"
|
||||
};
|
||||
for(int i = 0; i < boats.size(); i++) {
|
||||
assertEquals(names[i], boats.get(i).getName());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void marksReadNameFromFile() {
|
||||
String[] names = {
|
||||
"PRO","PIN","Marker1","WGL","WGR","LGL","LGR","FL","FR"
|
||||
};
|
||||
for(int i = 0; i < marks.size(); i++) {
|
||||
assertEquals(names[i], marks.get(i).getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package mock.dataInput;
|
||||
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import seng302.Exceptions.InvalidPolarFileException;
|
||||
import seng302.Model.Polars;
|
||||
|
||||
import static org.testng.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Created by f123 on 10-May-17.
|
||||
*/
|
||||
public class PolarParserTest {
|
||||
|
||||
@Test
|
||||
/*
|
||||
Tests if we can parse a polar data file (stored in a string), and create a polar table.
|
||||
*/
|
||||
public void testParse() throws Exception {
|
||||
|
||||
try {
|
||||
//Parse data file.
|
||||
Polars polars = PolarParser.parse("polars/acc_polars.csv");
|
||||
|
||||
//If the parse function didn't through, it worked.
|
||||
assertTrue(true);
|
||||
}
|
||||
catch (InvalidPolarFileException e) {
|
||||
assertTrue(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package mock.model;
|
||||
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 22/03/17.
|
||||
*/
|
||||
public class BoatTest {
|
||||
|
||||
|
||||
private GPSCoordinate ORIGIN_COORDS;
|
||||
private Boat TEST_BOAT;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
ORIGIN_COORDS = new GPSCoordinate(0, 0);
|
||||
TEST_BOAT = new Boat(1, "Test", "tt", new Polars());
|
||||
TEST_BOAT.setCurrentPosition(ORIGIN_COORDS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDueNorthAzimuthReturns0() {
|
||||
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(50, 0)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(GPSCoordinate.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()).degrees(), 0, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDueSouthAzimuthReturns180() {
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(-50, 0)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(GPSCoordinate.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()).degrees(), -180, 1e-8);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void calculateDueEastAzimuthReturns90() {
|
||||
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(0, 50)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(GPSCoordinate.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()).degrees(), 90, 1e-8);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void calculateDueWestAzimuthReturnsNegative90() {
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(0, -50)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(GPSCoordinate.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()).degrees(), -90, 1e-8);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDueNorthHeadingReturns0() {
|
||||
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(50, 0)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(TEST_BOAT.calculateBearingToNextMarker().degrees(), 0, 1e-8);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void calculateDueEastHeadingReturns90() {
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(0, 50)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(TEST_BOAT.calculateBearingToNextMarker().degrees(), 90, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDueSouthHeadingReturns180() {
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(-50, 0)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(TEST_BOAT.calculateBearingToNextMarker().degrees(), 180, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDueWestHeadingReturns270() {
|
||||
CompoundMark startMarker = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORDS));
|
||||
CompoundMark endMarker = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(0, -50)));
|
||||
Leg start = new Leg("Start", startMarker, endMarker, 0);
|
||||
TEST_BOAT.setCurrentLeg(start);
|
||||
assertEquals(TEST_BOAT.calculateBearingToNextMarker().degrees(), 270, 1e-8);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package mock.model;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
//import static org.testng.AssertJUnit.assertEquals;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 29/03/17.
|
||||
*/
|
||||
public class CompoundMarkTest {
|
||||
|
||||
GPSCoordinate ORIGIN_COORD = new GPSCoordinate(0, 0);
|
||||
|
||||
@Test
|
||||
public void averageOfSingleMarkAtOriginIsSingleMark() {
|
||||
|
||||
CompoundMark testMark = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORD));
|
||||
assertTrue(testMark.getAverageGPSCoordinate().equals(ORIGIN_COORD));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void averageOfSingleMarkIsSingleMark() {
|
||||
|
||||
GPSCoordinate testCoord = new GPSCoordinate(20, 25);
|
||||
CompoundMark testMark = new CompoundMark(new Mark(1, "test origin 1", testCoord));
|
||||
assertTrue(testMark.getAverageGPSCoordinate().equals(testCoord));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void averageLatOfTwoMarksIsAccurate() {
|
||||
|
||||
GPSCoordinate testCoord = new GPSCoordinate(0.001, 0);
|
||||
CompoundMark testMark = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORD), new Mark(2, "test origin 2", testCoord));
|
||||
assertEquals(testMark.getAverageGPSCoordinate(), new GPSCoordinate(0.0005, 0));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void averageLongOfTwoMarksIsAccurate() {
|
||||
|
||||
GPSCoordinate testCoord = new GPSCoordinate(0, 10);
|
||||
CompoundMark testMark = new CompoundMark(new Mark(1, "test origin 1", ORIGIN_COORD), new Mark(2, "test origin 2", testCoord));
|
||||
assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(0, 5)));
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void averageLatAndLongOfTwoMarksIsAccurate() {
|
||||
|
||||
GPSCoordinate testCoord1 = new GPSCoordinate(0.0, 30);
|
||||
GPSCoordinate testCoord2 = new GPSCoordinate(0.001, 60);
|
||||
|
||||
CompoundMark testMark = new CompoundMark(new Mark(1, "test origin 1", testCoord1), new Mark(2, "test origin 2", testCoord2));
|
||||
|
||||
assertEquals(testMark.getAverageGPSCoordinate().getLatitude(), 0.00051776, 1e-8);
|
||||
assertEquals(testMark.getAverageGPSCoordinate().getLongitude(), 45.000000, 1e-8);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
package mock.model;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static junit.framework.TestCase.assertFalse;
|
||||
import static junit.framework.TestCase.assertTrue;
|
||||
|
||||
/**
|
||||
* Created by jjg64 on 11/05/17.
|
||||
*/
|
||||
public class GPSCoordinateTest {
|
||||
List<GPSCoordinate> boundary;
|
||||
|
||||
@Before
|
||||
public void init() {
|
||||
boundary = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* -------
|
||||
* | |
|
||||
* | * |
|
||||
* -------
|
||||
*/
|
||||
@Test
|
||||
public void insideSquareTest() {
|
||||
boundary.add(new GPSCoordinate(0, 0));
|
||||
boundary.add(new GPSCoordinate(10, 0));
|
||||
boundary.add(new GPSCoordinate(10, 10));
|
||||
boundary.add(new GPSCoordinate(0, 10));
|
||||
|
||||
GPSCoordinate coordinate = new GPSCoordinate(2, 8);
|
||||
boolean inside = GPSCoordinate.isInsideBoundary(coordinate, boundary);
|
||||
assertTrue(inside);
|
||||
}
|
||||
|
||||
/**
|
||||
* -------
|
||||
* | |
|
||||
* * | |
|
||||
* -------
|
||||
*/
|
||||
@Test
|
||||
public void outsideSquareTest() {
|
||||
boundary.add(new GPSCoordinate(0, 0));
|
||||
boundary.add(new GPSCoordinate(10, 0));
|
||||
boundary.add(new GPSCoordinate(10, 10));
|
||||
boundary.add(new GPSCoordinate(0, 10));
|
||||
|
||||
GPSCoordinate coordinate = new GPSCoordinate(-2, 8);
|
||||
boolean inside = GPSCoordinate.isInsideBoundary(coordinate, boundary);
|
||||
assertFalse(inside);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insideShapeWithObtuseAnglesTest() {
|
||||
boundary.add(new GPSCoordinate(0, 0));
|
||||
boundary.add(new GPSCoordinate(4, 4));
|
||||
boundary.add(new GPSCoordinate(7, 2));
|
||||
boundary.add(new GPSCoordinate(9, 5));
|
||||
boundary.add(new GPSCoordinate(10, 10));
|
||||
boundary.add(new GPSCoordinate(6, 6));
|
||||
boundary.add(new GPSCoordinate(2, 10));
|
||||
|
||||
GPSCoordinate coordinate = new GPSCoordinate(5, 5);
|
||||
boolean inside = GPSCoordinate.isInsideBoundary(coordinate, boundary);
|
||||
assertTrue(inside);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outsideShapeWithObtuseAnglesTest() {
|
||||
boundary.add(new GPSCoordinate(0, 0));
|
||||
boundary.add(new GPSCoordinate(4, 4));
|
||||
boundary.add(new GPSCoordinate(7, 2));
|
||||
boundary.add(new GPSCoordinate(9, 5));
|
||||
boundary.add(new GPSCoordinate(10, 10));
|
||||
boundary.add(new GPSCoordinate(6, 6));
|
||||
boundary.add(new GPSCoordinate(2, 10));
|
||||
|
||||
GPSCoordinate coordinate = new GPSCoordinate(4, 3);
|
||||
boolean inside = GPSCoordinate.isInsideBoundary(coordinate, boundary);
|
||||
assertFalse(inside);
|
||||
}
|
||||
|
||||
/**
|
||||
* -------
|
||||
* | |
|
||||
* * | |
|
||||
* -------
|
||||
*/
|
||||
@Test
|
||||
public void earlyTerminationTest() {
|
||||
boundary.add(new GPSCoordinate(0, 0));
|
||||
boundary.add(new GPSCoordinate(10, 0));
|
||||
boundary.add(new GPSCoordinate(10, 10));
|
||||
boundary.add(new GPSCoordinate(0, 10));
|
||||
|
||||
GPSCoordinate coordinate = new GPSCoordinate(-2, 8);
|
||||
boolean inside = GPSCoordinate.isInsideBoundary(coordinate, boundary, new GPSCoordinate(0, 0), new GPSCoordinate(10, 10));
|
||||
assertFalse(inside);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package mock.model;
|
||||
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
import org.junit.Test;
|
||||
import seng302.Constants;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 22/03/17.
|
||||
*/
|
||||
public class LegTest {
|
||||
|
||||
private CompoundMark ORIGIN_COMPOUND_MARKER = new CompoundMark(new Mark(1, "test mark1", new GPSCoordinate(0, 0)));
|
||||
|
||||
@Test
|
||||
public void calculateDistanceHandles5nmNorth() {
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(0, 0);
|
||||
calc.setDirection(0, 5 * Constants.NMToMetersConversion);
|
||||
|
||||
CompoundMark endMarker = getEndMarker(calc.getDestinationGeographicPoint());
|
||||
Leg test = new Leg("Test", ORIGIN_COMPOUND_MARKER, endMarker, 0);
|
||||
assertEquals(test.getDistanceNauticalMiles(), 5, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDistanceHandles12nmEast() {
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(0, 0);
|
||||
calc.setDirection(90, 12 * Constants.NMToMetersConversion);
|
||||
|
||||
CompoundMark endMarker = getEndMarker(calc.getDestinationGeographicPoint());
|
||||
Leg test = new Leg("Test", ORIGIN_COMPOUND_MARKER, endMarker, 0);
|
||||
assertEquals(test.getDistanceNauticalMiles(), 12, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDistanceHandlesHalfnmSouth() {
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(0, 0);
|
||||
calc.setDirection(180, 0.5 * Constants.NMToMetersConversion);
|
||||
|
||||
CompoundMark endMarker = getEndMarker(calc.getDestinationGeographicPoint());
|
||||
Leg test = new Leg("Test", ORIGIN_COMPOUND_MARKER, endMarker, 0);
|
||||
assertEquals(test.getDistanceNauticalMiles(), 0.5, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDistanceHandlesPoint1nmWest() {
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(0, 0);
|
||||
calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion);
|
||||
|
||||
CompoundMark endMarker = getEndMarker(calc.getDestinationGeographicPoint());
|
||||
Leg test = new Leg("Test", ORIGIN_COMPOUND_MARKER, endMarker, 0);
|
||||
assertEquals(test.getDistanceNauticalMiles(), 0.1, 1e-8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void calculateDistanceHandlesZeroDifference() {
|
||||
|
||||
Leg test = new Leg("Test", ORIGIN_COMPOUND_MARKER, ORIGIN_COMPOUND_MARKER, 0);
|
||||
assertEquals(test.getDistanceNauticalMiles(), 0, 1e-8);
|
||||
}
|
||||
|
||||
private CompoundMark getEndMarker(Point2D point) {
|
||||
|
||||
GPSCoordinate coords = new GPSCoordinate(point.getY(), point.getX());
|
||||
|
||||
return new CompoundMark(new Mark(3, "test mark3", coords));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
package mock.model;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import seng302.DataInput.PolarParser;
|
||||
import seng302.Exceptions.InvalidPolarFileException;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Created by f123 on 10-May-17.
|
||||
*/
|
||||
public class PolarsTest {
|
||||
|
||||
private Polars polars = null;
|
||||
private double angleEpsilon = 2;
|
||||
private double speedEpsilon = 0.5;
|
||||
|
||||
|
||||
/**
|
||||
* Creates the Polars object for the tests.
|
||||
*/
|
||||
@Before
|
||||
public void setUp() {
|
||||
//Read data.
|
||||
try {
|
||||
//Parse data file.
|
||||
polars = PolarParser.parse("polars/acc_polars.csv");
|
||||
}
|
||||
catch (InvalidPolarFileException e) {
|
||||
assertTrue(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG1() {
|
||||
|
||||
//Test 1.
|
||||
//This test has a wind speed that is between two values from the table (12kn, 16kn, this is 15.9kn).
|
||||
Bearing windAngle1 = Bearing.fromDegrees(31.5);
|
||||
Bearing destAngle1 = Bearing.fromDegrees(65.32);
|
||||
double windSpeed1 = 15.9;//knots
|
||||
Bearing vmgAngle1 = Bearing.fromDegrees(72.4);
|
||||
double vmgSpeed1 = 30.4;
|
||||
|
||||
VMG calcVMG1 = polars.calculateVMG(windAngle1, windSpeed1, destAngle1, Bearing.fromDegrees(0), Bearing.fromDegrees(359.9));
|
||||
Bearing calcVMGAngle1 = calcVMG1.getBearing();
|
||||
double calcVMGSpeed1 = calcVMG1.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle1.degrees(), vmgAngle1.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed1, vmgSpeed1, speedEpsilon);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG2() {
|
||||
//Test 2.
|
||||
//This test has a wind speed much larger than any in the table (max from table is 30kn, this is 40kn).
|
||||
Bearing windAngle2 = Bearing.fromDegrees(200);
|
||||
Bearing destAngle2 = Bearing.fromDegrees(35);
|
||||
double windSpeed2 = 40;//knots
|
||||
Bearing vmgAngle2 = Bearing.fromDegrees(69);
|
||||
double vmgSpeed2 = 32.8;
|
||||
|
||||
VMG calcVMG2 = polars.calculateVMG(windAngle2, windSpeed2, destAngle2, Bearing.fromDegrees(0), Bearing.fromDegrees(359.9));
|
||||
Bearing calcVMGAngle2 = calcVMG2.getBearing();
|
||||
double calcVMGSpeed2 = calcVMG2.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle2.degrees(), vmgAngle2.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed2, vmgSpeed2, speedEpsilon);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG3() {
|
||||
|
||||
//Test 3.
|
||||
//This test has a wind speed lower than any non-zero values from the table (table has 0kn, 4kn, this is 2kn).
|
||||
Bearing windAngle3 = Bearing.fromDegrees(345);
|
||||
Bearing destAngle3 = Bearing.fromDegrees(199);
|
||||
double windSpeed3 = 2;//knots
|
||||
Bearing vmgAngle3 = Bearing.fromDegrees(222);
|
||||
double vmgSpeed3 = 4.4;
|
||||
|
||||
VMG calcVMG3 = polars.calculateVMG(windAngle3, windSpeed3, destAngle3, Bearing.fromDegrees(0), Bearing.fromDegrees(359.9));
|
||||
Bearing calcVMGAngle3 = calcVMG3.getBearing();
|
||||
double calcVMGSpeed3 = calcVMG3.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle3.degrees(), vmgAngle3.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed3, vmgSpeed3, speedEpsilon);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG4() {
|
||||
//Test 4.
|
||||
//This test has a wind speed of 0.
|
||||
Bearing windAngle4 = Bearing.fromDegrees(5);
|
||||
Bearing destAngle4 = Bearing.fromDegrees(100);
|
||||
double windSpeed4 = 0;//knots
|
||||
Bearing vmgAngle4 = Bearing.fromDegrees(100);
|
||||
double vmgSpeed4 = 0;
|
||||
|
||||
VMG calcVMG4 = polars.calculateVMG(windAngle4, windSpeed4, destAngle4, Bearing.fromDegrees(0), Bearing.fromDegrees(359.9));
|
||||
Bearing calcVMGAngle4 = calcVMG4.getBearing();
|
||||
double calcVMGSpeed4 = calcVMG4.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle4.degrees(), vmgAngle4.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed4, vmgSpeed4, speedEpsilon);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG5() {
|
||||
|
||||
//Test 5.
|
||||
//This test has a bearing bound of [55, 70), which only contains a suboptimal VMG.
|
||||
Bearing windAngle5 = Bearing.fromDegrees(5);
|
||||
Bearing destAngle5 = Bearing.fromDegrees(100);
|
||||
double windSpeed5 = 9;//knots
|
||||
Bearing vmgAngle5 = Bearing.fromDegrees(70);
|
||||
double vmgSpeed5 = 15;
|
||||
Bearing bearingUpperBound5 = Bearing.fromDegrees(70);
|
||||
Bearing bearingLowerBound5 = Bearing.fromDegrees(55);
|
||||
|
||||
VMG calcVMG5 = polars.calculateVMG(windAngle5, windSpeed5, destAngle5, bearingLowerBound5, bearingUpperBound5);
|
||||
Bearing calcVMGAngle5 = calcVMG5.getBearing();
|
||||
double calcVMGSpeed5 = calcVMG5.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle5.degrees(), vmgAngle5.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed5, vmgSpeed5, speedEpsilon);
|
||||
assertTrue(calcVMGAngle5.degrees() >= bearingLowerBound5.degrees());
|
||||
assertTrue(calcVMGAngle5.degrees() <= bearingUpperBound5.degrees());
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG6() {
|
||||
|
||||
//Test 6.
|
||||
//This test has a bearing bound of [70, 55), which has a lower bound > upper bound, which is complementary to [55, 70).
|
||||
Bearing windAngle6 = Bearing.fromDegrees(5);
|
||||
Bearing destAngle6 = Bearing.fromDegrees(100);
|
||||
double windSpeed6 = 11;//knots
|
||||
Bearing vmgAngle6 = Bearing.fromDegrees(92.85);
|
||||
double vmgSpeed6 = 20.086;
|
||||
Bearing bearingUpperBound6 = Bearing.fromDegrees(55);
|
||||
Bearing bearingLowerBound6 = Bearing.fromDegrees(70);
|
||||
|
||||
VMG calcVMG6 = polars.calculateVMG(windAngle6, windSpeed6, destAngle6, bearingLowerBound6, bearingUpperBound6);
|
||||
Bearing calcVMGAngle6 = calcVMG6.getBearing();
|
||||
double calcVMGSpeed6 = calcVMG6.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle6.degrees(), vmgAngle6.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed6, vmgSpeed6, speedEpsilon);
|
||||
if (bearingLowerBound6.degrees() > bearingUpperBound6.degrees()) {
|
||||
assertTrue((calcVMGAngle6.degrees() >= bearingLowerBound6.degrees()) || (calcVMGAngle6.degrees() <= bearingUpperBound6.degrees()));
|
||||
} else {
|
||||
assertTrue(calcVMGAngle6.degrees() >= bearingLowerBound6.degrees());
|
||||
assertTrue(calcVMGAngle6.degrees() <= bearingUpperBound6.degrees());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG7() {
|
||||
|
||||
|
||||
//Test 7.
|
||||
//This test has a bearing bound of [340, 5), which has a lower bound > upper bound, which is complementary to [5, 340).
|
||||
Bearing windAngle7 = Bearing.fromDegrees(340);
|
||||
Bearing destAngle7 = Bearing.fromDegrees(30);
|
||||
double windSpeed7 = 7;//knots
|
||||
Bearing vmgAngle7 = Bearing.fromDegrees(5);
|
||||
double vmgSpeed7 = 11;
|
||||
Bearing bearingUpperBound7 = Bearing.fromDegrees(5);
|
||||
Bearing bearingLowerBound7 = Bearing.fromDegrees(340);
|
||||
|
||||
VMG calcVMG7 = polars.calculateVMG(windAngle7, windSpeed7, destAngle7, bearingLowerBound7, bearingUpperBound7);
|
||||
Bearing calcVMGAngle7 = calcVMG7.getBearing();
|
||||
double calcVMGSpeed7 = calcVMG7.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle7.degrees(), vmgAngle7.degrees(), angleEpsilon);
|
||||
assertEquals(calcVMGSpeed7, vmgSpeed7, speedEpsilon);
|
||||
if (bearingLowerBound7.degrees() > bearingUpperBound7.degrees()) {
|
||||
assertTrue((calcVMGAngle7.degrees() >= bearingLowerBound7.degrees()) || (calcVMGAngle7.degrees() <= bearingUpperBound7.degrees()));
|
||||
|
||||
} else {
|
||||
assertTrue(calcVMGAngle7.degrees() >= bearingLowerBound7.degrees());
|
||||
assertTrue(calcVMGAngle7.degrees() <= bearingUpperBound7.degrees());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests if we can calculate VMG for a variety of values.
|
||||
*/
|
||||
@Test
|
||||
public void testVMG8() {
|
||||
//Test 8.
|
||||
//This test has a bearing bound of [340, 5), which has a lower bound > upper bound, which is complementary to [5, 340). Due to the wind, dest angles, and bearing bounds, it cannot actually find a VMG > 0 (valid VMGs will actually be in the angle interval [10, 190]), so it will return the VMG(angle=0, speed=0).
|
||||
Bearing windAngle8 = Bearing.fromDegrees(5);
|
||||
Bearing destAngle8 = Bearing.fromDegrees(100);
|
||||
double windSpeed8 = 7;//knots
|
||||
Bearing vmgAngle8 = Bearing.fromDegrees(0);
|
||||
double vmgSpeed8 = 0;
|
||||
Bearing bearingUpperBound8 = Bearing.fromDegrees(5);
|
||||
Bearing bearingLowerBound8 = Bearing.fromDegrees(340);
|
||||
|
||||
VMG calcVMG8 = polars.calculateVMG(windAngle8, windSpeed8, destAngle8, bearingLowerBound8, bearingUpperBound8);
|
||||
Bearing calcVMGAngle8 = calcVMG8.getBearing();
|
||||
double calcVMGSpeed8 = calcVMG8.getSpeed();
|
||||
|
||||
|
||||
assertEquals(calcVMGAngle8.degrees(), vmgAngle8.degrees(), 0);
|
||||
assertEquals(calcVMGSpeed8, vmgSpeed8, 0);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,314 @@
|
||||
package mock.model;
|
||||
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.xml.sax.SAXException;
|
||||
import seng302.DataInput.BoatDataSource;
|
||||
import seng302.DataInput.BoatXMLReader;
|
||||
import seng302.DataInput.RaceDataSource;
|
||||
import seng302.DataInput.RaceXMLReader;
|
||||
import seng302.Exceptions.StreamedCourseXMLException;
|
||||
import seng302.MockOutput;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.io.IOException;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 15/03/17.
|
||||
*/
|
||||
public class RaceTest{
|
||||
|
||||
|
||||
public static final CompoundMark ORIGIN = new CompoundMark(new Mark(1, "test origin 1", new GPSCoordinate(0, 0)));
|
||||
public static final CompoundMark THREE_NM_FROM_ORIGIN = new CompoundMark(new Mark(2, "test mark 2", new GPSCoordinate(0.050246769, 0)));
|
||||
public static final CompoundMark FIFTEEN_NM_FROM_ORIGIN = new CompoundMark(new Mark(3, "test mark 3", new GPSCoordinate(0.251233845, 0)));
|
||||
public static ArrayList<Leg> TEST_LEGS = new ArrayList<>();
|
||||
public static final int START_LEG_DISTANCE = 3;
|
||||
public static final int MIDDLE_LEG_DISTANCE = 12;
|
||||
public static final Leg START_LEG = new Leg("Start", ORIGIN, THREE_NM_FROM_ORIGIN, 0);
|
||||
public static final Leg MIDDLE_LEG = new Leg("Middle", THREE_NM_FROM_ORIGIN, FIFTEEN_NM_FROM_ORIGIN, 1);
|
||||
public static final Leg FINISH_LEG = new Leg("Finish", FIFTEEN_NM_FROM_ORIGIN, FIFTEEN_NM_FROM_ORIGIN, 2);
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
TEST_LEGS.add(START_LEG);
|
||||
TEST_LEGS.add(MIDDLE_LEG);
|
||||
TEST_LEGS.add(FINISH_LEG);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void countdownTimerSendsBoatLocations() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
testRace.countdownTimer.handle(1);
|
||||
verify(mockOutput, atLeast(boatDataSource.getBoats().size())).parseBoatLocation(anyInt(), anyDouble(), anyDouble(), anyDouble(), anyDouble(), anyLong());
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void countdownTimerSendsRaceStatusMessages() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
testRace.countdownTimer.handle(1);
|
||||
verify(mockOutput, atLeast(1)).parseRaceStatus(any());
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void checkPositionFinishedUpdatesNumberFinishedBoats() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(FINISH_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(1);
|
||||
testRace.checkPosition(testBoat, 1);
|
||||
|
||||
assertEquals(testRace.getNumberOfActiveBoats(), 0);
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void checkPositionSetFinishedBoatVelocityTo0() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(FINISH_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(1);
|
||||
testRace.checkPosition(testBoat, 1);
|
||||
|
||||
assertEquals(testBoat.getCurrentSpeed(), 0, 1e-8);
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void checkPositionSetsFinishTime() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(FINISH_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(1);
|
||||
testRace.checkPosition(testBoat, 1);
|
||||
|
||||
assertEquals(testBoat.getTimeFinished(), 1, 1e-8);
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void checkPositionUnfinishedDoesntUpdateNumberFinishedBoats() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(START_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE);
|
||||
testRace.checkPosition(testBoat, 1);
|
||||
|
||||
assertEquals(testRace.getNumberOfActiveBoats(), 1);
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void distanceTravelledBeforeUpdatingLegIsRetained() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml", new Polars()));
|
||||
Race testRace = new Race(dataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(START_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE + 1);
|
||||
testRace.checkPosition(testBoat, 0);
|
||||
|
||||
assertEquals(testBoat.getDistanceTravelledInLeg(), 1, 1e-7);
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void doNotFinishAnswersYesIf100PercentChance() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
|
||||
testRace.setDnfChance(100);
|
||||
assertTrue(testRace.doNotFinish());
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void doNotFinishAnswersNoIf0PercentChance() {
|
||||
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
testRace.setDnfChance(0);
|
||||
assertFalse(testRace.doNotFinish());
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void boatsAreSetToDNF() {
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
testRace.setDnfChance(100);
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(START_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE + 1);
|
||||
testRace.checkPosition(testBoat, 1);
|
||||
assertEquals(testBoat.getCurrentLeg().getName(), "DNF");
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void updatePositionIgnoresFinishedBoats() {
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(FINISH_LEG);
|
||||
testBoat.setCurrentPosition(ORIGIN.getAverageGPSCoordinate());
|
||||
testRace.updatePosition(testBoat, 1, 1);
|
||||
assertEquals(testBoat.getCurrentPosition(), ORIGIN.getAverageGPSCoordinate());
|
||||
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void updatePositionChangesBoatPosition() {
|
||||
try {
|
||||
MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml", new Polars());
|
||||
RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
Race testRace = new Race(raceDataSource, mockOutput);
|
||||
testRace.initialiseBoats();
|
||||
Boat testBoat = testRace.getBoats().get(0);
|
||||
testBoat.setCurrentLeg(START_LEG);
|
||||
testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE - 1);
|
||||
testBoat.setCurrentPosition(ORIGIN.getAverageGPSCoordinate());
|
||||
testRace.updatePosition(testBoat, 100, 100);
|
||||
assertFalse(testBoat.getCurrentPosition() == ORIGIN.getAverageGPSCoordinate());
|
||||
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void windDirectionCorrectValues(){
|
||||
// try {
|
||||
// MockOutput mockOutput = Mockito.mock(MockOutput.class);
|
||||
// BoatDataSource boatDataSource = new BoatXMLReader("mockXML/boatTest.xml");
|
||||
// RaceDataSource raceDataSource = new RaceXMLReader("mockXML/raceTest.xml", boatDataSource);
|
||||
// Race testRace = new Race(raceDataSource, mockOutput);
|
||||
// testRace.setChangeWind(1);
|
||||
// testRace.setWindDir(65535);
|
||||
// testRace.changeWindDir();
|
||||
// assertEquals(100, testRace.getWind());
|
||||
// } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||
// e.printStackTrace();
|
||||
// fail();
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
|
||||
<BoatConfig>
|
||||
<Boats>
|
||||
|
||||
<!--Mark Boats-->
|
||||
<Boat Type="Mark" BoatName="PRO" SourceID="101" >
|
||||
<GPSposition X= "-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="PIN" SourceID="102" >
|
||||
<GPSposition X= "-64.855242" Y="32.293771" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="Marker1" SourceID="103" >
|
||||
<GPSposition X= "-64.843983" Y="32.293039" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="WGL" SourceID="104" >
|
||||
<GPSposition X= "-64.850045" Y="32.28468" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="WGR" SourceID="105" >
|
||||
<GPSposition X= "-64.847591" Y="32.280164" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="LGL" SourceID="106" >
|
||||
<GPSposition X= "-64.835249" Y="32.309693" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="LGR" SourceID="107" >
|
||||
<GPSposition X= "-64.831785" Y="32.308046" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="FL" SourceID="108" >
|
||||
<GPSposition X= "-64.839291" Y="32.317379" Z="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Mark" BoatName="FR" SourceID="109" >
|
||||
<GPSposition X= "-64.83626" Y="32.317257" Z="0"/>
|
||||
</Boat>
|
||||
|
||||
<!--Participants-->
|
||||
<Boat BoatName="Team ORACLE USA" HullNum="RG01" ShapeID="0" ShortName="USA" SourceID="121" StoweName="USA" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat BoatName="Land Rover BAR" HullNum="RG01" ShapeID="0" ShortName="GBR" SourceID="122" StoweName="GBR" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat BoatName="SoftBank Team Japan" HullNum="RG01" ShapeID="0" ShortName="JPN" SourceID="123" StoweName="JPN" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat BoatName="Groupama Team France" HullNum="RG01" ShapeID="0" ShortName="FRA" SourceID="124" StoweName="FRA" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat BoatName="Artemis Racing" HullNum="RG01" ShapeID="0" ShortName="SWE" SourceID="125" StoweName="SWE" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
<Boat BoatName="Emirates Team New Zealand" HullNum="RG01" ShapeID="0" ShortName="NZL" SourceID="126" StoweName="NZL" Type="Yacht">
|
||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||
</Boat>
|
||||
</Boats>
|
||||
</BoatConfig>
|
||||
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<Race>
|
||||
<RaceID>5326</RaceID>
|
||||
<RaceType>FLEET</RaceType>
|
||||
<CreationTimeDate>2017-04-19T15:30:00+1200</CreationTimeDate>
|
||||
<RaceStartTime Postpone="false" Time="2017-04-19T15:33:00+1200"/>
|
||||
<Participants>
|
||||
<Yacht SourceID="121"/>
|
||||
<Yacht SourceID="122"/>
|
||||
<Yacht SourceID="123"/>
|
||||
<Yacht SourceID="124"/>
|
||||
<Yacht SourceID="125"/>
|
||||
<Yacht SourceID="126"/>
|
||||
</Participants>
|
||||
<CompoundMarkSequence>
|
||||
<Corner CompoundMarkID="1" SeqID="1"/>
|
||||
<Corner CompoundMarkID="2" SeqID="2"/>
|
||||
<Corner CompoundMarkID="4" SeqID="3"/>
|
||||
<Corner CompoundMarkID="3" SeqID="4"/>
|
||||
<Corner CompoundMarkID="4" SeqID="5"/>
|
||||
<Corner CompoundMarkID="5" SeqID="6"/>
|
||||
</CompoundMarkSequence>
|
||||
<Course>
|
||||
<CompoundMark CompoundMarkID="1" Name="Start Line">
|
||||
<Mark SeqId="1" Name="PRO" TargetLat="32.296577" TargetLng="-64.854304" SourceID="101"/>
|
||||
<Mark SeqId="2" Name="PIN" TargetLat="32.293771" TargetLng="-64.855242" SourceID="102"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="2" Name="Marker 1">
|
||||
<Mark Name="Marker1" TargetLat="32.293039" TargetLng="-64.843983" SourceID="103"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="3" Name="Windward Gate">
|
||||
<Mark Name="WGL" SeqId="1" TargetLat="32.28468" TargetLng="-64.850045" SourceID="104"/>
|
||||
<Mark Name="WGR" SeqId="2" TargetLat="32.280164" TargetLng="-64.847591" SourceID="105"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="4" Name="Leeward Gate">
|
||||
<Mark Name="LGL" SeqId="1" TargetLat="32.309693" TargetLng="-64.835249" SourceID="106"/>
|
||||
<Mark Name="LGR" SeqId="2" TargetLat="32.308046" TargetLng="-64.831785" SourceID="107"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="5" Name="Finish Line">
|
||||
<Mark Name="FL" SeqId="1" TargetLat="32.317379" TargetLng="-64.839291" SourceID="108"/>
|
||||
<Mark Name="FR" SeqId="2" TargetLat="32.317257" TargetLng="-64.83626" SourceID="109"/>
|
||||
</CompoundMark>
|
||||
</Course>
|
||||
<CourseLimit>
|
||||
<Limit Lat="32.313922" Lon="-64.837168" SeqID="1"/>
|
||||
<Limit Lat="32.317379" Lon="-64.839291" SeqID="2"/>
|
||||
<Limit Lat="32.317911" Lon="-64.836996" SeqID="3"/>
|
||||
<Limit Lat="32.317257" Lon="-64.83626" SeqID="4"/>
|
||||
<Limit Lat="32.304273" Lon="-64.822834" SeqID="5"/>
|
||||
<Limit Lat="32.279097" Lon="-64.841545" SeqID="6"/>
|
||||
<Limit Lat="32.279604" Lon="-64.849871" SeqID="7"/>
|
||||
<Limit Lat="32.289545" Lon="-64.854162" SeqID="8"/>
|
||||
<Limit Lat="32.290198" Lon="-64.858711" SeqID="9"/>
|
||||
<Limit Lat="32.297164" Lon="-64.856394" SeqID="10"/>
|
||||
<Limit Lat="32.296148" Lon="-64.849184" SeqID="11"/>
|
||||
</CourseLimit>
|
||||
</Race>
|
||||
@@ -0,0 +1,10 @@
|
||||
<RegattaConfig>
|
||||
<RegattaID>3</RegattaID>
|
||||
<RegattaName>New Zealand Test</RegattaName>
|
||||
<CourseName>North Head</CourseName>
|
||||
<CentralLatitude>-36.82791529</CentralLatitude>
|
||||
<CentralLongitude>174.81218919</CentralLongitude>
|
||||
<CentralAltitude>0.00</CentralAltitude>
|
||||
<UtcOffset>12</UtcOffset>
|
||||
<MagneticVariation>14.1</MagneticVariation>
|
||||
</RegattaConfig>
|
||||
@@ -0,0 +1,8 @@
|
||||
Tws,Twa0,Bsp0,Twa1,Bsp1,UpTwa,UpBsp,Twa2,Bsp2,Twa3,Bsp3,Twa4,Bsp4,Twa5,Bsp5,Twa6,Bsp6,DnTwa,DnBsp,Twa7,Bsp7
|
||||
4,0,0,30,4,45,8,60,9,75,10,90,10,115,10,145,10,155,10,175,4
|
||||
8,0,0,30,7,43,10,60,11,75,11,90,11,115,12,145,12,153,12,175,10
|
||||
12,0,0,30,11,43,14.4,60,16,75,20,90,23,115,24,145,23,153,21.6,175,14
|
||||
16,0,0,30,12,42,19.2,60,25,75,27,90,31,115,32,145,30,153,28.8,175,20
|
||||
20,0,0,30,13,41,24,60,29,75,37,90,39,115,40,145,38,153,36,175,24
|
||||
25,0,0,30,15,40,30,60,38,75,44,90,49,115,50,145,49,151,47,175,30
|
||||
30,0,0,30,15,42,30,60,37,75,42,90,48,115,49,145,48,150,46,175,32
|
||||
|
@@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<BoatConfig>
|
||||
<Modified>2017-04-19T15:49:40+1200</Modified>
|
||||
<Version>1</Version>
|
||||
<Settings>
|
||||
<RaceBoatType Type="AC45"/>
|
||||
<BoatDimension BoatLength="14.019" HullLength="13.449"/>
|
||||
<ZoneSize MarkZoneSize="40.347" CourseZoneSize="40.347"/>
|
||||
<ZoneLimits Limit1="200" Limit2="100" Limit3="40.347" Limit4="0" Limit5="-100"/>
|
||||
</Settings>
|
||||
<BoatShapes>
|
||||
<BoatShape ShapeID="0">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-2.659"/>
|
||||
<Vtx Seq="2" Y="18.359" X="-2.659"/>
|
||||
<Vtx Seq="3" Y="18.359" X="2.659"/>
|
||||
<Vtx Seq="4" Y="0" X="2.659"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="1">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.278"/>
|
||||
<Vtx Seq="2" Y="8.876" X="-1.278"/>
|
||||
<Vtx Seq="3" Y="8.876" X="1.278"/>
|
||||
<Vtx Seq="4" Y="0" X="1.278"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="2">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.1"/>
|
||||
<Vtx Seq="2" Y="8.3" X="-1.1"/>
|
||||
<Vtx Seq="3" Y="8.3" X="1.1"/>
|
||||
<Vtx Seq="4" Y="0" X="1.1"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="3">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-0.75"/>
|
||||
<Vtx Seq="2" Y="3" X="-0.75"/>
|
||||
<Vtx Seq="3" Y="3" X="0.75"/>
|
||||
<Vtx Seq="4" Y="0" X="0.75"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="4">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-3.46"/>
|
||||
<Vtx Seq="2" Y="13.449" X="-3.46"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="13.449" X="3.46"/>
|
||||
<Vtx Seq="5" Y="0" X="3.46"/>
|
||||
</Vertices>
|
||||
<Catamaran>
|
||||
<Vtx Seq="1" Y="1.769" X="-2.752"/>
|
||||
<Vtx Seq="2" Y="0" X="-2.813"/>
|
||||
<Vtx Seq="3" Y="0" X="-3.34"/>
|
||||
<Vtx Seq="4" Y="5.351" X="-3.46"/>
|
||||
<Vtx Seq="5" Y="10.544" X="-3.387"/>
|
||||
<Vtx Seq="6" Y="13.449" X="-3.075"/>
|
||||
<Vtx Seq="7" Y="10.851" X="-2.793"/>
|
||||
<Vtx Seq="8" Y="6.669" X="-2.699"/>
|
||||
<Vtx Seq="9" Y="6.669" X="2.699"/>
|
||||
<Vtx Seq="10" Y="10.851" X="2.793"/>
|
||||
<Vtx Seq="11" Y="13.449" X="3.075"/>
|
||||
<Vtx Seq="12" Y="10.544" X="3.387"/>
|
||||
<Vtx Seq="13" Y="5.351" X="3.46"/>
|
||||
<Vtx Seq="14" Y="0" X="3.34"/>
|
||||
<Vtx Seq="15" Y="0" X="2.813"/>
|
||||
<Vtx Seq="16" Y="1.769" X="2.752"/>
|
||||
</Catamaran>
|
||||
<Bowsprit>
|
||||
<Vtx Seq="1" Y="6.669" X="-0.2"/>
|
||||
<Vtx Seq="2" Y="11.377" X="-0.2"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="11.377" X="0.2"/>
|
||||
<Vtx Seq="5" Y="6.669" X="0.2"/>
|
||||
</Bowsprit>
|
||||
<Trampoline>
|
||||
<Vtx Seq="1" Y="2" X="-2.699"/>
|
||||
<Vtx Seq="2" Y="6.438" X="-2.699"/>
|
||||
<Vtx Seq="3" Y="6.438" X="2.699"/>
|
||||
<Vtx Seq="4" Y="2" X="2.699"/>
|
||||
</Trampoline>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="5"/>
|
||||
</BoatShapes>
|
||||
<Boats>>
|
||||
<Boat Type="Yacht" SourceID="101" ShapeID="4" HullNum="AC4501" ShortName="USA"
|
||||
BoatName="ORACLE TEAM USA" Country="USA">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="102" ShapeID="4" HullNum="AC4502" ShortName="GBR"
|
||||
BoatName="Land Rover BAR" Country="United Kingdom">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="103" ShapeID="4" HullNum="AC4503" ShortName="JPN"
|
||||
BoatName="SoftBank Team Japan" Country="Japan">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="104" ShapeID="4" HullNum="AC4504" ShortName="FRA"
|
||||
BoatName="Groupama Team France" Country="France">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="105" ShapeID="4" HullNum="AC4505" ShortName="SWE"
|
||||
BoatName="Artemis Racing" Country="Sweden">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="106" ShapeID="4" HullNum="AC4506" ShortName="NZL"
|
||||
BoatName="Emirates Team New Zealand" Country="New Zealand">
|
||||
<GPSposition Z="1.738" Y="0.625" X="0.001"/>
|
||||
<MastTop Z="21.496" Y="4.233" X="0.000"/>
|
||||
</Boat>
|
||||
</Boats>
|
||||
</BoatConfig>
|
||||
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Race>
|
||||
<RaceID>17041901</RaceID>
|
||||
<RaceType>Fleet</RaceType>
|
||||
<CreationTimeDate>2017-04-19T15:30:00+1200</CreationTimeDate>
|
||||
<RaceStartTime Time="2019-06-01T13:30:00-0400" Postpone="false"/>
|
||||
<Participants>
|
||||
<Yacht SourceID="001" Entry="Port"/>
|
||||
<Yacht SourceID="002" Entry="Port"/>
|
||||
<Yacht SourceID="003" Entry="Port"/>
|
||||
<Yacht SourceID="004" Entry="Port"/>
|
||||
<Yacht SourceID="005" Entry="Port"/>
|
||||
<Yacht SourceID="006" Entry="Port"/>
|
||||
</Participants>
|
||||
<Course>
|
||||
<CompoundMark CompoundMarkID="1" Name="StartLine">
|
||||
<Mark SeqID="1" Name="PRO" TargetLat="32.296577" TargetLng="-64.854304" SourceID="101"/>
|
||||
<Mark SeqID="2" Name="PIN" TargetLat="32.293771" TargetLng="-64.855242" SourceID="102"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="2" Name="M1">
|
||||
<Mark Name="M1" TargetLat="32.293039" TargetLng="-64.843983" SourceID="103"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="3" Name="WindwardGate">
|
||||
<Mark SeqID="1" Name="G1" TargetLat="32.284680" TargetLng="-64.850045" SourceID="104"/>
|
||||
<Mark SeqID="2" Name="G2" TargetLat="32.280164" TargetLng="-64.847591" SourceID="105"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="4" Name="LeewardGate">
|
||||
<Mark SeqID="1" Name="G1" TargetLat="32.309693" TargetLng="-64.835249" SourceID="106"/>
|
||||
<Mark SeqID="2" Name="G2" TargetLat="32.308046" TargetLng="-64.831785" SourceID="107"/>
|
||||
</CompoundMark>
|
||||
<CompoundMark CompoundMarkID="5" Name="FinishLine">
|
||||
<Mark SeqID="1" Name="PRO" TargetLat="32.317379" TargetLng="-64.839291" SourceID="108"/>
|
||||
<Mark SeqID="2" Name="PIN" TargetLat="32.317257" TargetLng="-64.836260" SourceID="109"/>
|
||||
</CompoundMark>
|
||||
</Course>
|
||||
<CompoundMarkSequence>
|
||||
<Corner SeqID="1" CompoundMarkID="1" Rounding="SP" ZoneSize="3"/>
|
||||
<Corner SeqID="2" CompoundMarkID="2" Rounding="Port" ZoneSize="3"/>
|
||||
<Corner SeqID="3" CompoundMarkID="3" Rounding="Port" ZoneSize="3"/>
|
||||
<Corner SeqID="4" CompoundMarkID="4" Rounding="Port" ZoneSize="3"/>
|
||||
<Corner SeqID="3" CompoundMarkID="3" Rounding="Port" ZoneSize="3"/>
|
||||
<Corner SeqID="5" CompoundMarkID="5" Rounding="SP" ZoneSize="3"/>
|
||||
</CompoundMarkSequence>
|
||||
<CourseLimit>
|
||||
<Limit SeqID="1" Lat="32.313922" Lon="-64.837168"/>
|
||||
<Limit SeqID="2" Lat="32.317379" Lon="-64.839291"/>
|
||||
<Limit SeqID="3" Lat="32.317911" Lon="-64.836996"/>
|
||||
<Limit SeqID="4" Lat="32.317257" Lon="-64.836260"/>
|
||||
<Limit SeqID="5" Lat="32.304273" Lon="-64.822834"/>
|
||||
|
||||
<Limit SeqID="6" Lat="32.279097" Lon="-64.841545"/>
|
||||
<Limit SeqID="7" Lat="32.279604" Lon="-64.849871"/>
|
||||
<Limit SeqID="8" Lat="32.289545" Lon="-64.854162"/>
|
||||
<Limit SeqID="9" Lat="32.290198" Lon="-64.858711"/>
|
||||
<Limit SeqID="10" Lat="32.297164" Lon="-64.856394"/>
|
||||
<Limit SeqID="11" Lat="32.296148" Lon="-64.849184"/>
|
||||
</CourseLimit>
|
||||
</Race>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<RegattaConfig>
|
||||
<RegattaID>1</RegattaID>
|
||||
<RegattaName>Seng302 Mock Test</RegattaName>
|
||||
<CourseName>Bermuda AC35</CourseName>
|
||||
<CentralLatitude>-32.296577</CentralLatitude>
|
||||
<CentralLongitude>64.854304</CentralLongitude>
|
||||
<CentralAltitude>0.00</CentralAltitude>
|
||||
<UtcOffset>-4</UtcOffset>
|
||||
<MagneticVariation>-14.78</MagneticVariation>
|
||||
</RegattaConfig>
|
||||
@@ -0,0 +1,275 @@
|
||||
<race>
|
||||
<raceId>5326</raceId>
|
||||
<boats>
|
||||
<boat>
|
||||
<name>ORACLE TEAM USA</name>
|
||||
<speed>20</speed>
|
||||
<abbr>USA</abbr>
|
||||
<sourceID>121</sourceID>
|
||||
<colour>BLUEVIOLET</colour>
|
||||
</boat>
|
||||
<boat>
|
||||
<name>Land Rover BAR</name>
|
||||
<speed>30</speed>
|
||||
<abbr>GBR</abbr>
|
||||
<sourceID>122</sourceID>
|
||||
<colour>BLACK</colour>
|
||||
</boat>
|
||||
<boat>
|
||||
<name>SoftBank Team Japan</name>
|
||||
<speed>25</speed>
|
||||
<abbr>JPN</abbr>
|
||||
<sourceID>123</sourceID>
|
||||
<colour>RED</colour>
|
||||
</boat>
|
||||
<boat>
|
||||
<name>Groupama Team France</name>
|
||||
<speed>20</speed>
|
||||
<abbr>FRA</abbr>
|
||||
<sourceID>124</sourceID>
|
||||
<colour>ORANGE</colour>
|
||||
</boat>
|
||||
<boat>
|
||||
<name>Artemis Racing</name>
|
||||
<speed>29</speed>
|
||||
<abbr>SWE</abbr>
|
||||
<sourceID>125</sourceID>
|
||||
<colour>DARKOLIVEGREEN</colour>
|
||||
</boat>
|
||||
<boat>
|
||||
<name>Emirates Team New Zealand</name>
|
||||
<speed>62</speed>
|
||||
<abbr>NZL</abbr>
|
||||
<sourceID>126</sourceID>
|
||||
<colour>LIMEGREEN</colour>
|
||||
</boat>
|
||||
</boats>
|
||||
<legs>
|
||||
<leg>
|
||||
<name>Start to Mark 1</name>
|
||||
<start>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.296577</latitude>
|
||||
<longitude>-64.854304</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.293771</latitude>
|
||||
<longitude>-64.855242</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</start>
|
||||
<finish>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.293039</latitude>
|
||||
<longitude>-64.843983</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</finish>
|
||||
</leg>
|
||||
<leg>
|
||||
<name>Mark 1 to Leeward Gate</name>
|
||||
<start>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.293039</latitude>
|
||||
<longitude>-64.843983</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</start>
|
||||
<finish>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.309693</latitude>
|
||||
<longitude>-64.835249</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.308046</latitude>
|
||||
<longitude>-64.831785</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</finish>
|
||||
</leg>
|
||||
<leg>
|
||||
<name>Leeward Gate to Windward Gate</name>
|
||||
<start>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.309693</latitude>
|
||||
<longitude>-64.835249</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.308046</latitude>
|
||||
<longitude>-64.831785</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</start>
|
||||
<finish>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.284680</latitude>
|
||||
<longitude>-64.850045</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.280164</latitude>
|
||||
<longitude>-64.847591</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</finish>
|
||||
</leg>
|
||||
<leg>
|
||||
<name>Windward Gate to Leeward Gate</name>
|
||||
<start>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.284680</latitude>
|
||||
<longitude>-64.850045</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.280164</latitude>
|
||||
<longitude>-64.847591</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</start>
|
||||
<finish>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.309693</latitude>
|
||||
<longitude>-64.835249</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.308046</latitude>
|
||||
<longitude>-64.831785</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</finish>
|
||||
</leg>
|
||||
<leg>
|
||||
<name>Leeward Gate to Finish</name>
|
||||
<start>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.309693</latitude>
|
||||
<longitude>-64.835249</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.308046</latitude>
|
||||
<longitude>-64.831785</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</start>
|
||||
<finish>
|
||||
<compoundMark>
|
||||
<coordinate>
|
||||
<latitude>32.317379</latitude>
|
||||
<longitude>-64.839291</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.317257</latitude>
|
||||
<longitude>-64.836260</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</finish>
|
||||
</leg>
|
||||
</legs>
|
||||
<course>
|
||||
<boundaries>
|
||||
<coordinate>
|
||||
<latitude>32.313922</latitude>
|
||||
<longitude>-64.837168</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.317379</latitude>
|
||||
<longitude>-64.839291</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.317911</latitude>
|
||||
<longitude>-64.836996</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.317257</latitude>
|
||||
<longitude>-64.836260</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.304273</latitude>
|
||||
<longitude>-64.822834</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.279097</latitude>
|
||||
<longitude>-64.841545</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.279604</latitude>
|
||||
<longitude>-64.849871</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.289545</latitude>
|
||||
<longitude>-64.854162</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.290198</latitude>
|
||||
<longitude>-64.858711</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.297164</latitude>
|
||||
<longitude>-64.856394</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.296148</latitude>
|
||||
<longitude>-64.849184</longitude>
|
||||
</coordinate>
|
||||
</boundaries>
|
||||
<compoundMark>
|
||||
<name>Start Line</name>
|
||||
<coordinate>
|
||||
<latitude>32.296577</latitude>
|
||||
<longitude>-64.854304</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.293771</latitude>
|
||||
<longitude>-64.855242</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
<compoundMark>
|
||||
<name>Mark</name>
|
||||
<coordinate>
|
||||
<latitude>32.293039</latitude>
|
||||
<longitude>-64.843983</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
<compoundMark>
|
||||
<name>Windward Gate</name>
|
||||
<coordinate>
|
||||
<latitude>32.284680</latitude>
|
||||
<longitude>-64.850045</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.280164</latitude>
|
||||
<longitude>-64.847591</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
<compoundMark>
|
||||
<name>Leeward Gate</name>
|
||||
<coordinate>
|
||||
<latitude>32.309693</latitude>
|
||||
<longitude>-64.835249</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.308046</latitude>
|
||||
<longitude>-64.831785</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
<compoundMark>
|
||||
<name>Finish Line</name>
|
||||
<coordinate>
|
||||
<latitude>32.317379</latitude>
|
||||
<longitude>-64.839291</longitude>
|
||||
</coordinate>
|
||||
<coordinate>
|
||||
<latitude>32.317257</latitude>
|
||||
<longitude>-64.836260</longitude>
|
||||
</coordinate>
|
||||
</compoundMark>
|
||||
</course>
|
||||
</race>
|
||||
Reference in New Issue
Block a user