From 393fae2ec47fbeb9f05d4ec60766146da1a570c3 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 22 Mar 2017 11:03:16 +1300 Subject: [PATCH 1/3] Tests for calculating leg distance and updating boat positions added #story[9] #test --- .../seng302/Model/ConstantVelocityRace.java | 1 + src/main/java/seng302/Model/Leg.java | 10 +-- .../seng302/Model/ResizableRaceCanvas.java | 5 +- .../Model/ConstantVelocityRaceTest.java | 46 +++++++++++- src/test/java/seng302/Model/LegTest.java | 71 +++++++++++++++++++ src/test/java/seng302/Model/RaceTest.java | 25 ------- 6 files changed, 118 insertions(+), 40 deletions(-) create mode 100644 src/test/java/seng302/Model/LegTest.java diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index fb2afc99..1b83c92d 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -13,6 +13,7 @@ import java.util.ArrayList; * Created by cbt24 on 6/03/17. */ public class ConstantVelocityRace extends Race { + /** * Initialiser for a Race with constant velocity. * @param startingBoats array of boats diff --git a/src/main/java/seng302/Model/Leg.java b/src/main/java/seng302/Model/Leg.java index 84ee1529..3cc41743 100644 --- a/src/main/java/seng302/Model/Leg.java +++ b/src/main/java/seng302/Model/Leg.java @@ -55,15 +55,6 @@ public class Leg { return distance; } - - /** - * - * @return Returns the name of the Leg - */ - public String toString() { - return name; - } - /** * Returns the coordinates in GPSCoordinate class of the boats starting coordinate. * @return Returns the coordinate of the start of the leg. @@ -101,5 +92,6 @@ public class Leg { calc.setStartingGeographicPoint(startGPSCoordinate.getLongitude(), startGPSCoordinate.getLatitude()); calc.setDestinationGeographicPoint(endGPSCoordinate.getLongitude(), endGPSCoordinate.getLatitude()); return calc.getOrthodromicDistance() / Constants.NMToMetersConversion; + } } diff --git a/src/main/java/seng302/Model/ResizableRaceCanvas.java b/src/main/java/seng302/Model/ResizableRaceCanvas.java index bcb44e1e..ab46da00 100644 --- a/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -1,6 +1,6 @@ package seng302.Model; -import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const; + import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; @@ -11,9 +11,6 @@ import seng302.GPSCoordinate; import seng302.GraphCoordinate; import seng302.RaceMap; -import java.util.ArrayList; -import java.util.Random; - /** * This creates a JavaFX Canvas that is fills it's parent. * Cannot be downsized. diff --git a/src/test/java/seng302/Model/ConstantVelocityRaceTest.java b/src/test/java/seng302/Model/ConstantVelocityRaceTest.java index 024028da..61dc66b7 100644 --- a/src/test/java/seng302/Model/ConstantVelocityRaceTest.java +++ b/src/test/java/seng302/Model/ConstantVelocityRaceTest.java @@ -1,6 +1,7 @@ package seng302.Model; +import javafx.scene.paint.Color; import org.geotools.referencing.GeodeticCalculator; import org.junit.Test; import org.opengis.geometry.coordinate.Geodesic; @@ -8,6 +9,7 @@ import seng302.Constants; import seng302.GPSCoordinate; import java.awt.geom.Point2D; +import java.util.ArrayList; import static org.junit.Assert.assertEquals; @@ -16,10 +18,50 @@ import static org.junit.Assert.assertEquals; */ public class ConstantVelocityRaceTest { -// @Test -// public void + @Test + public void updatePositionChangesDistanceTravelled() { + + BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); + Leg start = new Leg("Start", new GPSCoordinate(0, 0), new GPSCoordinate(50, 50), 0); + boat.setCurrentLeg(start); + boat.setDistanceTravelledInLeg(0); + int timeElapsed = 3600000; //1 hr + + ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], new ArrayList()); + + race.updatePosition(boat, timeElapsed); + assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() * timeElapsed / 3600000, 1e-8); + } + + @Test + public void updatePositionHandlesNoChangeToDistanceTravelled() { + + BoatInRace boat = new BoatInRace("Test", 0, Color.ALICEBLUE, "tt"); + Leg start = new Leg("Start", new GPSCoordinate(0, 0), new GPSCoordinate(50, 50), 0); + boat.setCurrentLeg(start); + boat.setDistanceTravelledInLeg(0); + int timeElapsed = 3600000; //1 hr + ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], new ArrayList()); + + race.updatePosition(boat, timeElapsed); + assertEquals(boat.getDistanceTravelledInLeg(), 0, 1e-8); + } + + @Test + public void changesToDistanceTravelledAreAdditive() { + BoatInRace boat = new BoatInRace("Test", 5, Color.ALICEBLUE, "tt"); + Leg start = new Leg("Start", new GPSCoordinate(0, 0), new GPSCoordinate(50, 50), 0); + boat.setCurrentLeg(start); + boat.setDistanceTravelledInLeg(50); + int timeElapsed = 3600000; //1 hr + + ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], new ArrayList()); + + race.updatePosition(boat, timeElapsed); + assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() * timeElapsed / 3600000 + 50, 1e-8); + } @Test public void travelling10nmNorthGivesCorrectNewCoordinates() { diff --git a/src/test/java/seng302/Model/LegTest.java b/src/test/java/seng302/Model/LegTest.java new file mode 100644 index 00000000..621ea98b --- /dev/null +++ b/src/test/java/seng302/Model/LegTest.java @@ -0,0 +1,71 @@ +package seng302.Model; + +import org.geotools.referencing.GeodeticCalculator; +import org.junit.Test; +import seng302.Constants; +import seng302.GPSCoordinate; + +import static junit.framework.TestCase.assertEquals; + +/** + * Created by esa46 on 22/03/17. + */ +public class LegTest { + + @Test + public void calculateDistanceHandles5nmNorth() { + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(0, 0); + calc.setDirection(0, 5 * Constants.NMToMetersConversion); + + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(calc.getDestinationGeographicPoint().getY(), calc.getDestinationGeographicPoint().getX()); + Leg test= new Leg("Test", startPoint, endPoint, 0); + assertEquals(test.getDistance(), 5, 1e-8); + } + + @Test + public void calculateDistanceHandles12nmEast() { + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(0, 0); + calc.setDirection(90, 12 * Constants.NMToMetersConversion); + + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(calc.getDestinationGeographicPoint().getY(), calc.getDestinationGeographicPoint().getX()); + Leg test= new Leg("Test", startPoint, endPoint, 0); + assertEquals(test.getDistance(), 12, 1e-8); + } + + @Test + public void calculateDistanceHandlesHalfnmSouth() { + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(0, 0); + calc.setDirection(180, 0.5 * Constants.NMToMetersConversion); + + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(calc.getDestinationGeographicPoint().getY(), calc.getDestinationGeographicPoint().getX()); + Leg test= new Leg("Test", startPoint, endPoint, 0); + assertEquals(test.getDistance(), 0.5, 1e-8); + } + + @Test + public void calculateDistanceHandlesPoint1nmWest() { + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(0, 0); + calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion); + + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(calc.getDestinationGeographicPoint().getY(), calc.getDestinationGeographicPoint().getX()); + Leg test= new Leg("Test", startPoint, endPoint, 0); + assertEquals(test.getDistance(), 0.1, 1e-8); + } + + @Test + public void calculateDistanceHandlesZeroDifference() { + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(0, 0); + Leg test= new Leg("Test", startPoint, endPoint, 0); + assertEquals(test.getDistance(), 0, 1e-8); + } + +} diff --git a/src/test/java/seng302/Model/RaceTest.java b/src/test/java/seng302/Model/RaceTest.java index f448d092..b7a52d3d 100644 --- a/src/test/java/seng302/Model/RaceTest.java +++ b/src/test/java/seng302/Model/RaceTest.java @@ -22,31 +22,6 @@ import static org.junit.Assert.assertTrue; public class RaceTest { -// @Ignore -// @Test -// public void singleBoatRaceRunsAndFinishes(){ -// -// BoatInRace boat = new BoatInRace("NZ", 240); -// ArrayList boats = new ArrayList<>(); -// boats.add(boat); -// ArrayList legs = new ArrayList<>(); -// legs.add(new Leg("Start", new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0)); -// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); -// race.run(); -// } -// -// @Test -// public void fasterBoatFinishesFirst() { -// BoatInRace fasterBoat = new BoatInRace("NZ", 2800); -// BoatInRace slowerBoat = new BoatInRace("AU", 1800); -// BoatInRace[] boats = new BoatInRace[] {slowerBoat, fasterBoat}; -// Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(3, 4), 0); -// ArrayList legs = new ArrayList<>(); -// legs.add(leg1); -// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); -// race.run(); -// } - @Test public void finishOrderDeterminedByVelocity() { BoatInRace[] boats = { From 71995accfbdd26e5706781f47172234d7d95afd8 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 22 Mar 2017 11:22:05 +1300 Subject: [PATCH 2/3] Refactored BoatInRace currentLegName property -Removed current leg name as current leg was already being stored so it was redundant #refactor #story[15] --- src/main/java/seng302/Model/BoatInRace.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/seng302/Model/BoatInRace.java b/src/main/java/seng302/Model/BoatInRace.java index 560feb21..c20770ea 100644 --- a/src/main/java/seng302/Model/BoatInRace.java +++ b/src/main/java/seng302/Model/BoatInRace.java @@ -20,7 +20,6 @@ public class BoatInRace extends Boat { private long timeFinished; private Color colour; private boolean finished = false; - private StringProperty currentLegName; /** * Constructor method. @@ -31,7 +30,6 @@ public class BoatInRace extends Boat { public BoatInRace(String name, double velocity, Color colour, String abbrev) { super(name, velocity, abbrev); setColour(colour); - currentLegName = new SimpleStringProperty(""); } /** @@ -92,10 +90,15 @@ public class BoatInRace extends Boat { */ public void setCurrentLeg(Leg currentLeg) { this.currentLeg = currentLeg; - this.currentLegName.setValue(currentLeg.getName()); } public StringProperty getCurrentLegName(){ + + StringProperty currentLegName = new SimpleStringProperty(""); + if (currentLeg != null) { + currentLegName.setValue(currentLeg.getName()); + } + return currentLegName; } @@ -132,7 +135,6 @@ public class BoatInRace extends Boat { this.finished = bool; } - /** * Calculates the bearing of the travel via map coordinates of the raceMarkers * @return the heading that the boat is heading towards in degrees. From 7e2804215beb174dbeb3796a974f14b856a9f2fc Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 22 Mar 2017 11:38:57 +1300 Subject: [PATCH 3/3] Methods for calculating heading (instead of azimuth) added - Azimuth is necessary for geodetic calculator but is between -180 and 180 - Headings need to be displayed from 0 to 360 so conversions methods were necessary #implement #sory[24] --- src/main/java/seng302/Model/BoatInRace.java | 28 ++++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/seng302/Model/BoatInRace.java b/src/main/java/seng302/Model/BoatInRace.java index c20770ea..3e3a1065 100644 --- a/src/main/java/seng302/Model/BoatInRace.java +++ b/src/main/java/seng302/Model/BoatInRace.java @@ -98,7 +98,6 @@ public class BoatInRace extends Boat { if (currentLeg != null) { currentLegName.setValue(currentLeg.getName()); } - return currentLegName; } @@ -136,17 +135,38 @@ public class BoatInRace extends Boat { } /** - * Calculates the bearing of the travel via map coordinates of the raceMarkers - * @return the heading that the boat is heading towards in degrees. + * Calculates the azimuth of the travel via map coordinates of the raceMarkers + * @return the direction that the boat is heading towards in degrees (-180 to 180). */ public double calculateAzimuth(){ - //to be changed to coordinates when used to match reality. + GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint(currentLeg.getStartGraphCoordinate().getLongitude(), currentLeg.getStartGraphCoordinate().getLatitude()); calc.setDestinationGeographicPoint(currentLeg.getEndGraphCoordinate().getLongitude(), currentLeg.getEndGraphCoordinate().getLatitude()); return calc.getAzimuth(); + } + /** + * Converts an azimuth to a bearing + * @param azimuth azimuth valuye to be converted + * @return the bearings in degrees (0 to 360). + */ + public static double calculateHeading(double azimuth) { + if (azimuth >= 0) { + return azimuth; + } + else { + return azimuth + 360; + } } + /** + * Calculates the bearing of the travel via map coordinates of the raceMarkers + * @return the direction that the boat is heading towards in degrees (0 to 360). + */ + public double calculateHeading(){ + double azimuth = this.calculateAzimuth(); + return calculateHeading(azimuth); + } }