diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 6d4bdf8e..f6339d4f 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -133,7 +133,7 @@ public class RaceController extends Controller { //Initialize save annotation array, fps listener, and annotation listeners //timezone - RaceClock raceClock = new RaceClock(raceData.getMark()); + RaceClock raceClock = new RaceClock(raceData.getZonedDateTime()); timeZone.setText(raceClock.getTimeZone()); initializeFPS(); initializeAnnotations(); diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java index f62fb6ea..f5662746 100644 --- a/visualiser/src/main/java/seng302/Controllers/StartController.java +++ b/visualiser/src/main/java/seng302/Controllers/StartController.java @@ -103,8 +103,8 @@ public class StartController extends Controller { boatNameColumn.setCellValueFactory(cellData -> cellData.getValue().getName()); boatCodeColumn.setCellValueFactory(new PropertyValueFactory<>("abbrev")); //timezone - raceClock = new RaceClock(raceData.getMark()); - timeZoneTime.textProperty().bind(raceClock.timeProperty()); + raceClock = new RaceClock(raceData.getZonedDateTime()); + timeZoneTime.textProperty().bind(raceClock.timeStringProperty()); } diff --git a/visualiser/src/main/java/seng302/Mock/RegattaXMLReader.java b/visualiser/src/main/java/seng302/Mock/RegattaXMLReader.java index 6291825f..6c9cc5f6 100644 --- a/visualiser/src/main/java/seng302/Mock/RegattaXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/RegattaXMLReader.java @@ -3,6 +3,7 @@ package seng302.Mock; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import seng302.RaceDataSource; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; diff --git a/visualiser/src/main/java/seng302/Model/RaceClock.java b/visualiser/src/main/java/seng302/Model/RaceClock.java index d9815cde..7ecda612 100644 --- a/visualiser/src/main/java/seng302/Model/RaceClock.java +++ b/visualiser/src/main/java/seng302/Model/RaceClock.java @@ -6,48 +6,61 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import seng302.GPSCoordinate; +import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; /** * Created by Gondr on 19/04/2017. */ public class RaceClock { - private StringProperty time; - private DateTimeFormatter dateTimeFormatter; - private String timeZone; + private long lastTime; private ZoneId zoneId; + private ZonedDateTime time; + private StringProperty timeString; - public RaceClock(GPSCoordinate gpsCoordinate) { + public RaceClock(ZonedDateTime zonedDateTime) { + this.zoneId = zonedDateTime.getZone(); + this.timeString = new SimpleStringProperty(); + } + + public static ZonedDateTime getCurrentZonedDateTime(GPSCoordinate gpsCoordinate) { TimeZoneLookup timeZoneLookup = new TimeZoneLookup(); TimeZoneResult timeZoneResult = timeZoneLookup.getTimeZone(gpsCoordinate.getLatitude(), gpsCoordinate.getLongitude()); - zoneId = ZoneId.of(timeZoneResult.getResult()); - LocalDateTime localDateTime = LocalDateTime.now(zoneId); - ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); - dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MM HH:mm:ss z"); - // System.out.println(dateTimeFormatter.format(zonedDateTime)); - time = new SimpleStringProperty(dateTimeFormatter.format(zonedDateTime)); - DateTimeFormatter timeZoneFormatter = DateTimeFormatter.ofPattern("z"); - timeZone = timeZoneFormatter.format(zonedDateTime); + ZoneId zone = ZoneId.of(timeZoneResult.getResult()); + return LocalDateTime.now(zone).atZone(zone); + } + + /** + * Sets time to arbitrary zoned time. + * @param time arbitrary time with timezone. + */ + public void setTime(ZonedDateTime time) { + this.time = time; + this.timeString.set(DateTimeFormatter.ofPattern("dd-MM HH:mm:ss z").format(time)); + this.lastTime = System.currentTimeMillis(); } + /** + * Updates time by duration elapsed since last update. + */ public void updateTime() { - LocalDateTime localDateTime = LocalDateTime.now(zoneId); - ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); - time.setValue(dateTimeFormatter.format(zonedDateTime)); + this.time.plus(Duration.of(System.currentTimeMillis() - this.lastTime, ChronoUnit.MILLIS)); + this.lastTime = System.currentTimeMillis(); } - public String getTime() { - return time.get(); + public String getTimeZone() { + return zoneId.toString(); } - public StringProperty timeProperty() { - return time; + public String getTimeString() { + return timeString.get(); } - public String getTimeZone() { - return timeZone; + public StringProperty timeStringProperty() { + return timeString; } } diff --git a/visualiser/src/main/java/seng302/RaceDataSource.java b/visualiser/src/main/java/seng302/RaceDataSource.java index 2f562766..82d30b73 100644 --- a/visualiser/src/main/java/seng302/RaceDataSource.java +++ b/visualiser/src/main/java/seng302/RaceDataSource.java @@ -3,6 +3,7 @@ package seng302; import seng302.Model.BoatInRace; import seng302.Model.Leg; +import java.time.ZonedDateTime; import java.util.List; /** @@ -13,7 +14,7 @@ public interface RaceDataSource { List getLegs(); List getBoundary(); - GPSCoordinate getMark(); + ZonedDateTime getZonedDateTime(); GPSCoordinate getMapTopLeft(); GPSCoordinate getMapBottomRight(); } diff --git a/visualiser/src/main/java/seng302/RaceXMLReader.java b/visualiser/src/main/java/seng302/RaceXMLReader.java index f10da6ef..14244417 100644 --- a/visualiser/src/main/java/seng302/RaceXMLReader.java +++ b/visualiser/src/main/java/seng302/RaceXMLReader.java @@ -4,12 +4,11 @@ import javafx.scene.paint.Color; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import seng302.Model.BoatInRace; -import seng302.Model.Leg; -import seng302.Model.Marker; +import seng302.Model.*; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; @@ -272,8 +271,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { return legs; } - public GPSCoordinate getMark() { - return mark; + public ZonedDateTime getZonedDateTime() { + return RaceClock.getCurrentZonedDateTime(mark); } public GPSCoordinate getStartPt1() { diff --git a/visualiser/src/test/java/seng302/Model/RaceTest.java b/visualiser/src/test/java/seng302/Model/RaceTest.java index 859e74e6..79024843 100644 --- a/visualiser/src/test/java/seng302/Model/RaceTest.java +++ b/visualiser/src/test/java/seng302/Model/RaceTest.java @@ -1,173 +1,18 @@ package seng302.Model; -import javafx.scene.paint.Color; +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import seng302.GPSCoordinate; - -import java.util.ArrayList; -import java.util.Arrays; +import org.mockito.Mock; +import seng302.RaceDataSource; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.*; /** * Created by esa46 on 15/03/17. */ public class RaceTest { - Leg START_LEG = new Leg("Start", new Marker(new GPSCoordinate(0, 0)), new Marker(new GPSCoordinate(1, 1)), 0); - Leg FINISH_LEG = new Leg("Finish", new Marker(new GPSCoordinate(1, 1)), new Marker(new GPSCoordinate(2, 2)), 0); - - @Ignore - @Test - public void timerCanBeDisabled() { - BoatInRace boat1 = new BoatInRace("Test 1", 10000, Color.ALICEBLUE, "t1"); - BoatInRace boat2 = new BoatInRace("Test 2", 10000, Color.BURLYWOOD, "t2"); - BoatInRace[] boats = new BoatInRace[]{boat1, boat2}; - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); legs.add(FINISH_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 5); - race.disableTimer(); - race.setDnfChance(0); - long timeStarted = System.currentTimeMillis(); - race.run(); - - assertTrue(System.currentTimeMillis() - timeStarted < 4000); - } - - @Test - public void checkPositionUpdatesNumberFinishedBoats() { - - BoatInRace finishedBoat = new BoatInRace("Test", 1000, Color.ALICEBLUE, "tt"); - finishedBoat.setDistanceTravelledInLeg(500); - - finishedBoat.setCurrentLeg(FINISH_LEG); - - ArrayList legs = new ArrayList<>(); - legs.add(FINISH_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], legs, null, 1); - race.setDnfChance(0); - assertEquals(race.boatsFinished, 0); - - - race.checkPosition(finishedBoat, 100000); - assertEquals(race.boatsFinished, 1); - assertEquals(finishedBoat.getTimeFinished(), 100000); - } - - @Test - public void checkPositionDoesntUpdateNumberFinishedBoats() { - - BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); - unFinishedBoat.setDistanceTravelledInLeg(0); - - unFinishedBoat.setCurrentLeg(FINISH_LEG); - - ArrayList legs = new ArrayList<>(); - legs.add(FINISH_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], legs, null, 1); - race.setDnfChance(0); - assertEquals(race.boatsFinished, 0); - - race.checkPosition(unFinishedBoat, 100); - assertEquals(race.boatsFinished, 0); - } - - @Test - public void distanceTravelledBeforeUpdatingLegIsRetained() { - - ArrayList legs = new ArrayList<>(); - - - legs.add(START_LEG); - legs.add(FINISH_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], legs, null, 1); - race.setDnfChance(0); - - BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); - unFinishedBoat.setDistanceTravelledInLeg(100); - unFinishedBoat.setCurrentLeg(START_LEG); - - race.checkPosition(unFinishedBoat, 100); - assertEquals(unFinishedBoat.getCurrentLeg().getName(), "Finish"); - assertTrue(unFinishedBoat.getDistanceTravelledInLeg() > 0); - assertTrue(unFinishedBoat.getDistanceTravelledInLeg() < 100); - - } - - /*@Test - - //Test temporarily removed as countdown timer now uses animation timer - - public void timerDelaysByHalfSecond() { - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], legs, null, 1); - race.PRERACE_TIME = 500; - - long timeStarted = System.currentTimeMillis(); - race.countdownTimer(); - - //assertTrue(System.currentTimeMillis() - timeStarted > 500); - System.out.println(System.currentTimeMillis() - timeStarted); - - }*/ - - @Test - public void scalerScalesVelocityCorrectly() { - - int scaleFactor = 3; - float vel1 = 0; - float vel2 = (float) 1.999; - float vel3 = (float) 32.5; - float vel4 = 500; - BoatInRace boat1 = new BoatInRace("test", vel1, Color.ALICEBLUE, "tt"); - BoatInRace boat2 = new BoatInRace("test", vel2, Color.ALICEBLUE, "tt"); - BoatInRace boat3 = new BoatInRace("test", vel3, Color.ALICEBLUE, "tt"); - BoatInRace boat4 = new BoatInRace("test", vel4, Color.ALICEBLUE, "tt"); - BoatInRace[] boats = new BoatInRace[]{boat1, boat2, boat3, boat4}; - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, scaleFactor); - 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 scalerScalesRaceClockTo1MinCorrectly() { - int scaleFactor = 10; - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[5], legs, null, scaleFactor); - race.totalTimeElapsed = 6000; //6 seconds - assertTrue(race.calcTimer().equals("Race clock: 00:01:00")); - } - - @Test - public void scalerScalesRaceClockHoursMinutesAndSecondsCorrectly() { - int scaleFactor = 3; - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[5], legs, null, scaleFactor); - race.totalTimeElapsed = 3213000; - assertTrue(race.calcTimer().equals("Race clock: 02:40:39")); - - } }