From a271952e0c61150e8d71f1fd5e3b0feca2f4037a Mon Sep 17 00:00:00 2001 From: hba56 Date: Mon, 1 May 2017 16:08:23 +1200 Subject: [PATCH 1/2] fixed boat parser for the mock #story[778] --- .../java/seng302/Networking/Utils/AC35UnitConverter.java | 5 +++++ .../java/seng302/Networking/Utils/BoatLocationMessage.java | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java b/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java index 2c4d13d8..3a99253c 100644 --- a/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java +++ b/network/src/main/java/seng302/Networking/Utils/AC35UnitConverter.java @@ -10,6 +10,11 @@ public class AC35UnitConverter { return (double) value * 180.0/21474836418.0;//2^31 = 21474836418 } + public static int convertGPSToInt(double value){ + //converts latitude or longitue to angle + return (int) (value * 21474836418.0/180.0);//2^31 = 21474836418 + } + public static double convertHeading(long value){ return (double) value * 360.0/65536.0;//2^15 } diff --git a/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java b/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java index 033c60fe..237caabc 100644 --- a/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java +++ b/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java @@ -8,6 +8,8 @@ import SharedModel.BoatInRace; import SharedModel.Constants; import SharedModel.GPSCoordinate; +import static seng302.Networking.Utils.AC35UnitConverter.convertGPSToInt; + /** * Represents the information in a boat location message (AC streaming spec: 4.9). */ @@ -157,8 +159,8 @@ public class BoatLocationMessage extends AC35Data this.sourceID = boat.getSourceID(); this.sequenceNumber = sequenceNumber; this.deviceType = 1; - this.latitude = 0;//boat.getCurrentPosition().getLatitude(); - this.longitude = 0;//boat.getCurrentPosition().getLongitude(); + this.latitude = convertGPSToInt(boat.getCurrentPosition().getLatitude()); + this.longitude = convertGPSToInt(boat.getCurrentPosition().getLongitude()); this.altitude = 0; this.heading = 0; this.pitch = 0; From 0bfc9a5a39f9a051cef481f467ed216c6ff85dba Mon Sep 17 00:00:00 2001 From: David Wu Date: Mon, 1 May 2017 16:37:55 +1200 Subject: [PATCH 2/2] Added test for race dnf in Race class. -Unable to test animation timer. #story[778] --- mock/src/main/java/seng302/Model/Race.java | 8 +- .../src/test/java/seng302/Model/RaceTest.java | 403 ++++++++++-------- 2 files changed, 227 insertions(+), 184 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 8913dee9..b0aefca3 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -31,6 +31,8 @@ public class Race implements Runnable { protected long totalTimeElapsed; protected int scaleFactor; protected int PRERACE_TIME = 12; //time in milliseconds to pause during pre-race + protected boolean countdownFinish = false; + protected boolean runRace = true; private int lastFPS = 20; private int raceId; private int dnfChance = 0; //percentage chance a boat fails at each checkpoint @@ -119,8 +121,11 @@ public class Race implements Runnable { public void handle(long arg0) { timeLeft = startTime - currentTime; if (timeLeft <= 0) { + countdownFinish = true; stop(); - simulateRace(); + if (runRace) { + simulateRace(); + } } else { currentTimeInSeconds = (timeLeft * scaleFactor) / 1000; minutes = currentTimeInSeconds / 60; @@ -132,6 +137,7 @@ public class Race implements Runnable { } }; timer.start(); + //countdownFinish = true; } /** diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index 273f9dc1..28bf7257 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -1,7 +1,9 @@ package seng302.Model; import SharedModel.*; +import javafx.application.Application; import javafx.scene.paint.Color; +import javafx.stage.Stage; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; @@ -30,192 +32,227 @@ import static org.mockito.Mockito.verify; /** * Created by esa46 on 15/03/17. */ -public class RaceTest { -// -// private static MockOutput mockOutput; -// SharedModel.Leg START_LEG = new SharedModel.Leg("Start", new SharedModel.Marker(new SharedModel.GPSCoordinate(0, 0)), new SharedModel.Marker(new SharedModel.GPSCoordinate(1, 1)), 0); -// SharedModel.Leg FINISH_LEG = new SharedModel.Leg("Finish", new SharedModel.Marker(new SharedModel.GPSCoordinate(1, 1)), new SharedModel.Marker(new SharedModel.GPSCoordinate(2, 2)), 0); +public class RaceTest{ + + private static MockOutput mockOutput; + SharedModel.Leg START_LEG = new SharedModel.Leg("Start", new SharedModel.Marker(new SharedModel.GPSCoordinate(0, 0)), new SharedModel.Marker(new SharedModel.GPSCoordinate(1, 1)), 0); + SharedModel.Leg FINISH_LEG = new SharedModel.Leg("Finish", new SharedModel.Marker(new SharedModel.GPSCoordinate(1, 1)), new SharedModel.Marker(new SharedModel.GPSCoordinate(2, 2)), 0); + +// @Override +// public void start(Stage primaryStage) throws Exception{} // -// @BeforeClass -// public static void setUp() { -// try { -// mockOutput = new MockOutput(); -// } catch(IOException e) { -// fail(); -// } +// public static void main(String[] args) { +// launch(args); // } -// -// @Ignore -// @Test -// public void boatLocationMessagesAreGenerated() { -// try { -// RaceDataSource raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); -// -// MockOutput mockOutput = Mockito.mock(MockOutput.class); -// Race race = new Race(raceDataSource, 100, mockOutput); -// new Thread((race)).start(); -// -// try { -// Thread.sleep(5000); -// } catch (InterruptedException e) { -// fail(); + + +// @BeforeClass +// public static void initJFX() { +// Thread t = new Thread("JavaFX Init Thread") { +// public void run() { +// Application.launch(TestApp.class, new String[0]); // } -// -// -// verify(mockOutput, atLeast(400)).parseBoatLocation(any()); -// -// } catch (IOException e) { -// fail(); -// } catch (SAXException e) { -// fail(); -// } catch (ParserConfigurationException e) { -// fail(); -// } -// } -// -// @Test -// public void timerCanBeDisabled() { -// SharedModel.BoatInRace boat1 = new SharedModel.BoatInRace("Test 1", 10000, Color.ALICEBLUE, "t1", 1); -// SharedModel.BoatInRace boat2 = new SharedModel.BoatInRace("Test 2", 10000, Color.BURLYWOOD, "t2", 2); -// List boats = new ArrayList<>(); -// boats.add(boat1); -// boats.add(boat2); -// -// ArrayList legs = new ArrayList<>(); -// legs.add(START_LEG); -// legs.add(FINISH_LEG); -// -// -// Race race = new Race(boats, legs, 5, mockOutput); -// race.setDnfChance(0); -// long timeStarted = System.currentTimeMillis(); -// race.run(); -// assertTrue(System.currentTimeMillis() - timeStarted < 4000); -// } -// -// @Test -// public void checkPositionUpdatesNumberFinishedBoats() { -// -// SharedModel.BoatInRace finishedBoat = new SharedModel.BoatInRace("Test", 1000, Color.ALICEBLUE, "tt", 1); -// finishedBoat.setDistanceTravelledInLeg(500); -// -// finishedBoat.setCurrentLeg(FINISH_LEG); -// -// ArrayList boats = new ArrayList<>(); -// boats.add(finishedBoat); -// -// ArrayList legs = new ArrayList<>(); -// legs.add(FINISH_LEG); -// -// Race race = new Race(boats, legs, 5, mockOutput); -// race.setDnfChance(0); -// assertEquals(race.boatsFinished, 0); -// -// -// race.checkPosition(finishedBoat, 100000); -// assertEquals(race.boatsFinished, 1); -// assertEquals(finishedBoat.getTimeFinished(), 100000); -// -// } -// -// @Test -// public void checkPositionDoesntUpdateNumberFinishedBoats() { -// -// SharedModel.BoatInRace unFinishedBoat = new SharedModel.BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); -// unFinishedBoat.setDistanceTravelledInLeg(0); -// -// unFinishedBoat.setCurrentLeg(FINISH_LEG); -// -// ArrayList boats = new ArrayList<>(); -// boats.add(unFinishedBoat); -// -// ArrayList legs = new ArrayList<>(); -// legs.add(FINISH_LEG); -// -// -// Race race = new Race(boats, legs, 1, mockOutput); -// race.setDnfChance(0); -// assertEquals(race.boatsFinished, 0); -// race.checkPosition(unFinishedBoat, 100); -// assertEquals(race.boatsFinished, 0); -// -// } -// -// @Test -// public void distanceTravelledBeforeUpdatingLegIsRetained() { -// -// ArrayList boats = new ArrayList<>(); -// -// ArrayList legs = new ArrayList<>(); -// -// legs.add(START_LEG); -// legs.add(FINISH_LEG); -// -// Race race = new Race(boats, legs, 1, mockOutput); -// race.setDnfChance(0); -// -// SharedModel.BoatInRace unFinishedBoat = new SharedModel.BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 4); -// unFinishedBoat.setDistanceTravelledInLeg(100); -// unFinishedBoat.setCurrentLeg(START_LEG); -// -// race.checkPosition(unFinishedBoat, 100); -// assertEquals(unFinishedBoat.getCurrentLeg().getName(), "Finish"); -// assertTrue(unFinishedBoat.getDistanceTravelledInLeg() > 0); -// assertTrue(unFinishedBoat.getDistanceTravelledInLeg() < 100); -// } -// -// @Ignore -// @Test -// public void timerDelaysByHalfSecond() throws InterruptedException { -// -// ArrayList boats = new ArrayList<>(); -// -// ArrayList legs = new ArrayList<>(); -// legs.add(START_LEG); -// -// Race race = new Race(boats, legs, 1, mockOutput); -// race.PRERACE_TIME = 500; -// -// long timeStarted = System.currentTimeMillis(); -// race.countdownTimer(); -// -// Thread.sleep(500); -// -// assertTrue(System.currentTimeMillis() - timeStarted > 500); -// -// -// } -// -// @Test -// public void scalerScalesVelocityCorrectly() { -// -// int scaleFactor = 3; -// float vel1 = 0; -// float vel2 = (float) 1.999; -// float vel3 = (float) 32.5; -// float vel4 = 500; -// SharedModel.BoatInRace boat1 = new SharedModel.BoatInRace("test", vel1, Color.ALICEBLUE, "tt",1); -// SharedModel.BoatInRace boat2 = new SharedModel.BoatInRace("test", vel2, Color.ALICEBLUE, "tt", 2); -// SharedModel.BoatInRace boat3 = new SharedModel.BoatInRace("test", vel3, Color.ALICEBLUE, "tt", 3); -// SharedModel.BoatInRace boat4 = new SharedModel.BoatInRace("test", vel4, Color.ALICEBLUE, "tt", 4); -// ArrayList boats = new ArrayList<>(); -// boats.add(boat1); -// boats.add(boat2); -// boats.add(boat3); -// boats.add(boat4); -// -// ArrayList legs = new ArrayList<>(); -// legs.add(START_LEG); -// -// -// Race race = new Race(boats, legs, scaleFactor, mockOutput); -// race.setDnfChance(0); -// -// assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-6); -// assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-6); -// assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-6); -// assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-6); -// +// }; +// t.setDaemon(true); +// t.start(); // } + @BeforeClass + public static void setUp() { + try { + mockOutput = new MockOutput(); + } catch(IOException e) { + fail(); + } + } + + @Ignore + @Test + public void boatLocationMessagesAreGenerated() { + try { + RaceDataSource raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); + + MockOutput mockOutput = Mockito.mock(MockOutput.class); + Race race = new Race(raceDataSource, 100, mockOutput); + new Thread((race)).start(); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + fail(); + } + verify(mockOutput, atLeast(400)).parseBoatLocation(any()); + + } catch (IOException e) { + fail(); + } catch (SAXException e) { + fail(); + } catch (ParserConfigurationException e) { + fail(); + } + } + + @Test + public void timerCanBeDisabled() { + SharedModel.BoatInRace boat1 = new SharedModel.BoatInRace("Test 1", 10000, Color.ALICEBLUE, "t1", 1); + SharedModel.BoatInRace boat2 = new SharedModel.BoatInRace("Test 2", 10000, Color.BURLYWOOD, "t2", 2); + List boats = new ArrayList<>(); + boats.add(boat1); + boats.add(boat2); + + ArrayList legs = new ArrayList<>(); + legs.add(START_LEG); + legs.add(FINISH_LEG); + + + Race race = new Race(boats, legs, 5, mockOutput); + race.setDnfChance(0); + long timeStarted = System.currentTimeMillis(); + race.run(); + assertTrue(System.currentTimeMillis() - timeStarted < 4000); + } + + @Test + public void checkPositionUpdatesNumberFinishedBoats() { + + SharedModel.BoatInRace finishedBoat = new SharedModel.BoatInRace("Test", 1000, Color.ALICEBLUE, "tt", 1); + finishedBoat.setDistanceTravelledInLeg(500); + + finishedBoat.setCurrentLeg(FINISH_LEG); + + ArrayList boats = new ArrayList<>(); + boats.add(finishedBoat); + + ArrayList legs = new ArrayList<>(); + legs.add(FINISH_LEG); + + Race race = new Race(boats, legs, 5, mockOutput); + race.setDnfChance(0); + assertEquals(race.boatsFinished, 0); + + race.checkPosition(finishedBoat, 100000); + assertEquals(race.boatsFinished, 1); + assertEquals(finishedBoat.getTimeFinished(), 100000); + + } + + @Test + public void checkPositionDoesntUpdateNumberFinishedBoats() { + + SharedModel.BoatInRace unFinishedBoat = new SharedModel.BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); + unFinishedBoat.setDistanceTravelledInLeg(0); + + unFinishedBoat.setCurrentLeg(FINISH_LEG); + + ArrayList boats = new ArrayList<>(); + boats.add(unFinishedBoat); + + ArrayList legs = new ArrayList<>(); + legs.add(FINISH_LEG); + + + Race race = new Race(boats, legs, 1, mockOutput); + race.setDnfChance(0); + assertEquals(race.boatsFinished, 0); + race.checkPosition(unFinishedBoat, 100); + assertEquals(race.boatsFinished, 0); + + } + + @Test + public void distanceTravelledBeforeUpdatingLegIsRetained() { + + ArrayList boats = new ArrayList<>(); + + ArrayList legs = new ArrayList<>(); + + legs.add(START_LEG); + legs.add(FINISH_LEG); + + Race race = new Race(boats, legs, 1, mockOutput); + race.setDnfChance(0); + + SharedModel.BoatInRace unFinishedBoat = new SharedModel.BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 4); + unFinishedBoat.setDistanceTravelledInLeg(100); + unFinishedBoat.setCurrentLeg(START_LEG); + + race.checkPosition(unFinishedBoat, 100); + assertEquals(unFinishedBoat.getCurrentLeg().getName(), "Finish"); + assertTrue(unFinishedBoat.getDistanceTravelledInLeg() > 0); + assertTrue(unFinishedBoat.getDistanceTravelledInLeg() < 100); + } + + @Ignore + @Test + public void timerDelaysByHalfSecond() throws InterruptedException { + + ArrayList boats = new ArrayList<>(); + + ArrayList legs = new ArrayList<>(); + legs.add(START_LEG); + + Race race = new Race(boats, legs, 1, mockOutput); + race.PRERACE_TIME = 500; + race.runRace = false; + + race.countdownTimer(); + + long timeStarted = System.currentTimeMillis(); + long currentTime = System.currentTimeMillis(); + while (!race.countdownFinish) { + currentTime = System.currentTimeMillis(); + } + + assertTrue(currentTime - timeStarted > 500); + } + + @Test + public void scalerScalesVelocityCorrectly() { + + int scaleFactor = 3; + float vel1 = 0; + float vel2 = (float) 1.999; + float vel3 = (float) 32.5; + float vel4 = 500; + SharedModel.BoatInRace boat1 = new SharedModel.BoatInRace("test", vel1, Color.ALICEBLUE, "tt",1); + SharedModel.BoatInRace boat2 = new SharedModel.BoatInRace("test", vel2, Color.ALICEBLUE, "tt", 2); + SharedModel.BoatInRace boat3 = new SharedModel.BoatInRace("test", vel3, Color.ALICEBLUE, "tt", 3); + SharedModel.BoatInRace boat4 = new SharedModel.BoatInRace("test", vel4, Color.ALICEBLUE, "tt", 4); + ArrayList boats = new ArrayList<>(); + boats.add(boat1); + boats.add(boat2); + boats.add(boat3); + boats.add(boat4); + + ArrayList legs = new ArrayList<>(); + legs.add(START_LEG); + + + Race race = new Race(boats, legs, scaleFactor, mockOutput); + race.setDnfChance(0); + + assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-6); + + } + @Test + public void doNotFinishCorrectly() { + ArrayList boats = new ArrayList<>(); + + ArrayList legs = new ArrayList<>(); + legs.add(START_LEG); + + Race race = new Race(boats, legs, 1, mockOutput); + + race.setDnfChance(100); + assertTrue(race.doNotFinish()); + + race.setDnfChance(0); + assertTrue(!race.doNotFinish()); + } + + + }