From 1b6693a19b59859a9e0f6c387ecc49e03d7df9c7 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 12:39:58 +1200 Subject: [PATCH 01/23] Added xml files for mock to read in - In process of switching to reading official xml format instead of our own #story[881] --- mock/src/main/java/seng302/Model/Event.java | 4 ++ mock/src/main/resources/mockXML/boatTest | 23 ++++++++ mock/src/main/resources/mockXML/raceTest | 61 +++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 mock/src/main/resources/mockXML/boatTest create mode 100644 mock/src/main/resources/mockXML/raceTest diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 3811b4f2..cc904f17 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -60,6 +60,8 @@ public class Event { System.setOut(System.out); RegattaData regattaData = new RegattaData(regattaDataSource); String xmlString = regattaData.createXML(); + + System.out.println(xmlString); mockOutput.setRegattaXml(xmlString); mockOutput.parseXMLString(xmlString, 26); @@ -73,6 +75,7 @@ public class Event { RaceData raceData = new RaceData(raceDataSource); //Serialize race data to an XML as a string. String xmlString = raceData.createXML(); + System.out.println(xmlString); mockOutput.setRaceXml(xmlString); mockOutput.parseXMLString(xmlString, 26); } @@ -85,6 +88,7 @@ public class Event { BoatData boatData = new BoatData(raceDataSource.getBoats()); //Serialize race data to an XML as a string. String xmlString = boatData.createXML(); + System.out.println(xmlString); mockOutput.setBoatsXml(xmlString); mockOutput.parseXMLString(xmlString, 26); diff --git a/mock/src/main/resources/mockXML/boatTest b/mock/src/main/resources/mockXML/boatTest new file mode 100644 index 00000000..e764bf39 --- /dev/null +++ b/mock/src/main/resources/mockXML/boatTest @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mock/src/main/resources/mockXML/raceTest b/mock/src/main/resources/mockXML/raceTest new file mode 100644 index 00000000..b374a52c --- /dev/null +++ b/mock/src/main/resources/mockXML/raceTest @@ -0,0 +1,61 @@ + + + 5326 + FLEET + 2017-05-10T12:35:19+1200 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 6e9386f4fb412d8231ba7bd1fb665f20867af5f5 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Wed, 10 May 2017 13:08:34 +1200 Subject: [PATCH 02/23] Switched mock to send out official xmls. - Not reading official xmls yet #story[881], #pair[cbt24, esa46] --- mock/src/main/java/seng302/App.java | 11 +++ .../seng302/DataInput/BoatDataSource.java | 13 ++++ mock/src/main/java/seng302/Model/Event.java | 70 +++++++------------ .../mockXML/{boatTest => boatTest.xml} | 0 .../mockXML/{raceTest => raceTest.xml} | 0 5 files changed, 50 insertions(+), 44 deletions(-) create mode 100644 mock/src/main/java/seng302/DataInput/BoatDataSource.java rename mock/src/main/resources/mockXML/{boatTest => boatTest.xml} (100%) rename mock/src/main/resources/mockXML/{raceTest => raceTest.xml} (100%) diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index c80b6432..8ac58c64 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -13,6 +13,10 @@ import seng302.Model.Event; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; public class App extends Application { @@ -25,6 +29,13 @@ public class App extends Application { launch(args); } + + + static String readFile(String path, Charset encoding) throws IOException { + byte[] encoded = Files.readAllBytes(Paths.get(path)); + return new String(encoded, encoding); + } + @Override public void start(Stage primaryStage) { try { diff --git a/mock/src/main/java/seng302/DataInput/BoatDataSource.java b/mock/src/main/java/seng302/DataInput/BoatDataSource.java new file mode 100644 index 00000000..0b657ab8 --- /dev/null +++ b/mock/src/main/java/seng302/DataInput/BoatDataSource.java @@ -0,0 +1,13 @@ +package seng302.DataInput; + +import seng302.Model.Boat; + +import java.util.List; + +/** + * Created by cbt24 on 10/05/17. + */ +public interface BoatDataSource { + List getBoats(); + List getMarkerBoats(); +} diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index cc904f17..c4fa2fa2 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -10,7 +10,11 @@ import seng302.Exceptions.InvalidRaceDataException; import seng302.Exceptions.InvalidRegattaDataException; import seng302.MockOutput; -import java.io.IOException; +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; /** @@ -38,60 +42,38 @@ public class Event { * Send the initial race data and then begin race simulation */ public void start() { - System.out.println("Sending Regatta"); - sendRegattaData(); - System.out.println("Sending Race"); - sendRaceData(); - System.out.println("Sending Boat"); - sendBoatData(); + sendXMLs(); int scaleFactor = 5;//TEMP - was 15. Race newRace = new Race(raceDataSource, scaleFactor, mockOutput); new Thread((newRace)).start(); } - /** - * Send XML string of initial regatta data to the visualiser - * @throws InvalidRegattaDataException Invalid regatta - */ - public void sendRegattaData() throws InvalidRegattaDataException { + private void sendXMLs() { + try { - System.setOut(System.out); - RegattaData regattaData = new RegattaData(regattaDataSource); - String xmlString = regattaData.createXML(); + System.out.println("Sending Regatta"); + String regattaData = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); + mockOutput.setRegattaXml(regattaData); + mockOutput.parseXMLString(regattaData, 26); - System.out.println(xmlString); - mockOutput.setRegattaXml(xmlString); - mockOutput.parseXMLString(xmlString, 26); + System.out.println("Sending Race"); + String raceData = readFile("mock/src/main/resources//mockXML/raceTest.xml", StandardCharsets.UTF_8); + mockOutput.setRaceXml(raceData); + mockOutput.parseXMLString(raceData, 26); + System.out.println("Sending Boat"); + String boatData = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); + mockOutput.setBoatsXml(boatData); + mockOutput.parseXMLString(boatData, 26); + } catch (IOException e) { + e.printStackTrace(); + } } - /** - * Send XML string of initial race data to the visualiser - * @throws InvalidRaceDataException Invalid race - */ - public void sendRaceData() throws InvalidRaceDataException { - RaceData raceData = new RaceData(raceDataSource); - //Serialize race data to an XML as a string. - String xmlString = raceData.createXML(); - System.out.println(xmlString); - mockOutput.setRaceXml(xmlString); - mockOutput.parseXMLString(xmlString, 26); - } - - /** - * Send XML string of initial boat data to the visualiser - * @throws InvalidBoatDataException Invalid boat - */ - public void sendBoatData() throws InvalidBoatDataException { - BoatData boatData = new BoatData(raceDataSource.getBoats()); - //Serialize race data to an XML as a string. - String xmlString = boatData.createXML(); - System.out.println(xmlString); - mockOutput.setBoatsXml(xmlString); - mockOutput.parseXMLString(xmlString, 26); - + static String readFile(String path, Charset encoding) throws IOException { + byte[] encoded = Files.readAllBytes(Paths.get(path)); + return new String(encoded, encoding); } - } diff --git a/mock/src/main/resources/mockXML/boatTest b/mock/src/main/resources/mockXML/boatTest.xml similarity index 100% rename from mock/src/main/resources/mockXML/boatTest rename to mock/src/main/resources/mockXML/boatTest.xml diff --git a/mock/src/main/resources/mockXML/raceTest b/mock/src/main/resources/mockXML/raceTest.xml similarity index 100% rename from mock/src/main/resources/mockXML/raceTest rename to mock/src/main/resources/mockXML/raceTest.xml From 83d6cdbd5999f0bde9099436d0b5ae88f09194c5 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 13:37:32 +1200 Subject: [PATCH 03/23] Edited race xml read by mock - It now includes source ids - Legs are in the correct sequence order for the example race #story[881] --- mock/src/main/resources/mockXML/raceTest.xml | 30 +++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index b374a52c..40a509a2 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -17,32 +17,28 @@ - - + + - - + + - - + + - - + + - - + + - - - - - - - + + + From 16d3fe2ef21fbf9afe410dbf480e03bc91bff324 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 13:50:28 +1200 Subject: [PATCH 04/23] Added marker boats with correct gps positions into boats xml read by mock #story[881] --- mock/src/main/resources/mockXML/boatTest.xml | 32 ++++++++++++++++++++ mock/src/main/resources/mockXML/raceTest.xml | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/mock/src/main/resources/mockXML/boatTest.xml b/mock/src/main/resources/mockXML/boatTest.xml index e764bf39..84f911bc 100644 --- a/mock/src/main/resources/mockXML/boatTest.xml +++ b/mock/src/main/resources/mockXML/boatTest.xml @@ -1,6 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index 40a509a2..2cdb66e9 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -29,7 +29,7 @@ - + From 69cd44bda8afbea9b47c2d9f1f06effa7b783a52 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Wed, 10 May 2017 13:57:20 +1200 Subject: [PATCH 05/23] Reads data from boat XML file - Creates marks for building CompoundMarks (formerly Markers) - Rearranged Boat constructor and removed velocity #story[782] --- mock/src/main/java/seng302/App.java | 11 +- mock/src/main/java/seng302/Data/BoatData.java | 4 +- mock/src/main/java/seng302/Data/RaceData.java | 20 ++-- .../seng302/DataInput/BoatDataSource.java | 3 +- .../java/seng302/DataInput/BoatXMLReader.java | 111 ++++++++++++++++++ .../seng302/DataInput/RaceDataSource.java | 4 +- .../java/seng302/DataInput/RaceXMLReader.java | 33 +++--- .../java/seng302/DataInput/XMLReader.java | 5 + mock/src/main/java/seng302/Model/Boat.java | 25 ++-- .../{Marker.java => CompoundMarker.java} | 8 +- mock/src/main/java/seng302/Model/Event.java | 5 +- mock/src/main/java/seng302/Model/Leg.java | 30 ++--- mock/src/main/java/seng302/Model/Mark.java | 12 ++ mock/src/main/java/seng302/Model/Race.java | 26 ++-- .../main/resources/raceXML/bermuda_AC35.xml | 64 +++++----- .../src/test/java/seng302/Model/BoatTest.java | 50 ++++---- ...arkerTest.java => CompoundMarkerTest.java} | 12 +- mock/src/test/java/seng302/Model/LegTest.java | 24 ++-- .../src/test/java/seng302/Model/RaceTest.java | 4 +- .../test/java/seng302/Model/RaceXMLTest.java | 10 +- .../test/resources/raceXML/bermuda_AC35.xml | 60 +++++----- .../java/seng302/Mock/StreamedCourse.java | 4 +- .../seng302/Mock/StreamedCourseXMLReader.java | 42 +++---- .../main/java/seng302/Mock/StreamedRace.java | 6 +- .../main/java/seng302/Model/BoatInRace.java | 4 +- .../Model/{Marker.java => CompoundMark.java} | 6 +- .../seng302/Model/ConstantVelocityRace.java | 18 +-- .../src/main/java/seng302/Model/Leg.java | 30 ++--- .../seng302/Model/ResizableRaceCanvas.java | 14 +-- .../src/main/java/seng302/RaceDataSource.java | 4 +- .../src/main/java/seng302/RaceXMLReader.java | 18 +-- .../main/resources/raceXML/bermuda_AC35.xml | 60 +++++----- .../java/seng302/Mock/StreamedRaceTest.java | 6 +- .../java/seng302/Model/BoatInRaceTest.java | 62 +++++----- ...{MarkerTest.java => CompoundMarkTest.java} | 12 +- .../Model/ConstantVelocityRaceTest.java | 4 +- .../src/test/java/seng302/Model/LegTest.java | 24 ++-- .../test/resources/raceXML/bermuda_AC35.xml | 60 +++++----- 38 files changed, 511 insertions(+), 384 deletions(-) create mode 100644 mock/src/main/java/seng302/DataInput/BoatXMLReader.java rename mock/src/main/java/seng302/Model/{Marker.java => CompoundMarker.java} (88%) create mode 100644 mock/src/main/java/seng302/Model/Mark.java rename mock/src/test/java/seng302/Model/{MarkerTest.java => CompoundMarkerTest.java} (76%) rename visualiser/src/main/java/seng302/Model/{Marker.java => CompoundMark.java} (92%) rename visualiser/src/test/java/seng302/Model/{MarkerTest.java => CompoundMarkTest.java} (77%) diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 8ac58c64..de74be36 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -4,17 +4,13 @@ package seng302; import javafx.application.Application; import javafx.stage.Stage; import org.xml.sax.SAXException; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RaceXMLReader; -import seng302.DataInput.RegattaDataSource; -import seng302.DataInput.RegattaXMLReader; +import seng302.DataInput.*; import seng302.Model.Event; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; @@ -39,9 +35,10 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - RaceDataSource raceData = new RaceXMLReader("raceXML/bermuda_AC35.xml"); + RaceDataSource raceData = new RaceXMLReader("mockXML/raceTest.xml"); RegattaDataSource regattaData = new RegattaXMLReader("mockXML/regattaTest.xml"); - Event raceEvent = new Event(raceData, regattaData); + BoatDataSource boatData = new BoatXMLReader("mockXML/boatTest.xml"); + Event raceEvent = new Event(raceData, regattaData, boatData); raceEvent.start(); } catch (IOException e) { e.printStackTrace(); diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java index e06a0663..c34dc614 100644 --- a/mock/src/main/java/seng302/Data/BoatData.java +++ b/mock/src/main/java/seng302/Data/BoatData.java @@ -159,7 +159,7 @@ public class BoatData { private void appendStoweName(Element boat, int i) { //StoweName attribute Attr attrStoweName = doc.createAttribute("StoweName"); - attrStoweName.setValue(boatData.get(i).getAbbrev()); + attrStoweName.setValue(boatData.get(i).getCountry()); boat.setAttributeNode(attrStoweName); } @@ -172,7 +172,7 @@ public class BoatData { private void appendShortName(Element boat, int i) { //ShortName attribute Attr attrShortName = doc.createAttribute("ShortName"); - attrShortName.setValue(boatData.get(i).getAbbrev()); + attrShortName.setValue(boatData.get(i).getCountry()); boat.setAttributeNode(attrShortName); } diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java index c6d89898..bc502d44 100644 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ b/mock/src/main/java/seng302/Data/RaceData.java @@ -5,8 +5,8 @@ import org.w3c.dom.Element; import seng302.DataInput.RaceDataSource; import seng302.Exceptions.InvalidRaceDataException; import seng302.Model.Boat; +import seng302.Model.CompoundMarker; import seng302.Model.GPSCoordinate; -import seng302.Model.Marker; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -151,9 +151,9 @@ public class RaceData { Element compoundMarkSeqElement = doc.createElement("CompoundMarkSequence"); int i = 1; - for (Marker marker : dataSource.getMarkers()) { + for (CompoundMarker compoundMarker : dataSource.getCompoundMarkers()) { - courseElement.appendChild(createCompoundMarker(marker, i)); + courseElement.appendChild(createCompoundMarker(compoundMarker, i)); compoundMarkSeqElement.appendChild(createCornerElement(i)); i++; } @@ -177,21 +177,21 @@ public class RaceData { } /** - * Creates a compound marker holding one or two marks,and a sequence number + * Creates a compound compoundMarker holding one or two marks,and a sequence number * - * @param marker marker + * @param compoundMarker compoundMarker * @param i sequence number * @return Element compound mark element */ - private Element createCompoundMarker(Marker marker, int i) { + private Element createCompoundMarker(CompoundMarker compoundMarker, int i) { Element compoundMarkElement = doc.createElement("CompoundMark"); compoundMarkElement.setAttribute("CompoundMarkID", i + ""); - compoundMarkElement.setAttribute("Name", marker.getName()); + compoundMarkElement.setAttribute("Name", compoundMarker.getName()); - compoundMarkElement.appendChild(createMark(marker.getMark1())); + compoundMarkElement.appendChild(createMark(compoundMarker.getMark1())); - if (!(marker.getMark1().equals(marker.getMark2()))) { - compoundMarkElement.appendChild(createMark(marker.getMark2())); + if (!(compoundMarker.getMark1().equals(compoundMarker.getMark2()))) { + compoundMarkElement.appendChild(createMark(compoundMarker.getMark2())); } return compoundMarkElement; diff --git a/mock/src/main/java/seng302/DataInput/BoatDataSource.java b/mock/src/main/java/seng302/DataInput/BoatDataSource.java index 0b657ab8..73b0a0cc 100644 --- a/mock/src/main/java/seng302/DataInput/BoatDataSource.java +++ b/mock/src/main/java/seng302/DataInput/BoatDataSource.java @@ -1,6 +1,7 @@ package seng302.DataInput; import seng302.Model.Boat; +import seng302.Model.Mark; import java.util.List; @@ -9,5 +10,5 @@ import java.util.List; */ public interface BoatDataSource { List getBoats(); - List getMarkerBoats(); + List getMarkerBoats(); } diff --git a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java new file mode 100644 index 00000000..2d909bfd --- /dev/null +++ b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java @@ -0,0 +1,111 @@ +package seng302.DataInput; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; +import seng302.Model.Boat; +import seng302.Model.Mark; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by cbt24 on 10/05/17. + */ +public class BoatXMLReader extends XMLReader implements BoatDataSource { + private final Map boatMap = new HashMap<>(); + private final Map markerMap = new HashMap<>(); + + public BoatXMLReader(String filePath) throws ParserConfigurationException, SAXException, IOException { + this(filePath, true); + } + + /** + * COnstructor for Boat XML + * + * @param filePath file path to read + * @param read whether or not to read and store the files straight away. + * @throws IOException error + * @throws SAXException error + * @throws ParserConfigurationException error + */ + public BoatXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException { + super(filePath); + if (read) { + read(); + } + } + + public void read() { + readSettings(); + readShapes(); + readBoats(); + } + + private void readBoats() { + Element nBoats = (Element) doc.getElementsByTagName("Boats").item(0); + for (int i = 0; i < nBoats.getChildNodes().getLength(); i++) { + Node boat = nBoats.getChildNodes().item(i); + if (boat.getNodeName().equals("Boat")) { + readSingleBoat(boat); + } + } + } + + /** + * Ignored data + */ + private void readShapes() { + + } + + /** + * Ignored data + */ + private void readSettings() { + + } + + private boolean isYachtNode(Node boatNode) { + return boatNode.getAttributes().getNamedItem("Type").getTextContent().toLowerCase().equals("yacht"); + } + + /** + * Reads the information about one boat + * Ignored values: ShapeID, StoweName, HullNum, Skipper, Type + */ + private void readSingleBoat(Node boatNode) { + Boat boat; + String country = null; + int sourceID = Integer.parseInt(boatNode.getAttributes().getNamedItem("SourceID").getTextContent()); + String name = boatNode.getAttributes().getNamedItem("BoatName").getTextContent(); + String shortName = boatNode.getAttributes().getNamedItem("ShortName").getTextContent(); + if (exists(boatNode, "Country")) country = boatNode.getAttributes().getNamedItem("Country").getTextContent(); + + if (isYachtNode(boatNode)) { + if (country != null) { + boat = new Boat(sourceID, name, country); + } else { + boat = new Boat(sourceID, name, shortName); + } + boatMap.put(sourceID, boat); + } else { + Mark mark = new Mark(name); + markerMap.put(sourceID, mark); + } + } + + @Override + public List getBoats() { + return new ArrayList<>(boatMap.values()); + } + + @Override + public List getMarkerBoats() { + return new ArrayList<>(markerMap.values()); + } +} diff --git a/mock/src/main/java/seng302/DataInput/RaceDataSource.java b/mock/src/main/java/seng302/DataInput/RaceDataSource.java index 290fba5a..a58e2543 100644 --- a/mock/src/main/java/seng302/DataInput/RaceDataSource.java +++ b/mock/src/main/java/seng302/DataInput/RaceDataSource.java @@ -4,7 +4,7 @@ package seng302.DataInput; import seng302.Model.Boat; import seng302.Model.GPSCoordinate; import seng302.Model.Leg; -import seng302.Model.Marker; +import seng302.Model.CompoundMarker; import java.util.List; @@ -18,7 +18,7 @@ public interface RaceDataSource { List getBoundary(); - List getMarkers(); + List getCompoundMarkers(); int getRaceId(); diff --git a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java index 50bebb1c..05de160c 100644 --- a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java @@ -6,9 +6,9 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import seng302.Model.Boat; +import seng302.Model.CompoundMarker; import seng302.Model.GPSCoordinate; import seng302.Model.Leg; -import seng302.Model.Marker; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; @@ -27,7 +27,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; private GPSCoordinate mapTopLeft, mapBottomRight; private List boundary = new ArrayList<>(); - private List markers = new ArrayList<>(); + private List compoundMarkers = new ArrayList<>(); /** * Constractor for Race XML @@ -86,10 +86,9 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { for (int i = 0; i < nBoats.getLength(); i++) { String name = getTextValueOfNode((Element) nBoats.item(i), "name"); - String abbrev = getTextValueOfNode((Element) nBoats.item(i), "abbr"); - double velo = Double.parseDouble(getTextValueOfNode((Element) nBoats.item(i), "speed")); + String country = getTextValueOfNode((Element) nBoats.item(i), "abbr"); int sourceID = Integer.parseInt(getTextValueOfNode((Element) nBoats.item(i), "sourceID")); - Boat boat = new Boat(name, velo, abbrev, sourceID); + Boat boat = new Boat(sourceID, name, country); boat.setCurrentPosition(startPt1); if (legs.size() > 0) { boat.setCurrentLeg(legs.get(0)); @@ -107,8 +106,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { NodeList nMarkers = doc.getElementsByTagName("marker"); for (int i = 0; i < nMarkers.getLength(); i++) { - Marker marker = getMarker((Element) nMarkers.item(i)); - if (marker.getName() != null) markers.add(marker); + CompoundMarker compoundMarker = getMarker((Element) nMarkers.item(i)); + if (compoundMarker.getName() != null) compoundMarkers.add(compoundMarker); } } @@ -122,10 +121,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { for (int i = 0; i < nLegs.getLength(); i++) { String label = getTextValueOfNode((Element) nLegs.item(i), "name"); NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - Marker startMarker = getMarker(start); + CompoundMarker startCompoundMarker = getMarker(start); NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - Marker finishMarker = getMarker(finish); - legs.add(new Leg(label, startMarker, finishMarker, i)); + CompoundMarker finishCompoundMarker = getMarker(finish); + legs.add(new Leg(label, startCompoundMarker, finishCompoundMarker, i)); } } @@ -205,7 +204,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param start base nodelist this should be the tag that contains * @return */ - private Marker getMarker(NodeList start) { + private CompoundMarker getMarker(NodeList start) { return getMarker(start, 0); } @@ -216,7 +215,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param startIndex index in the node that has the coordinate tag * @return */ - private Marker getMarker(NodeList start, int startIndex) { + private CompoundMarker getMarker(NodeList start, int startIndex) { return getMarker(start, startIndex, 0); } @@ -228,7 +227,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param nodeIndex coordinate index * @return */ - private Marker getMarker(NodeList start, int startIndex, int nodeIndex) { + private CompoundMarker getMarker(NodeList start, int startIndex, int nodeIndex) { NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); Element marker = (Element) nodeList.item(nodeIndex); return getMarker(marker); @@ -240,7 +239,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param markerNode marker to turn into coordinates * @return */ - private Marker getMarker(Element markerNode) { + private CompoundMarker getMarker(Element markerNode) { NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); @@ -252,7 +251,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { side2 = side1; } NodeList name = markerNode.getElementsByTagName("name"); - return name.getLength() == 1 ? new Marker(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new Marker(side1, side2); + return name.getLength() == 1 ? new CompoundMarker(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new CompoundMarker(side1, side2); } /** @@ -363,8 +362,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { return raceID; } - public List getMarkers() { - return markers; + public List getCompoundMarkers() { + return compoundMarkers; } public String getRaceType() { diff --git a/mock/src/main/java/seng302/DataInput/XMLReader.java b/mock/src/main/java/seng302/DataInput/XMLReader.java index eba900c1..b2b89e30 100644 --- a/mock/src/main/java/seng302/DataInput/XMLReader.java +++ b/mock/src/main/java/seng302/DataInput/XMLReader.java @@ -2,6 +2,7 @@ package seng302.DataInput; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; @@ -60,4 +61,8 @@ public abstract class XMLReader { return n.getAttribute(attr); } + protected boolean exists(Node node, String attribute) { + return node.getAttributes().getNamedItem(attribute) != null; + } + } diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 5ff47bd9..67ba71b1 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -10,7 +10,7 @@ public class Boat { private String name; private double velocity; private double scaledVelocity; - private String abbrev; + private String country; private int sourceID; private Leg currentLeg; private double distanceTravelledInLeg; @@ -22,14 +22,13 @@ public class Boat { /** * Boat initialiser which keeps all of the information of the boat. * - * @param name Name of the Boat. - * @param velocity Speed in m/s that the boat travels at. - * @param abbrev nam abbreviation * @param sourceID id of boat + * @param name Name of the Boat. + * @param country nam abbreviation */ - public Boat(String name, double velocity, String abbrev, int sourceID) { - this.velocity = velocity; - this.abbrev = abbrev; + public Boat(int sourceID, String name, String country) { + this.velocity = 5; // TODO - please dont commit + this.country = this.country; this.name = name; this.sourceID = sourceID; } @@ -42,8 +41,8 @@ public class Boat { public double calculateAzimuth() { GeodeticCalculator calc = new GeodeticCalculator(); - GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate(); - GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate(); + GPSCoordinate start = currentLeg.getStartCompoundMarker().getAverageGPSCoordinate(); + GPSCoordinate end = currentLeg.getEndCompoundMarker().getAverageGPSCoordinate(); calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude()); calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude()); @@ -90,12 +89,12 @@ public class Boat { this.scaledVelocity = scaledVelocity; } - public String getAbbrev() { - return abbrev; + public String getCountry() { + return country; } - public void setAbbrev(String abbrev) { - this.abbrev = abbrev; + public void setCountry(String country) { + this.country = country; } public int getSourceID() { diff --git a/mock/src/main/java/seng302/Model/Marker.java b/mock/src/main/java/seng302/Model/CompoundMarker.java similarity index 88% rename from mock/src/main/java/seng302/Model/Marker.java rename to mock/src/main/java/seng302/Model/CompoundMarker.java index a5854449..cbe5fdf5 100644 --- a/mock/src/main/java/seng302/Model/Marker.java +++ b/mock/src/main/java/seng302/Model/CompoundMarker.java @@ -6,7 +6,7 @@ import java.awt.geom.Point2D; /** * Created by esa46 on 29/03/17. */ -public class Marker { +public class CompoundMarker { private GPSCoordinate averageGPSCoordinate; private GPSCoordinate mark1; @@ -14,7 +14,7 @@ public class Marker { private String name; private boolean doubleMarker = false; - public Marker(GPSCoordinate mark1) { + public CompoundMarker(GPSCoordinate mark1) { this.mark1 = mark1; this.mark2 = mark1; @@ -22,7 +22,7 @@ public class Marker { } - public Marker(GPSCoordinate mark1, GPSCoordinate mark2) { + public CompoundMarker(GPSCoordinate mark1, GPSCoordinate mark2) { this.mark1 = mark1; this.mark2 = mark2; @@ -30,7 +30,7 @@ public class Marker { } - public Marker(String name, GPSCoordinate mark1, GPSCoordinate mark2) { + public CompoundMarker(String name, GPSCoordinate mark1, GPSCoordinate mark2) { this.name = name; this.mark1 = mark1; diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index c4fa2fa2..f819ef9d 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -3,6 +3,7 @@ package seng302.Model; import seng302.Data.BoatData; import seng302.Data.RaceData; import seng302.Data.RegattaData; +import seng302.DataInput.BoatDataSource; import seng302.DataInput.RaceDataSource; import seng302.DataInput.RegattaDataSource; import seng302.Exceptions.InvalidBoatDataException; @@ -24,12 +25,14 @@ public class Event { RaceDataSource raceDataSource; RegattaDataSource regattaDataSource; + BoatDataSource boatDataSource; MockOutput mockOutput; - public Event(RaceDataSource raceData, RegattaDataSource regattaData) { + public Event(RaceDataSource raceData, RegattaDataSource regattaData, BoatDataSource boatDataSource) { this.raceDataSource = raceData; this.regattaDataSource = regattaData; + this.boatDataSource = boatDataSource; try { mockOutput = new MockOutput(); new Thread(mockOutput).start(); diff --git a/mock/src/main/java/seng302/Model/Leg.java b/mock/src/main/java/seng302/Model/Leg.java index 7a7b9b0e..b791627a 100644 --- a/mock/src/main/java/seng302/Model/Leg.java +++ b/mock/src/main/java/seng302/Model/Leg.java @@ -10,8 +10,8 @@ import seng302.Constants; public class Leg { private String name; //nautical miles private double distance; - private Marker startMarker; - private Marker endMarker; + private CompoundMarker startCompoundMarker; + private CompoundMarker endCompoundMarker; private int legNumber; /** @@ -22,10 +22,10 @@ public class Leg { * @param end marker * @param number Leg's position in race */ - public Leg(String name, Marker start, Marker end, int number) { + public Leg(String name, CompoundMarker start, CompoundMarker end, int number) { this.name = name; - this.startMarker = start; - this.endMarker = end; + this.startCompoundMarker = start; + this.endCompoundMarker = end; this.legNumber = number; calculateDistance(); } @@ -69,20 +69,20 @@ public class Leg { } - public Marker getStartMarker() { - return startMarker; + public CompoundMarker getStartCompoundMarker() { + return startCompoundMarker; } - public void setStartMarker(Marker startMarker) { - this.startMarker = startMarker; + public void setStartCompoundMarker(CompoundMarker startCompoundMarker) { + this.startCompoundMarker = startCompoundMarker; } - public Marker getEndMarker() { - return endMarker; + public CompoundMarker getEndCompoundMarker() { + return endCompoundMarker; } - public void setEndMarker(Marker endMarker) { - this.endMarker = endMarker; + public void setEndCompoundMarker(CompoundMarker endCompoundMarker) { + this.endCompoundMarker = endCompoundMarker; } /** @@ -92,8 +92,8 @@ public class Leg { GeodeticCalculator calc = new GeodeticCalculator(); //Load start and end of leg - GPSCoordinate startMarker = this.startMarker.getAverageGPSCoordinate(); - GPSCoordinate endMarker = this.endMarker.getAverageGPSCoordinate(); + GPSCoordinate startMarker = this.startCompoundMarker.getAverageGPSCoordinate(); + GPSCoordinate endMarker = this.endCompoundMarker.getAverageGPSCoordinate(); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion; diff --git a/mock/src/main/java/seng302/Model/Mark.java b/mock/src/main/java/seng302/Model/Mark.java new file mode 100644 index 00000000..ef9f38f5 --- /dev/null +++ b/mock/src/main/java/seng302/Model/Mark.java @@ -0,0 +1,12 @@ +package seng302.Model; + +/** + * Created by cbt24 on 10/05/17. + */ +public class Mark { + private String name; + + public Mark(String name) { + this.name = name; + } +} diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index d4e92480..c58eae49 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -216,17 +216,17 @@ public class Race implements Runnable { public void initialiseBoats() { Leg officialStart = legs.get(0); String name = officialStart.getName(); - Marker endMarker = officialStart.getEndMarker(); + CompoundMarker endCompoundMarker = officialStart.getEndCompoundMarker(); - ArrayList startMarkers = getSpreadStartingPositions(); + ArrayList startCompoundMarkers = getSpreadStartingPositions(); for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get(i); if (boat != null) { boat.setScaledVelocity(boat.getVelocity() * scaleFactor); Leg startLeg = new Leg(name, 0); - boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); - startLeg.setStartMarker(startMarkers.get(i)); - startLeg.setEndMarker(endMarker); + boat.setCurrentPosition(startCompoundMarkers.get(i).getAverageGPSCoordinate()); + startLeg.setStartCompoundMarker(startCompoundMarkers.get(i)); + startLeg.setEndCompoundMarker(endCompoundMarker); startLeg.calculateDistance(); boat.setCurrentLeg(startLeg); boat.setHeading(boat.calculateHeading()); @@ -239,27 +239,27 @@ public class Race implements Runnable { * * @return list of starting positions */ - public ArrayList getSpreadStartingPositions() { + public ArrayList getSpreadStartingPositions() { int nBoats = startingBoats.size(); - Marker marker = legs.get(0).getStartMarker(); + CompoundMarker compoundMarker = legs.get(0).getStartCompoundMarker(); GeodeticCalculator initialCalc = new GeodeticCalculator(); - initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - initialCalc.setDestinationGeographicPoint(marker.getMark2().getLongitude(), marker.getMark2().getLatitude()); + initialCalc.setStartingGeographicPoint(compoundMarker.getMark1().getLongitude(), compoundMarker.getMark1().getLatitude()); + initialCalc.setDestinationGeographicPoint(compoundMarker.getMark2().getLongitude(), compoundMarker.getMark2().getLatitude()); double azimuth = initialCalc.getAzimuth(); double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); GeodeticCalculator positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - ArrayList positions = new ArrayList<>(); + positionCalc.setStartingGeographicPoint(compoundMarker.getMark1().getLongitude(), compoundMarker.getMark1().getLatitude()); + ArrayList positions = new ArrayList<>(); for (int i = 0; i < nBoats; i++) { positionCalc.setDirection(azimuth, distanceBetweenBoats); Point2D position = positionCalc.getDestinationGeographicPoint(); - positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); + positions.add(new CompoundMarker(new GPSCoordinate(position.getY(), position.getX()))); positionCalc = new GeodeticCalculator(); positionCalc.setStartingGeographicPoint(position); @@ -302,7 +302,7 @@ public class Race implements Runnable { //update boat's distance travelled boat.setDistanceTravelledInLeg(totalDistanceTravelled); //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), + boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartCompoundMarker().getAverageGPSCoordinate(), totalDistanceTravelled, boat.calculateAzimuth())); } } diff --git a/mock/src/main/resources/raceXML/bermuda_AC35.xml b/mock/src/main/resources/raceXML/bermuda_AC35.xml index 83ae5030..7a73fc7f 100644 --- a/mock/src/main/resources/raceXML/bermuda_AC35.xml +++ b/mock/src/main/resources/raceXML/bermuda_AC35.xml @@ -48,7 +48,7 @@ Start to Mark 1 - + 32.296577 -64.854304 @@ -57,29 +57,29 @@ 32.293771 -64.855242 - + - + 32.293039 -64.843983 - + Mark 1 to Leeward Gate - + 32.293039 -64.843983 - + - + 32.309693 -64.835249 @@ -88,13 +88,13 @@ 32.308046 -64.831785 - + Leeward Gate to Windward Gate - + 32.309693 -64.835249 @@ -103,10 +103,10 @@ 32.308046 -64.831785 - + - + 32.284680 -64.850045 @@ -115,13 +115,13 @@ 32.280164 -64.847591 - + Windward Gate to Leeward Gate - + 32.284680 -64.850045 @@ -130,10 +130,10 @@ 32.280164 -64.847591 - + - + 32.309693 -64.835249 @@ -142,13 +142,13 @@ 32.308046 -64.831785 - + Leeward Gate to Finish - + 32.309693 -64.835249 @@ -157,10 +157,10 @@ 32.308046 -64.831785 - + - + 32.317379 -64.839291 @@ -169,7 +169,7 @@ 32.317257 -64.836260 - + @@ -220,7 +220,7 @@ -64.849184 - + Start Line 32.296577 @@ -230,15 +230,15 @@ 32.293771 -64.855242 - - + + Mark 32.293039 -64.843983 - - + + Windward Gate 32.284680 @@ -248,8 +248,8 @@ 32.280164 -64.847591 - - + + Leeward Gate 32.309693 @@ -259,8 +259,8 @@ 32.308046 -64.831785 - - + + Windward Gate 32.284680 @@ -270,8 +270,8 @@ 32.280164 -64.847591 - - + + Finish Line 32.317379 @@ -281,6 +281,6 @@ 32.317257 -64.836260 - + diff --git a/mock/src/test/java/seng302/Model/BoatTest.java b/mock/src/test/java/seng302/Model/BoatTest.java index 75b01939..2d112aad 100644 --- a/mock/src/test/java/seng302/Model/BoatTest.java +++ b/mock/src/test/java/seng302/Model/BoatTest.java @@ -13,23 +13,23 @@ public class BoatTest { private GPSCoordinate ORIGIN_COORDS = new GPSCoordinate(0, 0); - private Boat TEST_BOAT = new Boat("Test", 1, "tt", 1); + private Boat TEST_BOAT = new Boat(1, "Test", "tt"); @Test public void calculateDueNorthAzimuthReturns0() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 0, 1e-8); } @Test public void calculateDueSouthAzimuthReturns180() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 180, 1e-8); } @@ -38,9 +38,9 @@ public class BoatTest { @Test public void calculateDueEastAzimuthReturns90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 90, 1e-8); } @@ -48,9 +48,9 @@ public class BoatTest { @Test public void calculateDueWestAzimuthReturnsNegative90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), -90, 1e-8); @@ -59,9 +59,9 @@ public class BoatTest { @Test public void calculateDueNorthHeadingReturns0() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 0, 1e-8); } @@ -69,27 +69,27 @@ public class BoatTest { @Test public void calculateDueEastHeadingReturns90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 90, 1e-8); } @Test public void calculateDueSouthHeadingReturns180() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 180, 1e-8); } @Test public void calculateDueWestHeadingReturns270() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); + CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 270, 1e-8); } diff --git a/mock/src/test/java/seng302/Model/MarkerTest.java b/mock/src/test/java/seng302/Model/CompoundMarkerTest.java similarity index 76% rename from mock/src/test/java/seng302/Model/MarkerTest.java rename to mock/src/test/java/seng302/Model/CompoundMarkerTest.java index 168c222c..ef46de2c 100644 --- a/mock/src/test/java/seng302/Model/MarkerTest.java +++ b/mock/src/test/java/seng302/Model/CompoundMarkerTest.java @@ -8,14 +8,14 @@ import static org.junit.Assert.assertTrue; /** * Created by esa46 on 29/03/17. */ -public class MarkerTest { +public class CompoundMarkerTest { GPSCoordinate ORIGIN_COORD = new GPSCoordinate(0, 0); @Test public void averageOfSingleMarkAtOriginIsSingleMark() { - Marker testMark = new Marker(ORIGIN_COORD); + CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD); assertTrue(testMark.getAverageGPSCoordinate().equals(ORIGIN_COORD)); } @@ -24,7 +24,7 @@ public class MarkerTest { public void averageOfSingleMarkIsSingleMark() { GPSCoordinate testCoord = new GPSCoordinate(20, 25); - Marker testMark = new Marker(testCoord); + CompoundMarker testMark = new CompoundMarker(testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(testCoord)); } @@ -34,7 +34,7 @@ public class MarkerTest { public void averageLatOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(10, 0); - Marker testMark = new Marker(ORIGIN_COORD, testCoord); + CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(5, 0))); } @@ -42,7 +42,7 @@ public class MarkerTest { public void averageLongOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(0, 10); - Marker testMark = new Marker(ORIGIN_COORD, testCoord); + CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(0, 5))); } @@ -52,7 +52,7 @@ public class MarkerTest { GPSCoordinate testCoord1 = new GPSCoordinate(10, 30); GPSCoordinate testCoord2 = new GPSCoordinate(30, 60); - Marker testMark = new Marker(testCoord1, testCoord2); + CompoundMarker testMark = new CompoundMarker(testCoord1, testCoord2); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(020.644102, 44.014817))); } diff --git a/mock/src/test/java/seng302/Model/LegTest.java b/mock/src/test/java/seng302/Model/LegTest.java index b9d2e6bf..feccb9d3 100644 --- a/mock/src/test/java/seng302/Model/LegTest.java +++ b/mock/src/test/java/seng302/Model/LegTest.java @@ -14,7 +14,7 @@ import static junit.framework.TestCase.assertEquals; */ public class LegTest { - private Marker ORIGIN_MARKER = new Marker(new GPSCoordinate(0, 0)); + private CompoundMarker ORIGIN_Compound_MARKER = new CompoundMarker(new GPSCoordinate(0, 0)); @Test public void calculateDistanceHandles5nmNorth() { @@ -22,8 +22,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(0, 5 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); assertEquals(test.getDistance(), 5, 1e-8); } @@ -33,8 +33,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(90, 12 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); assertEquals(test.getDistance(), 12, 1e-8); } @@ -44,8 +44,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(180, 0.5 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); assertEquals(test.getDistance(), 0.5, 1e-8); } @@ -55,23 +55,23 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); assertEquals(test.getDistance(), 0.1, 1e-8); } @Test public void calculateDistanceHandlesZeroDifference() { - Leg test = new Leg("Test", ORIGIN_MARKER, ORIGIN_MARKER, 0); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, ORIGIN_Compound_MARKER, 0); assertEquals(test.getDistance(), 0, 1e-8); } - private Marker getEndMarker(Point2D point) { + private CompoundMarker getEndMarker(Point2D point) { GPSCoordinate coords = new GPSCoordinate(point.getY(), point.getX()); - return new Marker(coords); + return new CompoundMarker(coords); } } diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index bbac7680..ccf41621 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -28,8 +28,8 @@ //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); +// SharedModel.Leg START_LEG = new SharedModel.Leg("Start", new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(0, 0)), new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(1, 1)), 0); +// SharedModel.Leg FINISH_LEG = new SharedModel.Leg("Finish", new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(1, 1)), new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(2, 2)), 0); // //// @Override //// public void start(Stage primaryStage) throws Exception{} diff --git a/mock/src/test/java/seng302/Model/RaceXMLTest.java b/mock/src/test/java/seng302/Model/RaceXMLTest.java index bb06111d..6007bb56 100644 --- a/mock/src/test/java/seng302/Model/RaceXMLTest.java +++ b/mock/src/test/java/seng302/Model/RaceXMLTest.java @@ -37,23 +37,23 @@ public class RaceXMLTest { //test boat 2 assertEquals(boats.get(1).getName(), "Land Rover BAR"); assertTrue(boats.get(1).getVelocity() == 30); - assertEquals(boats.get(1).getAbbrev(), "GBR"); + assertEquals(boats.get(1).getCountry(), "GBR"); //test boat 3 assertEquals(boats.get(2).getName(), "SoftBank Team Japan"); assertTrue(boats.get(2).getVelocity() == 25); - assertEquals(boats.get(2).getAbbrev(), "JPN"); + assertEquals(boats.get(2).getCountry(), "JPN"); //test boat 4 assertEquals(boats.get(3).getName(), "Groupama Team France"); assertTrue(boats.get(3).getVelocity() == 20); - assertEquals(boats.get(3).getAbbrev(), "FRA"); + assertEquals(boats.get(3).getCountry(), "FRA"); //test boat 5 assertEquals(boats.get(4).getName(), "Artemis Racing"); assertTrue(boats.get(4).getVelocity() == 29); - assertEquals(boats.get(4).getAbbrev(), "SWE"); + assertEquals(boats.get(4).getCountry(), "SWE"); //test boat 6 assertEquals(boats.get(5).getName(), "Emirates Team New Zealand"); assertTrue(boats.get(5).getVelocity() == 62); - assertEquals(boats.get(5).getAbbrev(), "NZL"); + assertEquals(boats.get(5).getCountry(), "NZL"); } catch (Exception e) { fail("Boat Unreadable"); } diff --git a/mock/src/test/resources/raceXML/bermuda_AC35.xml b/mock/src/test/resources/raceXML/bermuda_AC35.xml index 27067d69..b1146af1 100644 --- a/mock/src/test/resources/raceXML/bermuda_AC35.xml +++ b/mock/src/test/resources/raceXML/bermuda_AC35.xml @@ -48,7 +48,7 @@ Start to Mark 1 - + 32.296577 -64.854304 @@ -57,29 +57,29 @@ 32.293771 -64.855242 - + - + 32.293039 -64.843983 - + Mark 1 to Leeward Gate - + 32.293039 -64.843983 - + - + 32.309693 -64.835249 @@ -88,13 +88,13 @@ 32.308046 -64.831785 - + Leeward Gate to Windward Gate - + 32.309693 -64.835249 @@ -103,10 +103,10 @@ 32.308046 -64.831785 - + - + 32.284680 -64.850045 @@ -115,13 +115,13 @@ 32.280164 -64.847591 - + Windward Gate to Leeward Gate - + 32.284680 -64.850045 @@ -130,10 +130,10 @@ 32.280164 -64.847591 - + - + 32.309693 -64.835249 @@ -142,13 +142,13 @@ 32.308046 -64.831785 - + Leeward Gate to Finish - + 32.309693 -64.835249 @@ -157,10 +157,10 @@ 32.308046 -64.831785 - + - + 32.317379 -64.839291 @@ -169,7 +169,7 @@ 32.317257 -64.836260 - + @@ -220,7 +220,7 @@ -64.849184 - + Start Line 32.296577 @@ -230,15 +230,15 @@ 32.293771 -64.855242 - - + + Mark 32.293039 -64.843983 - - + + Windward Gate 32.284680 @@ -248,8 +248,8 @@ 32.280164 -64.847591 - - + + Leeward Gate 32.309693 @@ -259,8 +259,8 @@ 32.308046 -64.831785 - - + + Finish Line 32.317379 @@ -270,6 +270,6 @@ 32.317257 -64.836260 - + diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 04c89cfc..1233b519 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -2,8 +2,8 @@ package seng302.Mock; import seng302.GPSCoordinate; import seng302.Model.Boat; +import seng302.Model.CompoundMark; import seng302.Model.Leg; -import seng302.Model.Marker; import seng302.RaceDataSource; import java.time.ZonedDateTime; @@ -82,7 +82,7 @@ public class StreamedCourse extends Observable implements RaceDataSource { return streamedCourseXMLReader.getLegs(); } - public List getMarkers() { return streamedCourseXMLReader.getMarkers(); } + public List getMarkers() { return streamedCourseXMLReader.getCompoundMarks(); } public List getBoundary() { return streamedCourseXMLReader.getBoundary(); diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java index ae07cd18..9a0a8f4b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java @@ -6,8 +6,8 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import seng302.GPSCoordinate; +import seng302.Model.CompoundMark; import seng302.Model.Leg; -import seng302.Model.Marker; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; @@ -25,10 +25,10 @@ public class StreamedCourseXMLReader extends XMLReader { private static final double COORDINATEPADDING = 0.000; private GPSCoordinate mapTopLeft, mapBottomRight; private final List boundary = new ArrayList<>(); - private final Map compoundMarks = new HashMap<>(); + private final Map compoundMarkMap = new HashMap<>(); private final Map participants = new HashMap<>(); private final List legs = new ArrayList<>(); - private final List markers = new ArrayList<>(); + private final List compoundMarks = new ArrayList<>(); private ZonedDateTime creationTimeDate; private ZonedDateTime raceStartTime; private int raceID; @@ -138,7 +138,7 @@ public class StreamedCourseXMLReader extends XMLReader { /** * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. - * @see seng302.Model.Marker + * @see CompoundMark */ private void readCompoundMarks() throws StreamedCourseXMLException { Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); @@ -146,27 +146,27 @@ public class StreamedCourseXMLReader extends XMLReader { Node compoundMark = nCourse.getChildNodes().item(i); if(compoundMark.getNodeName().equals("CompoundMark")) { int compoundMarkID = getCompoundMarkID((Element) compoundMark); - compoundMarks.put(compoundMarkID, (Element)compoundMark); - markers.add(getMarker(compoundMarkID)); + compoundMarkMap.put(compoundMarkID, (Element)compoundMark); + compoundMarks.add(getMarker(compoundMarkID)); } } } /** - * Generates a Marker from the CompoundMark element with given ID. + * Generates a CompoundMark from the CompoundMark element with given ID. * @param compoundMarkID index of required CompoundMark element - * @return generated Marker + * @return generated CompoundMark * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks - * @see seng302.Model.Marker + * @see CompoundMark */ - private Marker getMarker(int compoundMarkID) throws StreamedCourseXMLException { - Element compoundMark = compoundMarks.get(compoundMarkID); + private CompoundMark getMarker(int compoundMarkID) throws StreamedCourseXMLException { + Element compoundMark = compoundMarkMap.get(compoundMarkID); NodeList nMarks = compoundMark.getElementsByTagName("Mark"); - Marker marker; + CompoundMark marker; switch(nMarks.getLength()) { - case 1: marker = new Marker(getCoordinate((Element)nMarks.item(0))); break; - case 2: marker = new Marker(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1))); break; + case 1: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0))); break; + case 2: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1))); break; default: throw new StreamedCourseXMLException(); } @@ -194,24 +194,24 @@ public class StreamedCourseXMLReader extends XMLReader { * @return value of "name" attribute */ private String getCompoundMarkName(int compoundMarkID) { - return compoundMarks.get(compoundMarkID).getAttribute("Name"); + return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); } /** * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. - * @throws StreamedCourseXMLException if markers cannot be resolved from CompoundMark + * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark */ private void readCompoundMarkSequence() throws StreamedCourseXMLException { Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); Element markXML = (Element)nCorners.item(0); - Marker lastMarker = getMarker(getCompoundMarkID(markXML)); + CompoundMark lastCompoundMark = getMarker(getCompoundMarkID(markXML)); String legName = getCompoundMarkName(getCompoundMarkID(markXML)); for(int i = 1; i < nCorners.getLength(); i++) { markXML = (Element)nCorners.item(i); - Marker currentMarker = getMarker(getCompoundMarkID(markXML)); - legs.add(new Leg(legName, lastMarker, currentMarker, i-1)); - lastMarker = currentMarker; + CompoundMark currentCompoundMark = getMarker(getCompoundMarkID(markXML)); + legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); + lastCompoundMark = currentCompoundMark; legName = getCompoundMarkName(getCompoundMarkID(markXML)); } } @@ -253,7 +253,7 @@ public class StreamedCourseXMLReader extends XMLReader { return legs; } - public List getMarkers() { return markers; } + public List getCompoundMarks() { return compoundMarks; } public Double getPadding() { return COORDINATEPADDING; diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index ed1c7bf5..c84ac8cd 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -4,7 +4,7 @@ import seng302.Controllers.RaceController; import seng302.GPSCoordinate; import seng302.Model.Boat; import seng302.Model.Leg; -import seng302.Model.Marker; +import seng302.Model.CompoundMark; import seng302.Model.Race; import seng302.Networking.Messages.BoatLocation; import seng302.Networking.Messages.BoatStatus; @@ -25,13 +25,13 @@ public class StreamedRace extends Race { public void initialiseBoats() { Leg officialStart = legs.get(0); String name = officialStart.getName(); - Marker endMarker = officialStart.getEndMarker(); + CompoundMark endCompoundMark = officialStart.getEndCompoundMark(); for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get(i); if (boat != null) { Leg startLeg = new Leg(name, 0); - startLeg.setEndMarker(endMarker); + startLeg.setEndCompoundMark(endCompoundMark); boat.setCurrentLeg(startLeg); } } diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 05c58017..3afc5e08 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -72,8 +72,8 @@ public class BoatInRace extends Boat { public double calculateAzimuth() { GeodeticCalculator calc = new GeodeticCalculator(); - GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate(); - GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate(); + GPSCoordinate start = currentLeg.getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate end = currentLeg.getEndCompoundMark().getAverageGPSCoordinate(); calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude()); calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude()); diff --git a/visualiser/src/main/java/seng302/Model/Marker.java b/visualiser/src/main/java/seng302/Model/CompoundMark.java similarity index 92% rename from visualiser/src/main/java/seng302/Model/Marker.java rename to visualiser/src/main/java/seng302/Model/CompoundMark.java index 8b432d70..6e635dde 100644 --- a/visualiser/src/main/java/seng302/Model/Marker.java +++ b/visualiser/src/main/java/seng302/Model/CompoundMark.java @@ -8,12 +8,12 @@ import java.awt.geom.Point2D; /** * Created by esa46 on 29/03/17. */ -public class Marker { +public class CompoundMark { private final GPSCoordinate averageGPSCoordinate; private final GPSCoordinate mark1; private final GPSCoordinate mark2; - public Marker(GPSCoordinate mark1) { + public CompoundMark(GPSCoordinate mark1) { this.mark1 = mark1; this.mark2 = mark1; @@ -21,7 +21,7 @@ public class Marker { } - public Marker(GPSCoordinate mark1, GPSCoordinate mark2) { + public CompoundMark(GPSCoordinate mark1, GPSCoordinate mark2) { this.mark1 = mark1; this.mark2 = mark2; diff --git a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java index fefc0755..79b76dbc 100644 --- a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -60,19 +60,19 @@ // public void initialiseBoats() { // Leg officialStart = legs.get(0); // String name = officialStart.getName(); -// Marker endMarker = officialStart.getEndMarker(); +// CompoundMark endMarker = officialStart.getEndCompoundMark(); // // BoatInRace.setTrackPointTimeInterval(BoatInRace.getBaseTrackPointTimeInterval() / scaleFactor); // -// ArrayList startMarkers = getSpreadStartingPositions(); +// ArrayList startMarkers = getSpreadStartingPositions(); // for (int i = 0; i < startingBoats.size(); i++) { // BoatInRace boat = startingBoats.get(i); // if (boat != null) { // boat.setScaledVelocity(boat.getVelocity() * scaleFactor); // Leg startLeg = new Leg(name, 0); // boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); -// startLeg.setStartMarker(startMarkers.get(i)); -// startLeg.setEndMarker(endMarker); +// startLeg.setStartCompoundMark(startMarkers.get(i)); +// startLeg.setEndCompoundMark(endMarker); // startLeg.calculateDistance(); // boat.setCurrentLeg(startLeg); // boat.setHeading(boat.calculateHeading()); @@ -85,10 +85,10 @@ // * // * @return list of starting positions // */ -// public ArrayList getSpreadStartingPositions() { +// public ArrayList getSpreadStartingPositions() { // // int nBoats = startingBoats.size(); -// Marker marker = legs.get(0).getStartMarker(); +// CompoundMark marker = legs.get(0).getStartCompoundMark(); // // GeodeticCalculator initialCalc = new GeodeticCalculator(); // initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); @@ -100,12 +100,12 @@ // // GeodeticCalculator positionCalc = new GeodeticCalculator(); // positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); -// ArrayList positions = new ArrayList<>(); +// ArrayList positions = new ArrayList<>(); // // for (int i = 0; i < nBoats; i++) { // positionCalc.setDirection(azimuth, distanceBetweenBoats); // Point2D position = positionCalc.getDestinationGeographicPoint(); -// positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); +// positions.add(new CompoundMark(new GPSCoordinate(position.getY(), position.getX()))); // // positionCalc = new GeodeticCalculator(); // positionCalc.setStartingGeographicPoint(position); @@ -147,7 +147,7 @@ // //update boat's distance travelled // boat.setDistanceTravelledInLeg(totalDistanceTravelled); // //Calculate boat's new position by adding the distance travelled onto the start point of the leg -// boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), +// boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartCompoundMark().getAverageGPSCoordinate(), // totalDistanceTravelled, boat.calculateAzimuth())); // } // } diff --git a/visualiser/src/main/java/seng302/Model/Leg.java b/visualiser/src/main/java/seng302/Model/Leg.java index fd596704..82f2024e 100644 --- a/visualiser/src/main/java/seng302/Model/Leg.java +++ b/visualiser/src/main/java/seng302/Model/Leg.java @@ -10,8 +10,8 @@ import seng302.GPSCoordinate; public class Leg { private final String name; //nautical miles private double distance; - private Marker startMarker; - private Marker endMarker; + private CompoundMark startCompoundMark; + private CompoundMark endCompoundMark; private final int legNumber; /** @@ -22,10 +22,10 @@ public class Leg { * @param end marker * @param number Leg's position in race */ - public Leg(String name, Marker start, Marker end, int number) { + public Leg(String name, CompoundMark start, CompoundMark end, int number) { this.name = name; - this.startMarker = start; - this.endMarker = end; + this.startCompoundMark = start; + this.endCompoundMark = end; this.legNumber = number; calculateDistance(); } @@ -70,20 +70,20 @@ public class Leg { } - public Marker getStartMarker() { - return startMarker; + public CompoundMark getStartCompoundMark() { + return startCompoundMark; } - public void setStartMarker(Marker startMarker) { - this.startMarker = startMarker; + public void setStartCompoundMark(CompoundMark startCompoundMark) { + this.startCompoundMark = startCompoundMark; } - public Marker getEndMarker() { - return endMarker; + public CompoundMark getEndCompoundMark() { + return endCompoundMark; } - public void setEndMarker(Marker endMarker) { - this.endMarker = endMarker; + public void setEndCompoundMark(CompoundMark endCompoundMark) { + this.endCompoundMark = endCompoundMark; } /** @@ -93,8 +93,8 @@ public class Leg { GeodeticCalculator calc = new GeodeticCalculator(); //Load start and end of leg - GPSCoordinate startMarker = this.startMarker.getAverageGPSCoordinate(); - GPSCoordinate endMarker = this.endMarker.getAverageGPSCoordinate(); + GPSCoordinate startMarker = this.startCompoundMark.getAverageGPSCoordinate(); + GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate(); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion; diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 2b793da9..be569b60 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -28,7 +28,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { private boolean annoSpeed = true; private boolean annoPath = true; private List colours; - private final List markers; + private final List compoundMarks; double[] xpoints = {}, ypoints = {}; private final RaceDataSource raceData; @@ -42,7 +42,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { setMap(new RaceMap(lat1, long1, lat2, long2, (int) getWidth(), (int) getHeight())); - this.markers = raceData.getMarkers(); + this.compoundMarks = raceData.getMarkers(); makeColours(); this.raceData = raceData; } @@ -201,15 +201,15 @@ public class ResizableRaceCanvas extends ResizableCanvas { } /** - * Draw race markers + * Draw race compoundMarks */ private void drawMarkers() { - for(Marker marker: markers) { - GraphCoordinate mark1 = this.map.convertGPS(marker.getMark1()); + for(CompoundMark compoundMark : compoundMarks) { + GraphCoordinate mark1 = this.map.convertGPS(compoundMark.getMark1()); // removed drawing of lines between the marks as only // the start and finish line should have a line drawn - if(marker.isCompoundMark()) { - GraphCoordinate mark2 = this.map.convertGPS(marker.getMark2()); + if(compoundMark.isCompoundMark()) { + GraphCoordinate mark2 = this.map.convertGPS(compoundMark.getMark2()); displayPoint(mark1, Color.LIMEGREEN); displayPoint(mark2, Color.LIMEGREEN); } else { diff --git a/visualiser/src/main/java/seng302/RaceDataSource.java b/visualiser/src/main/java/seng302/RaceDataSource.java index 5f2e52ad..a4aba9e6 100644 --- a/visualiser/src/main/java/seng302/RaceDataSource.java +++ b/visualiser/src/main/java/seng302/RaceDataSource.java @@ -1,8 +1,8 @@ package seng302; import seng302.Model.Boat; +import seng302.Model.CompoundMark; import seng302.Model.Leg; -import seng302.Model.Marker; import java.time.ZonedDateTime; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; public interface RaceDataSource { List getBoats(); List getLegs(); - List getMarkers(); + List getMarkers(); List getBoundary(); ZonedDateTime getZonedDateTime(); diff --git a/visualiser/src/main/java/seng302/RaceXMLReader.java b/visualiser/src/main/java/seng302/RaceXMLReader.java index ddab0b27..d615ddeb 100644 --- a/visualiser/src/main/java/seng302/RaceXMLReader.java +++ b/visualiser/src/main/java/seng302/RaceXMLReader.java @@ -89,10 +89,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { for (int i = 0; i < nLegs.getLength(); i++) { String label = getTextValueOfNode((Element) nLegs.item(i), "name"); NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - Marker startMarker = getMarker(start); + CompoundMark startCompoundMark = getMarker(start); NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - Marker finishMarker = getMarker(finish); - legs.add(new Leg(label, startMarker, finishMarker, i)); + CompoundMark finishCompoundMark = getMarker(finish); + legs.add(new Leg(label, startCompoundMark, finishCompoundMark, i)); } } @@ -172,7 +172,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param start base nodelist this should be the tag that contains * @return */ - private Marker getMarker(NodeList start) { + private CompoundMark getMarker(NodeList start) { return getMarker(start, 0); } @@ -182,7 +182,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param startIndex index in the node that has the coordinate tag * @return */ - private Marker getMarker(NodeList start, int startIndex) { + private CompoundMark getMarker(NodeList start, int startIndex) { return getMarker(start, startIndex, 0); } @@ -193,7 +193,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param nodeIndex coordinate index * @return */ - private Marker getMarker(NodeList start, int startIndex, int nodeIndex) { + private CompoundMark getMarker(NodeList start, int startIndex, int nodeIndex) { NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); Element marker = (Element) nodeList.item(nodeIndex); return getMarker(marker); @@ -204,7 +204,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param markerNode marker to turn into coordinates * @return */ - private Marker getMarker(Element markerNode) { + private CompoundMark getMarker(Element markerNode) { NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); @@ -215,7 +215,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { } else { side2 = side1; } - return new Marker(side1, side2); + return new CompoundMark(side1, side2); } @@ -265,7 +265,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { } @Override - public List getMarkers() { + public List getMarkers() { return null; } diff --git a/visualiser/src/main/resources/raceXML/bermuda_AC35.xml b/visualiser/src/main/resources/raceXML/bermuda_AC35.xml index ac75539e..943784ea 100644 --- a/visualiser/src/main/resources/raceXML/bermuda_AC35.xml +++ b/visualiser/src/main/resources/raceXML/bermuda_AC35.xml @@ -42,7 +42,7 @@ Start to Mark 1 - + 32.296577 -64.854304 @@ -51,29 +51,29 @@ 32.293771 -64.855242 - + - + 32.293039 -64.843983 - + Mark 1 to Leeward Gate - + 32.293039 -64.843983 - + - + 32.309693 -64.835249 @@ -82,13 +82,13 @@ 32.308046 -64.831785 - + Leeward Gate to Windward Gate - + 32.309693 -64.835249 @@ -97,10 +97,10 @@ 32.308046 -64.831785 - + - + 32.284680 -64.850045 @@ -109,13 +109,13 @@ 32.280164 -64.847591 - + Windward Gate to Leeward Gate - + 32.284680 -64.850045 @@ -124,10 +124,10 @@ 32.280164 -64.847591 - + - + 32.309693 -64.835249 @@ -136,13 +136,13 @@ 32.308046 -64.831785 - + Leeward Gate to Finish - + 32.309693 -64.835249 @@ -151,10 +151,10 @@ 32.308046 -64.831785 - + - + 32.317379 -64.839291 @@ -163,7 +163,7 @@ 32.317257 -64.836260 - + @@ -214,7 +214,7 @@ -64.849184 - + Start Line 32.296577 @@ -224,15 +224,15 @@ 32.293771 -64.855242 - - + + Mark 32.293039 -64.843983 - - + + Windward Gate 32.284680 @@ -242,8 +242,8 @@ 32.280164 -64.847591 - - + + Leeward Gate 32.309693 @@ -253,8 +253,8 @@ 32.308046 -64.831785 - - + + Finish Line 32.317379 @@ -264,6 +264,6 @@ 32.317257 -64.836260 - + diff --git a/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java b/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java index 946f9d93..98a1f986 100644 --- a/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java +++ b/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java @@ -5,7 +5,7 @@ import org.junit.Ignore; import org.junit.Test; import seng302.GPSCoordinate; import seng302.Model.Leg; -import seng302.Model.Marker; +import seng302.Model.CompoundMark; import java.util.List; @@ -87,8 +87,8 @@ public class StreamedRaceTest { GPSCoordinate topLeft = streamedCourseXMLReader.getMapTopLeft(); GPSCoordinate bottomRight = streamedCourseXMLReader.getMapBottomRight(); - for(Marker marker: streamedCourseXMLReader.getMarkers()) { - GPSCoordinate centre = marker.getAverageGPSCoordinate(); + for(CompoundMark compoundMark : streamedCourseXMLReader.getCompoundMarks()) { + GPSCoordinate centre = compoundMark.getAverageGPSCoordinate(); assertTrue(centre.getLatitude() < bottomRight.getLatitude()); assertTrue(centre.getLatitude() > topLeft.getLatitude()); assertTrue(centre.getLongitude() > bottomRight.getLongitude()); diff --git a/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java b/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java index 029a0f43..a761bac9 100644 --- a/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java +++ b/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java @@ -19,18 +19,18 @@ public class BoatInRaceTest { @Test public void calculateDueNorthAzimuthReturns0() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 0, 1e-8); } @Test public void calculateDueSouthAzimuthReturns180() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 180, 1e-8); } @@ -39,9 +39,9 @@ public class BoatInRaceTest { @Test public void calculateDueEastAzimuthReturns90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 90, 1e-8); } @@ -49,9 +49,9 @@ public class BoatInRaceTest { @Test public void calculateDueWestAzimuthReturnsNegative90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), -90, 1e-8); @@ -60,9 +60,9 @@ public class BoatInRaceTest { @Test public void calculateDueNorthHeadingReturns0() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 0, 1e-8); } @@ -70,27 +70,27 @@ public class BoatInRaceTest { @Test public void calculateDueEastHeadingReturns90() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 90, 1e-8); } @Test public void calculateDueSouthHeadingReturns180() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 180, 1e-8); } @Test public void calculateDueWestHeadingReturns270() { - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 270, 1e-8); } @@ -117,16 +117,16 @@ public class BoatInRaceTest { BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); // Construct leg of 0 degrees - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg leg0deg = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); + Leg leg0deg = new Leg("Start", startCompoundMark, endCompoundMark, 0); boat.setCurrentLeg(leg0deg); boat.setCurrentPosition(new GPSCoordinate(0, 0)); assertEquals(0, boat.calculateHeading(), 1e-8); // Construct leg from wake - heading should be 180 degrees - Leg leg180deg = new Leg("Start", startMarker, new Marker(boat.getWake()), 0); + Leg leg180deg = new Leg("Start", startCompoundMark, new CompoundMark(boat.getWake()), 0); boat.setCurrentLeg(leg180deg); assertEquals(180, boat.calculateHeading(), 1e-8); @@ -138,9 +138,9 @@ public class BoatInRaceTest { BoatInRace boat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); // Construct leg of 0 degrees at 0 N - Marker startMarker = new Marker(ORIGIN_COORDS); - Marker endMarker = new Marker(new GPSCoordinate(50, 0)); - Leg leg0deg = new Leg("Start", startMarker, endMarker, 0); + CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); + CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); + Leg leg0deg = new Leg("Start", startCompoundMark, endCompoundMark, 0); boat.setCurrentLeg(leg0deg); boat.setCurrentPosition(new GPSCoordinate(0, 0)); diff --git a/visualiser/src/test/java/seng302/Model/MarkerTest.java b/visualiser/src/test/java/seng302/Model/CompoundMarkTest.java similarity index 77% rename from visualiser/src/test/java/seng302/Model/MarkerTest.java rename to visualiser/src/test/java/seng302/Model/CompoundMarkTest.java index 420c5eff..9323a5ea 100644 --- a/visualiser/src/test/java/seng302/Model/MarkerTest.java +++ b/visualiser/src/test/java/seng302/Model/CompoundMarkTest.java @@ -8,14 +8,14 @@ import static org.junit.Assert.assertTrue; /** * Created by esa46 on 29/03/17. */ -public class MarkerTest { +public class CompoundMarkTest { private final GPSCoordinate ORIGIN_COORD = new GPSCoordinate(0, 0); @Test public void averageOfSingleMarkAtOriginIsSingleMark() { - Marker testMark = new Marker(ORIGIN_COORD); + CompoundMark testMark = new CompoundMark(ORIGIN_COORD); assertTrue(testMark.getAverageGPSCoordinate().equals(ORIGIN_COORD)); } @@ -24,7 +24,7 @@ public class MarkerTest { public void averageOfSingleMarkIsSingleMark() { GPSCoordinate testCoord = new GPSCoordinate(20, 25); - Marker testMark = new Marker(testCoord); + CompoundMark testMark = new CompoundMark(testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(testCoord)); } @@ -33,7 +33,7 @@ public class MarkerTest { public void averageLatOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(10, 0); - Marker testMark = new Marker(ORIGIN_COORD, testCoord); + CompoundMark testMark = new CompoundMark(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(5, 0))); } @@ -41,7 +41,7 @@ public class MarkerTest { public void averageLongOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(0, 10); - Marker testMark = new Marker(ORIGIN_COORD, testCoord); + CompoundMark testMark = new CompoundMark(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(0, 5))); } @@ -50,7 +50,7 @@ public class MarkerTest { GPSCoordinate testCoord1 = new GPSCoordinate(10, 30); GPSCoordinate testCoord2 = new GPSCoordinate(30, 60); - Marker testMark = new Marker(testCoord1, testCoord2); + CompoundMark testMark = new CompoundMark(testCoord1, testCoord2); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(020.644102, 44.014817))); } diff --git a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java index 3094dad4..4985c69f 100644 --- a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java +++ b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java @@ -17,8 +17,8 @@ // */ //public class ConstantVelocityRaceTest { // -// Marker START_MARKER = new Marker(new GPSCoordinate(0, 0)); -// Marker END_MARKER = new Marker(new GPSCoordinate(10, 10)); +// CompoundMark START_MARKER = new CompoundMark(new GPSCoordinate(0, 0)); +// CompoundMark END_MARKER = new CompoundMark(new GPSCoordinate(10, 10)); // Leg START_LEG = new Leg("Start", START_MARKER, END_MARKER, 0); // // int ONE_HOUR = 3600000; //1 hour in milliseconds diff --git a/visualiser/src/test/java/seng302/Model/LegTest.java b/visualiser/src/test/java/seng302/Model/LegTest.java index 470d3168..bba971ae 100644 --- a/visualiser/src/test/java/seng302/Model/LegTest.java +++ b/visualiser/src/test/java/seng302/Model/LegTest.java @@ -14,7 +14,7 @@ import static junit.framework.TestCase.assertEquals; */ public class LegTest { - private final Marker ORIGIN_MARKER = new Marker(new GPSCoordinate(0, 0)); + private final CompoundMark ORIGIN_CompoundMark = new CompoundMark(new GPSCoordinate(0, 0)); @Test public void calculateDistanceHandles5nmNorth() { @@ -22,8 +22,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(0, 5 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); assertEquals(test.getDistance(), 5, 1e-8); } @@ -33,8 +33,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(90, 12 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); assertEquals(test.getDistance(), 12, 1e-8); } @@ -44,8 +44,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(180, 0.5 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); assertEquals(test.getDistance(), 0.5, 1e-8); } @@ -55,23 +55,23 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion); - Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_MARKER, endMarker, 0); + CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); assertEquals(test.getDistance(), 0.1, 1e-8); } @Test public void calculateDistanceHandlesZeroDifference() { - Leg test = new Leg("Test", ORIGIN_MARKER, ORIGIN_MARKER, 0); + Leg test = new Leg("Test", ORIGIN_CompoundMark, ORIGIN_CompoundMark, 0); assertEquals(test.getDistance(), 0, 1e-8); } - private Marker getEndMarker(Point2D point) { + private CompoundMark getEndMarker(Point2D point) { GPSCoordinate coords = new GPSCoordinate(point.getY(), point.getX()); - return new Marker(coords); + return new CompoundMark(coords); } } diff --git a/visualiser/src/test/resources/raceXML/bermuda_AC35.xml b/visualiser/src/test/resources/raceXML/bermuda_AC35.xml index 716f274b..b1b3a3b0 100644 --- a/visualiser/src/test/resources/raceXML/bermuda_AC35.xml +++ b/visualiser/src/test/resources/raceXML/bermuda_AC35.xml @@ -41,7 +41,7 @@ Start to Mark 1 - + 32.296577 -64.854304 @@ -50,29 +50,29 @@ 32.293771 -64.855242 - + - + 32.293039 -64.843983 - + Mark 1 to Leeward Gate - + 32.293039 -64.843983 - + - + 32.309693 -64.835249 @@ -81,13 +81,13 @@ 32.308046 -64.831785 - + Leeward Gate to Windward Gate - + 32.309693 -64.835249 @@ -96,10 +96,10 @@ 32.308046 -64.831785 - + - + 32.284680 -64.850045 @@ -108,13 +108,13 @@ 32.280164 -64.847591 - + Windward Gate to Leeward Gate - + 32.284680 -64.850045 @@ -123,10 +123,10 @@ 32.280164 -64.847591 - + - + 32.309693 -64.835249 @@ -135,13 +135,13 @@ 32.308046 -64.831785 - + Leeward Gate to Finish - + 32.309693 -64.835249 @@ -150,10 +150,10 @@ 32.308046 -64.831785 - + - + 32.317379 -64.839291 @@ -162,7 +162,7 @@ 32.317257 -64.836260 - + @@ -213,7 +213,7 @@ -64.849184 - + Start Line 32.296577 @@ -223,15 +223,15 @@ 32.293771 -64.855242 - - + + Mark 32.293039 -64.843983 - - + + Windward Gate 32.284680 @@ -241,8 +241,8 @@ 32.280164 -64.847591 - - + + Leeward Gate 32.309693 @@ -252,8 +252,8 @@ 32.308046 -64.831785 - - + + Finish Line 32.317379 @@ -263,6 +263,6 @@ 32.317257 -64.836260 - + From 9902cec688bc43a2d61b9fe151c6721b683f088e Mon Sep 17 00:00:00 2001 From: cbt24 Date: Wed, 10 May 2017 14:23:33 +1200 Subject: [PATCH 06/23] Added tests for BoatXMLReader - Verifies correct operation on boat and mark reading from boatTest.xml #story[782] --- .../java/seng302/DataInput/BoatXMLReader.java | 8 +-- mock/src/main/java/seng302/Model/Mark.java | 4 ++ .../seng302/DataInput/BoatXMLReaderTest.java | 57 +++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java diff --git a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java index 2d909bfd..5d9524c6 100644 --- a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java @@ -80,14 +80,14 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource { */ private void readSingleBoat(Node boatNode) { Boat boat; - String country = null; + int sourceID = Integer.parseInt(boatNode.getAttributes().getNamedItem("SourceID").getTextContent()); String name = boatNode.getAttributes().getNamedItem("BoatName").getTextContent(); - String shortName = boatNode.getAttributes().getNamedItem("ShortName").getTextContent(); - if (exists(boatNode, "Country")) country = boatNode.getAttributes().getNamedItem("Country").getTextContent(); if (isYachtNode(boatNode)) { - if (country != null) { + String shortName = boatNode.getAttributes().getNamedItem("ShortName").getTextContent(); + if (exists(boatNode, "Country")) { + String country = boatNode.getAttributes().getNamedItem("Country").getTextContent(); boat = new Boat(sourceID, name, country); } else { boat = new Boat(sourceID, name, shortName); diff --git a/mock/src/main/java/seng302/Model/Mark.java b/mock/src/main/java/seng302/Model/Mark.java index ef9f38f5..36d7bdf2 100644 --- a/mock/src/main/java/seng302/Model/Mark.java +++ b/mock/src/main/java/seng302/Model/Mark.java @@ -9,4 +9,8 @@ public class Mark { public Mark(String name) { this.name = name; } + + public String getName() { + return name; + } } diff --git a/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java b/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java new file mode 100644 index 00000000..53689e38 --- /dev/null +++ b/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java @@ -0,0 +1,57 @@ +package seng302.DataInput; + +import org.junit.Before; +import org.junit.Test; +import org.xml.sax.SAXException; +import seng302.Model.Boat; +import seng302.Model.Mark; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.List; + +import static org.testng.Assert.*; + +/** + * Created by cbt24 on 10/05/17. + */ +public class BoatXMLReaderTest { + BoatDataSource boatData; + List boats; + List marks; + + @Before + public void setUp() { + try { + boatData = new BoatXMLReader("mockXML/boatTest.xml"); + boats = boatData.getBoats(); + marks = boatData.getMarkerBoats(); + } 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()); + } + } +} \ No newline at end of file From f31a98778753379449526ca389d5b3674f76f864 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Wed, 10 May 2017 16:56:21 +1200 Subject: [PATCH 07/23] Reads BoatDataSource into StreamedCourseXMLReader so the latter can function as a single source of static information for the race. - Mock.StreamedCourseXMLReader populates participant and mark list from BoatDataSource - Added CompoundMarker class to accommodate Mark data from Boat XML - Had to check for Yacht type in Visualiser.BoatXMLReader - Added a missing coordinate value to raceTest.xml - Marker class still exists due to large number of tests, which should be transitioned to CompoundMark - IMPORTANT: race is no longer functional #story[881] --- mock/src/main/java/seng302/App.java | 9 +- mock/src/main/java/seng302/Data/RaceData.java | 20 +- .../seng302/DataInput/BoatDataSource.java | 6 +- .../java/seng302/DataInput/BoatXMLReader.java | 46 +-- .../seng302/DataInput/RaceDataSource.java | 7 +- .../java/seng302/DataInput/RaceXMLReader.java | 38 +-- mock/src/main/java/seng302/Model/Boat.java | 4 +- .../main/java/seng302/Model/CompoundMark.java | 71 +++++ mock/src/main/java/seng302/Model/Event.java | 2 +- mock/src/main/java/seng302/Model/Leg.java | 30 +- mock/src/main/java/seng302/Model/Mark.java | 14 +- .../{CompoundMarker.java => Marker.java} | 10 +- mock/src/main/java/seng302/Model/Race.java | 27 +- .../Model/StreamedCourseXMLException.java | 7 + .../Model/StreamedCourseXMLReader.java | 274 ++++++++++++++++++ mock/src/main/resources/mockXML/raceTest.xml | 2 +- .../seng302/DataInput/BoatXMLReaderTest.java | 5 +- .../src/test/java/seng302/Model/BoatTest.java | 48 +-- ...dMarkerTest.java => CompoundMarkTest.java} | 12 +- mock/src/test/java/seng302/Model/LegTest.java | 22 +- .../src/test/java/seng302/Model/RaceTest.java | 4 +- .../main/java/seng302/Mock/BoatXMLReader.java | 2 +- 22 files changed, 518 insertions(+), 142 deletions(-) create mode 100644 mock/src/main/java/seng302/Model/CompoundMark.java rename mock/src/main/java/seng302/Model/{CompoundMarker.java => Marker.java} (88%) create mode 100644 mock/src/main/java/seng302/Model/StreamedCourseXMLException.java create mode 100644 mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java rename mock/src/test/java/seng302/Model/{CompoundMarkerTest.java => CompoundMarkTest.java} (76%) diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index de74be36..40077276 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -6,6 +6,8 @@ import javafx.stage.Stage; import org.xml.sax.SAXException; import seng302.DataInput.*; import seng302.Model.Event; +import seng302.Model.StreamedCourseXMLException; +import seng302.Model.StreamedCourseXMLReader; import javax.xml.parsers.ParserConfigurationException; @@ -13,6 +15,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; +import java.text.ParseException; public class App extends Application { @@ -35,9 +38,9 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - RaceDataSource raceData = new RaceXMLReader("mockXML/raceTest.xml"); RegattaDataSource regattaData = new RegattaXMLReader("mockXML/regattaTest.xml"); BoatDataSource boatData = new BoatXMLReader("mockXML/boatTest.xml"); + RaceDataSource raceData = new StreamedCourseXMLReader("mockXML/raceTest.xml", boatData); Event raceEvent = new Event(raceData, regattaData, boatData); raceEvent.start(); } catch (IOException e) { @@ -46,6 +49,10 @@ public class App extends Application { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (StreamedCourseXMLException e) { + e.printStackTrace(); } } } diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java index bc502d44..cabc5471 100644 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ b/mock/src/main/java/seng302/Data/RaceData.java @@ -5,7 +5,7 @@ import org.w3c.dom.Element; import seng302.DataInput.RaceDataSource; import seng302.Exceptions.InvalidRaceDataException; import seng302.Model.Boat; -import seng302.Model.CompoundMarker; +import seng302.Model.CompoundMark; import seng302.Model.GPSCoordinate; import javax.xml.parsers.DocumentBuilder; @@ -151,9 +151,9 @@ public class RaceData { Element compoundMarkSeqElement = doc.createElement("CompoundMarkSequence"); int i = 1; - for (CompoundMarker compoundMarker : dataSource.getCompoundMarkers()) { + for (CompoundMark compoundMark : dataSource.getCompoundMarks()) { - courseElement.appendChild(createCompoundMarker(compoundMarker, i)); + courseElement.appendChild(createCompoundMarker(compoundMark, i)); compoundMarkSeqElement.appendChild(createCornerElement(i)); i++; } @@ -177,21 +177,21 @@ public class RaceData { } /** - * Creates a compound compoundMarker holding one or two marks,and a sequence number + * Creates a compound compoundMark holding one or two marks,and a sequence number * - * @param compoundMarker compoundMarker + * @param compoundMark compoundMark * @param i sequence number * @return Element compound mark element */ - private Element createCompoundMarker(CompoundMarker compoundMarker, int i) { + private Element createCompoundMarker(CompoundMark compoundMark, int i) { Element compoundMarkElement = doc.createElement("CompoundMark"); compoundMarkElement.setAttribute("CompoundMarkID", i + ""); - compoundMarkElement.setAttribute("Name", compoundMarker.getName()); + compoundMarkElement.setAttribute("Name", compoundMark.getName()); - compoundMarkElement.appendChild(createMark(compoundMarker.getMark1())); + compoundMarkElement.appendChild(createMark(compoundMark.getMark1())); - if (!(compoundMarker.getMark1().equals(compoundMarker.getMark2()))) { - compoundMarkElement.appendChild(createMark(compoundMarker.getMark2())); + if (!(compoundMark.getMark1().equals(compoundMark.getMark2()))) { + compoundMarkElement.appendChild(createMark(compoundMark.getMark2())); } return compoundMarkElement; diff --git a/mock/src/main/java/seng302/DataInput/BoatDataSource.java b/mock/src/main/java/seng302/DataInput/BoatDataSource.java index 73b0a0cc..d8ecfaf2 100644 --- a/mock/src/main/java/seng302/DataInput/BoatDataSource.java +++ b/mock/src/main/java/seng302/DataInput/BoatDataSource.java @@ -3,12 +3,12 @@ package seng302.DataInput; import seng302.Model.Boat; import seng302.Model.Mark; -import java.util.List; +import java.util.Map; /** * Created by cbt24 on 10/05/17. */ public interface BoatDataSource { - List getBoats(); - List getMarkerBoats(); + Map getBoats(); + Map getMarkerBoats(); } diff --git a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java index 5d9524c6..39f6b13e 100644 --- a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java @@ -4,13 +4,12 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.SAXException; import seng302.Model.Boat; +import seng302.Model.GPSCoordinate; import seng302.Model.Mark; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -51,7 +50,7 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource { for (int i = 0; i < nBoats.getChildNodes().getLength(); i++) { Node boat = nBoats.getChildNodes().item(i); if (boat.getNodeName().equals("Boat")) { - readSingleBoat(boat); + readBoatNode(boat); } } } @@ -78,34 +77,39 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource { * Reads the information about one boat * Ignored values: ShapeID, StoweName, HullNum, Skipper, Type */ - private void readSingleBoat(Node boatNode) { - Boat boat; - + private void readBoatNode(Node boatNode) { int sourceID = Integer.parseInt(boatNode.getAttributes().getNamedItem("SourceID").getTextContent()); String name = boatNode.getAttributes().getNamedItem("BoatName").getTextContent(); - if (isYachtNode(boatNode)) { - String shortName = boatNode.getAttributes().getNamedItem("ShortName").getTextContent(); - if (exists(boatNode, "Country")) { - String country = boatNode.getAttributes().getNamedItem("Country").getTextContent(); - boat = new Boat(sourceID, name, country); - } else { - boat = new Boat(sourceID, name, shortName); - } - boatMap.put(sourceID, boat); + if (isYachtNode(boatNode)) readYacht(boatNode, sourceID, name); + else readMark(boatNode, sourceID, name); + } + + private void readYacht(Node boatNode, int sourceID, String name) { + String shortName = boatNode.getAttributes().getNamedItem("ShortName").getTextContent(); + if (exists(boatNode, "Country")) { + String country = boatNode.getAttributes().getNamedItem("Country").getTextContent(); + boatMap.put(sourceID, new Boat(sourceID, name, country)); } else { - Mark mark = new Mark(name); - markerMap.put(sourceID, mark); + boatMap.put(sourceID, new Boat(sourceID, name, shortName)); } } + private void readMark(Node boatNode, int sourceID, String name) { + Node nCoord = ((Element)boatNode).getElementsByTagName("GPSposition").item(0); + double x = Double.parseDouble(nCoord.getAttributes().getNamedItem("X").getTextContent()); + double y = Double.parseDouble(nCoord.getAttributes().getNamedItem("Y").getTextContent()); + Mark mark = new Mark(sourceID, name, new GPSCoordinate(x,y)); + markerMap.put(sourceID, mark); + } + @Override - public List getBoats() { - return new ArrayList<>(boatMap.values()); + public Map getBoats() { + return boatMap; } @Override - public List getMarkerBoats() { - return new ArrayList<>(markerMap.values()); + public Map getMarkerBoats() { + return markerMap; } } diff --git a/mock/src/main/java/seng302/DataInput/RaceDataSource.java b/mock/src/main/java/seng302/DataInput/RaceDataSource.java index a58e2543..fac5c15c 100644 --- a/mock/src/main/java/seng302/DataInput/RaceDataSource.java +++ b/mock/src/main/java/seng302/DataInput/RaceDataSource.java @@ -2,10 +2,11 @@ package seng302.DataInput; ; import seng302.Model.Boat; +import seng302.Model.CompoundMark; import seng302.Model.GPSCoordinate; import seng302.Model.Leg; -import seng302.Model.CompoundMarker; +import java.time.ZonedDateTime; import java.util.List; /** @@ -18,13 +19,13 @@ public interface RaceDataSource { List getBoundary(); - List getCompoundMarkers(); + List getCompoundMarks(); int getRaceId(); String getRaceType(); - GPSCoordinate getMark(); + ZonedDateTime getZonedDateTime(); GPSCoordinate getMapTopLeft(); diff --git a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java index 05de160c..e751aad8 100644 --- a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java @@ -5,18 +5,17 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import seng302.Model.Boat; -import seng302.Model.CompoundMarker; -import seng302.Model.GPSCoordinate; -import seng302.Model.Leg; +import seng302.Model.*; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; /** * Created by fwy13 on 26/03/2017. + * @deprecated please use {@link seng302.Model.StreamedCourseXMLReader} */ public class RaceXMLReader extends XMLReader implements RaceDataSource { private static double COORDINATEPADDING = 0.0005; @@ -27,7 +26,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; private GPSCoordinate mapTopLeft, mapBottomRight; private List boundary = new ArrayList<>(); - private List compoundMarkers = new ArrayList<>(); + private List compoundMarks = new ArrayList<>(); /** * Constractor for Race XML @@ -106,8 +105,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { NodeList nMarkers = doc.getElementsByTagName("marker"); for (int i = 0; i < nMarkers.getLength(); i++) { - CompoundMarker compoundMarker = getMarker((Element) nMarkers.item(i)); - if (compoundMarker.getName() != null) compoundMarkers.add(compoundMarker); + CompoundMark compoundMark = getMarker((Element) nMarkers.item(i)); + if (compoundMark.getName() != null) compoundMarks.add(compoundMark); } } @@ -121,10 +120,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { for (int i = 0; i < nLegs.getLength(); i++) { String label = getTextValueOfNode((Element) nLegs.item(i), "name"); NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - CompoundMarker startCompoundMarker = getMarker(start); + CompoundMark startCompoundMark = getMarker(start); NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - CompoundMarker finishCompoundMarker = getMarker(finish); - legs.add(new Leg(label, startCompoundMarker, finishCompoundMarker, i)); + CompoundMark finishCompoundMark = getMarker(finish); + legs.add(new Leg(label, startCompoundMark, finishCompoundMark, i)); } } @@ -204,7 +203,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param start base nodelist this should be the tag that contains * @return */ - private CompoundMarker getMarker(NodeList start) { + private CompoundMark getMarker(NodeList start) { return getMarker(start, 0); } @@ -215,7 +214,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param startIndex index in the node that has the coordinate tag * @return */ - private CompoundMarker getMarker(NodeList start, int startIndex) { + private CompoundMark getMarker(NodeList start, int startIndex) { return getMarker(start, startIndex, 0); } @@ -227,7 +226,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param nodeIndex coordinate index * @return */ - private CompoundMarker getMarker(NodeList start, int startIndex, int nodeIndex) { + private CompoundMark getMarker(NodeList start, int startIndex, int nodeIndex) { NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); Element marker = (Element) nodeList.item(nodeIndex); return getMarker(marker); @@ -239,7 +238,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param markerNode marker to turn into coordinates * @return */ - private CompoundMarker getMarker(Element markerNode) { + private CompoundMark getMarker(Element markerNode) { NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); @@ -251,7 +250,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { side2 = side1; } NodeList name = markerNode.getElementsByTagName("name"); - return name.getLength() == 1 ? new CompoundMarker(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new CompoundMarker(side1, side2); + return null;//name.getLength() == 1 ? new CompoundMark(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new CompoundMark(side1, side2); } /** @@ -362,11 +361,16 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { return raceID; } - public List getCompoundMarkers() { - return compoundMarkers; + public List getCompoundMarks() { + return compoundMarks; } public String getRaceType() { return "FLEET"; } + + @Override + public ZonedDateTime getZonedDateTime() { + return null; + } } diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 67ba71b1..a53e6626 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -41,8 +41,8 @@ public class Boat { public double calculateAzimuth() { GeodeticCalculator calc = new GeodeticCalculator(); - GPSCoordinate start = currentLeg.getStartCompoundMarker().getAverageGPSCoordinate(); - GPSCoordinate end = currentLeg.getEndCompoundMarker().getAverageGPSCoordinate(); + GPSCoordinate start = currentLeg.getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate end = currentLeg.getEndCompoundMark().getAverageGPSCoordinate(); calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude()); calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude()); diff --git a/mock/src/main/java/seng302/Model/CompoundMark.java b/mock/src/main/java/seng302/Model/CompoundMark.java new file mode 100644 index 00000000..d4524a20 --- /dev/null +++ b/mock/src/main/java/seng302/Model/CompoundMark.java @@ -0,0 +1,71 @@ +package seng302.Model; + +import org.geotools.referencing.GeodeticCalculator; +import java.awt.geom.Point2D; + +/** + * Created by esa46 on 29/03/17. + */ +public class CompoundMark extends Marker{ + + private GPSCoordinate averageGPSCoordinate; + private Mark mark1; + private Mark mark2 = null; + private String name; + + public CompoundMark(Mark mark1) { + super(mark1.getPosition()); + this.mark1 = mark1; + this.averageGPSCoordinate = calculateAverage(); + + } + + public CompoundMark(Mark mark1, Mark mark2) { + super(mark1.getPosition(), mark2.getPosition()); + this.mark1 = mark1; + this.mark2 = mark2; + this.averageGPSCoordinate = calculateAverage(); + + } + + public CompoundMark(String name, Mark mark1, Mark mark2) { + super(name, mark1.getPosition(), mark2.getPosition()); + this.name = name; + this.mark1 = mark1; + this.mark2 = mark2; + this.averageGPSCoordinate = calculateAverage(); + + } + + public GPSCoordinate getMark1() { + return mark1.getPosition(); + } + + public GPSCoordinate getMark2() { + return mark2.getPosition(); + } + + public GPSCoordinate getAverageGPSCoordinate() { + return averageGPSCoordinate; + } + + public String getName() { + return name; + } + + private GPSCoordinate calculateAverage() { + if(mark2 != null) { + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(mark1.getPosition().getLongitude(), mark1.getPosition().getLatitude()); + calc.setDestinationGeographicPoint(mark2.getPosition().getLongitude(), mark2.getPosition().getLatitude()); + double azimuth = calc.getAzimuth(); + double distance = calc.getOrthodromicDistance(); + + GeodeticCalculator middleCalc = new GeodeticCalculator(); + middleCalc.setStartingGeographicPoint(mark1.getPosition().getLongitude(), mark1.getPosition().getLatitude()); + middleCalc.setDirection(azimuth, distance / 2); + Point2D middlePoint = middleCalc.getDestinationGeographicPoint(); + return new GPSCoordinate(middlePoint.getY(), middlePoint.getX()); + } else return mark1.getPosition(); + } +} diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index f819ef9d..25a303d6 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -62,7 +62,7 @@ public class Event { mockOutput.parseXMLString(regattaData, 26); System.out.println("Sending Race"); - String raceData = readFile("mock/src/main/resources//mockXML/raceTest.xml", StandardCharsets.UTF_8); + String raceData = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); mockOutput.setRaceXml(raceData); mockOutput.parseXMLString(raceData, 26); diff --git a/mock/src/main/java/seng302/Model/Leg.java b/mock/src/main/java/seng302/Model/Leg.java index b791627a..22c5adce 100644 --- a/mock/src/main/java/seng302/Model/Leg.java +++ b/mock/src/main/java/seng302/Model/Leg.java @@ -10,8 +10,8 @@ import seng302.Constants; public class Leg { private String name; //nautical miles private double distance; - private CompoundMarker startCompoundMarker; - private CompoundMarker endCompoundMarker; + private Marker startCompoundMark; + private Marker endCompoundMark; private int legNumber; /** @@ -22,10 +22,10 @@ public class Leg { * @param end marker * @param number Leg's position in race */ - public Leg(String name, CompoundMarker start, CompoundMarker end, int number) { + public Leg(String name, Marker start, Marker end, int number) { this.name = name; - this.startCompoundMarker = start; - this.endCompoundMarker = end; + this.startCompoundMark = start; + this.endCompoundMark = end; this.legNumber = number; calculateDistance(); } @@ -69,20 +69,20 @@ public class Leg { } - public CompoundMarker getStartCompoundMarker() { - return startCompoundMarker; + public Marker getStartCompoundMark() { + return startCompoundMark; } - public void setStartCompoundMarker(CompoundMarker startCompoundMarker) { - this.startCompoundMarker = startCompoundMarker; + public void setStartCompoundMark(Marker startCompoundMark) { + this.startCompoundMark = startCompoundMark; } - public CompoundMarker getEndCompoundMarker() { - return endCompoundMarker; + public Marker getEndCompoundMark() { + return endCompoundMark; } - public void setEndCompoundMarker(CompoundMarker endCompoundMarker) { - this.endCompoundMarker = endCompoundMarker; + public void setEndCompoundMark(Marker endCompoundMark) { + this.endCompoundMark = endCompoundMark; } /** @@ -92,8 +92,8 @@ public class Leg { GeodeticCalculator calc = new GeodeticCalculator(); //Load start and end of leg - GPSCoordinate startMarker = this.startCompoundMarker.getAverageGPSCoordinate(); - GPSCoordinate endMarker = this.endCompoundMarker.getAverageGPSCoordinate(); + GPSCoordinate startMarker = this.startCompoundMark.getAverageGPSCoordinate(); + GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate(); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion; diff --git a/mock/src/main/java/seng302/Model/Mark.java b/mock/src/main/java/seng302/Model/Mark.java index 36d7bdf2..8a09493d 100644 --- a/mock/src/main/java/seng302/Model/Mark.java +++ b/mock/src/main/java/seng302/Model/Mark.java @@ -4,13 +4,25 @@ package seng302.Model; * Created by cbt24 on 10/05/17. */ public class Mark { + private int sourceID; private String name; + private GPSCoordinate position; - public Mark(String name) { + public Mark(int sourceID, String name, GPSCoordinate position) { + this.sourceID = sourceID; this.name = name; + this.position = position; } public String getName() { return name; } + + public int getSourceID() { + return sourceID; + } + + public GPSCoordinate getPosition() { + return position; + } } diff --git a/mock/src/main/java/seng302/Model/CompoundMarker.java b/mock/src/main/java/seng302/Model/Marker.java similarity index 88% rename from mock/src/main/java/seng302/Model/CompoundMarker.java rename to mock/src/main/java/seng302/Model/Marker.java index cbe5fdf5..2887f9fc 100644 --- a/mock/src/main/java/seng302/Model/CompoundMarker.java +++ b/mock/src/main/java/seng302/Model/Marker.java @@ -6,7 +6,7 @@ import java.awt.geom.Point2D; /** * Created by esa46 on 29/03/17. */ -public class CompoundMarker { +public class Marker { private GPSCoordinate averageGPSCoordinate; private GPSCoordinate mark1; @@ -14,7 +14,7 @@ public class CompoundMarker { private String name; private boolean doubleMarker = false; - public CompoundMarker(GPSCoordinate mark1) { + public Marker(GPSCoordinate mark1) { this.mark1 = mark1; this.mark2 = mark1; @@ -22,7 +22,7 @@ public class CompoundMarker { } - public CompoundMarker(GPSCoordinate mark1, GPSCoordinate mark2) { + public Marker(GPSCoordinate mark1, GPSCoordinate mark2) { this.mark1 = mark1; this.mark2 = mark2; @@ -30,7 +30,7 @@ public class CompoundMarker { } - public CompoundMarker(String name, GPSCoordinate mark1, GPSCoordinate mark2) { + public Marker(String name, GPSCoordinate mark1, GPSCoordinate mark2) { this.name = name; this.mark1 = mark1; @@ -71,4 +71,4 @@ public class CompoundMarker { } -} +} \ No newline at end of file diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index c58eae49..05f0d7f7 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -216,19 +216,14 @@ public class Race implements Runnable { public void initialiseBoats() { Leg officialStart = legs.get(0); String name = officialStart.getName(); - CompoundMarker endCompoundMarker = officialStart.getEndCompoundMarker(); - ArrayList startCompoundMarkers = getSpreadStartingPositions(); + ArrayList startingPositions = getSpreadStartingPositions(); for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get(i); if (boat != null) { boat.setScaledVelocity(boat.getVelocity() * scaleFactor); - Leg startLeg = new Leg(name, 0); - boat.setCurrentPosition(startCompoundMarkers.get(i).getAverageGPSCoordinate()); - startLeg.setStartCompoundMarker(startCompoundMarkers.get(i)); - startLeg.setEndCompoundMarker(endCompoundMarker); - startLeg.calculateDistance(); - boat.setCurrentLeg(startLeg); + boat.setCurrentPosition(startingPositions.get(i)); + boat.setCurrentLeg(officialStart); boat.setHeading(boat.calculateHeading()); } } @@ -239,27 +234,27 @@ public class Race implements Runnable { * * @return list of starting positions */ - public ArrayList getSpreadStartingPositions() { + public ArrayList getSpreadStartingPositions() { int nBoats = startingBoats.size(); - CompoundMarker compoundMarker = legs.get(0).getStartCompoundMarker(); + Marker compoundMark = legs.get(0).getStartCompoundMark(); GeodeticCalculator initialCalc = new GeodeticCalculator(); - initialCalc.setStartingGeographicPoint(compoundMarker.getMark1().getLongitude(), compoundMarker.getMark1().getLatitude()); - initialCalc.setDestinationGeographicPoint(compoundMarker.getMark2().getLongitude(), compoundMarker.getMark2().getLatitude()); + initialCalc.setStartingGeographicPoint(compoundMark.getMark1().getLongitude(), compoundMark.getMark1().getLatitude()); + initialCalc.setDestinationGeographicPoint(compoundMark.getMark2().getLongitude(), compoundMark.getMark2().getLatitude()); double azimuth = initialCalc.getAzimuth(); double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); GeodeticCalculator positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(compoundMarker.getMark1().getLongitude(), compoundMarker.getMark1().getLatitude()); - ArrayList positions = new ArrayList<>(); + positionCalc.setStartingGeographicPoint(compoundMark.getMark1().getLongitude(), compoundMark.getMark1().getLatitude()); + ArrayList positions = new ArrayList<>(); for (int i = 0; i < nBoats; i++) { positionCalc.setDirection(azimuth, distanceBetweenBoats); Point2D position = positionCalc.getDestinationGeographicPoint(); - positions.add(new CompoundMarker(new GPSCoordinate(position.getY(), position.getX()))); + positions.add(new GPSCoordinate(position.getY(), position.getX())); positionCalc = new GeodeticCalculator(); positionCalc.setStartingGeographicPoint(position); @@ -302,7 +297,7 @@ public class Race implements Runnable { //update boat's distance travelled boat.setDistanceTravelledInLeg(totalDistanceTravelled); //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartCompoundMarker().getAverageGPSCoordinate(), + boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartCompoundMark().getAverageGPSCoordinate(), totalDistanceTravelled, boat.calculateAzimuth())); } } diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java b/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java new file mode 100644 index 00000000..453bacfd --- /dev/null +++ b/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java @@ -0,0 +1,7 @@ +package seng302.Model; + +/** + * Created by cbt24 on 25/04/17. + */ +public class StreamedCourseXMLException extends Throwable { +} diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java b/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java new file mode 100644 index 00000000..9a089e41 --- /dev/null +++ b/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java @@ -0,0 +1,274 @@ +package seng302.Model; + +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; +import seng302.DataInput.BoatDataSource; +import seng302.DataInput.RaceDataSource; +import seng302.DataInput.XMLReader; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.text.ParseException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * Created by jjg64 on 21/04/17. + */ +public class StreamedCourseXMLReader extends XMLReader implements RaceDataSource { + private static final double COORDINATEPADDING = 0.000; + private GPSCoordinate mapTopLeft, mapBottomRight; + private final List boundary = new ArrayList<>(); + private final Map compoundMarkMap = new HashMap<>(); + private final Map participants = new HashMap<>(); + private final List legs = new ArrayList<>(); + private final List compoundMarks = new ArrayList<>(); + private ZonedDateTime creationTimeDate; + private ZonedDateTime raceStartTime; + private int raceID; + private String raceType; + private boolean postpone; + + private Map boats; + private Map marks; + + /** + * Constructor for Streamed Race XML + * @param filePath path of the file + * @throws IOException error + * @throws SAXException error + * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error + */ + public StreamedCourseXMLReader(String filePath, BoatDataSource boatData) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { + this(filePath, boatData, true); + } + + /** + * Constructor for Streamed Race XML + * @param filePath file path to read + * @param read whether or not to read and store the files straight away. + * @throws IOException error + * @throws SAXException error + * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error + */ + public StreamedCourseXMLReader(String filePath, BoatDataSource boatData, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { + super(filePath); + this.boats = boatData.getBoats(); + this.marks = boatData.getMarkerBoats(); + if (read) { + read(); + } + } + + /** + * reads + * @throws StreamedCourseXMLException error + */ + private void read() throws StreamedCourseXMLException { + readRace(); + readParticipants(); + readCourse(); + } + + /** + * reads a race + */ + private void readRace() { + DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + Element settings = (Element) doc.getElementsByTagName("Race").item(0); + NamedNodeMap raceTimeTag = doc.getElementsByTagName("RaceStartTime").item(0).getAttributes(); + + if (raceTimeTag.getNamedItem("Time") != null) dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); + + + raceID = Integer.parseInt(getTextValueOfNode(settings, "RaceID")); + raceType = getTextValueOfNode(settings, "RaceType"); + + creationTimeDate = ZonedDateTime.parse(getTextValueOfNode(settings, "CreationTimeDate"), dateFormat); + + if (raceTimeTag.getNamedItem("Time") != null) raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Time").getTextContent(), dateFormat); + else raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Start").getTextContent(), dateFormat); + + postpone = Boolean.parseBoolean(raceTimeTag.getNamedItem("Postpone").getTextContent()); + } + + private void readParticipants() { + Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0); + nParticipants.getChildNodes().getLength(); + for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) { + int sourceID; + Node yacht = nParticipants.getChildNodes().item(i); + if (yacht.getNodeName().equals("Yacht")) { + if (exists(yacht, "SourceID")) { + sourceID = Integer.parseInt(yacht.getAttributes().getNamedItem("SourceID").getTextContent()); + participants.put(sourceID, boats.get(sourceID)); + } + } + } + } + + /** + * reads a course + * @throws StreamedCourseXMLException error + */ + private void readCourse() throws StreamedCourseXMLException { + readCompoundMarks(); + readCompoundMarkSequence(); + readCourseLimit(); + } + + /** + * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. + * @see CompoundMark + */ + private void readCompoundMarks() throws StreamedCourseXMLException { + Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); + for(int i = 0; i < nCourse.getChildNodes().getLength(); i++) { + Node compoundMark = nCourse.getChildNodes().item(i); + if(compoundMark.getNodeName().equals("CompoundMark")) { + int compoundMarkID = getCompoundMarkID((Element) compoundMark); + compoundMarkMap.put(compoundMarkID, (Element)compoundMark); + compoundMarks.add(getCompoundMark(compoundMarkID)); + } + } + } + + /** + * Generates a CompoundMark from the CompoundMark element with given ID. + * @param compoundMarkID index of required CompoundMark element + * @return generated CompoundMark + * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks + * @see CompoundMark + */ + private CompoundMark getCompoundMark(int compoundMarkID) throws StreamedCourseXMLException { + Element compoundMark = compoundMarkMap.get(compoundMarkID); + NodeList nMarks = compoundMark.getElementsByTagName("Mark"); + CompoundMark marker; + + switch(nMarks.getLength()) { + case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; + case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; + default: throw new StreamedCourseXMLException(); + } + + return marker; + } + + private Mark getMark(Element mark) { + int sourceID = Integer.parseInt(mark.getAttribute("SourceID")); + System.out.println(marks.get(sourceID).getPosition()); + return marks.get(sourceID); + } + + /** + * Reads "compoundMarkID" attribute of CompoundMark or Corner element + * @param element with "compoundMarkID" attribute + * @return value of "compoundMarkID" attribute + */ + private int getCompoundMarkID(Element element) { + return Integer.parseInt(element.getAttribute("CompoundMarkID")); + } + + /** + * Reads "name" attribute of CompoundMark element with corresponding CompoundMarkID + * @param compoundMarkID unique ID for CompoundMark element + * @return value of "name" attribute + */ + private String getCompoundMarkName(int compoundMarkID) { + return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); + } + + /** + * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. + * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark + */ + private void readCompoundMarkSequence() throws StreamedCourseXMLException { + Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); + NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); + Element markXML = (Element)nCorners.item(0); + CompoundMark lastCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + String legName = getCompoundMarkName(getCompoundMarkID(markXML)); + for(int i = 1; i < nCorners.getLength(); i++) { + markXML = (Element)nCorners.item(i); + CompoundMark currentCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); + lastCompoundMark = currentCompoundMark; + legName = getCompoundMarkName(getCompoundMarkID(markXML)); + } + } + + private void readCourseLimit() { + Element nCourseLimit = (Element) doc.getElementsByTagName("CourseLimit").item(0); + for(int i = 0; i < nCourseLimit.getChildNodes().getLength(); i++) { + Node limit = nCourseLimit.getChildNodes().item(i); + if (limit.getNodeName().equals("Limit")) { + double lat = Double.parseDouble(limit.getAttributes().getNamedItem("Lat").getTextContent()); + double lon = Double.parseDouble(limit.getAttributes().getNamedItem("Lon").getTextContent()); + boundary.add(new GPSCoordinate(lat, lon)); + } + } + + + double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; + double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double minLongitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; + + mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); + mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); + } + + public List getBoundary() { + return boundary; + } + + public GPSCoordinate getMapTopLeft() { + return mapTopLeft; + } + + public GPSCoordinate getMapBottomRight() { + return mapBottomRight; + } + + public List getLegs() { + return legs; + } + + public List getCompoundMarks() { return compoundMarks; } + + public Double getPadding() { + return COORDINATEPADDING; + } + + public ZonedDateTime getCreationTimeDate() { + return creationTimeDate; + } + + public ZonedDateTime getZonedDateTime() { + return raceStartTime; + } + + public int getRaceId() { + return raceID; + } + + public String getRaceType() { + return raceType; + } + + public boolean isPostpone() { + return postpone; + } + + public List getBoats() { + return new ArrayList<>(participants.values()); + } +} diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index 2cdb66e9..40a509a2 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -29,7 +29,7 @@ - + diff --git a/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java b/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java index 53689e38..5bf8b7b2 100644 --- a/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java +++ b/mock/src/test/java/seng302/DataInput/BoatXMLReaderTest.java @@ -8,6 +8,7 @@ import seng302.Model.Mark; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import static org.testng.Assert.*; @@ -24,8 +25,8 @@ public class BoatXMLReaderTest { public void setUp() { try { boatData = new BoatXMLReader("mockXML/boatTest.xml"); - boats = boatData.getBoats(); - marks = boatData.getMarkerBoats(); + boats = new ArrayList<>(boatData.getBoats().values()); + marks = new ArrayList<>(boatData.getMarkerBoats().values()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { diff --git a/mock/src/test/java/seng302/Model/BoatTest.java b/mock/src/test/java/seng302/Model/BoatTest.java index 2d112aad..8bdcb069 100644 --- a/mock/src/test/java/seng302/Model/BoatTest.java +++ b/mock/src/test/java/seng302/Model/BoatTest.java @@ -18,18 +18,18 @@ public class BoatTest { @Test public void calculateDueNorthAzimuthReturns0() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 0, 1e-8); } @Test public void calculateDueSouthAzimuthReturns180() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 180, 1e-8); } @@ -38,9 +38,9 @@ public class BoatTest { @Test public void calculateDueEastAzimuthReturns90() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 90, 1e-8); } @@ -48,9 +48,9 @@ public class BoatTest { @Test public void calculateDueWestAzimuthReturnsNegative90() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), -90, 1e-8); @@ -59,9 +59,9 @@ public class BoatTest { @Test public void calculateDueNorthHeadingReturns0() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 0, 1e-8); } @@ -69,27 +69,27 @@ public class BoatTest { @Test public void calculateDueEastHeadingReturns90() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 90, 1e-8); } @Test public void calculateDueSouthHeadingReturns180() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 180, 1e-8); } @Test public void calculateDueWestHeadingReturns270() { - CompoundMarker startCompoundMarker = new CompoundMarker(ORIGIN_COORDS); - CompoundMarker endCompoundMarker = new CompoundMarker(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startCompoundMarker, endCompoundMarker, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 270, 1e-8); } diff --git a/mock/src/test/java/seng302/Model/CompoundMarkerTest.java b/mock/src/test/java/seng302/Model/CompoundMarkTest.java similarity index 76% rename from mock/src/test/java/seng302/Model/CompoundMarkerTest.java rename to mock/src/test/java/seng302/Model/CompoundMarkTest.java index ef46de2c..29b542b5 100644 --- a/mock/src/test/java/seng302/Model/CompoundMarkerTest.java +++ b/mock/src/test/java/seng302/Model/CompoundMarkTest.java @@ -8,14 +8,14 @@ import static org.junit.Assert.assertTrue; /** * Created by esa46 on 29/03/17. */ -public class CompoundMarkerTest { +public class CompoundMarkTest { GPSCoordinate ORIGIN_COORD = new GPSCoordinate(0, 0); @Test public void averageOfSingleMarkAtOriginIsSingleMark() { - CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD); + Marker testMark = new Marker(ORIGIN_COORD); assertTrue(testMark.getAverageGPSCoordinate().equals(ORIGIN_COORD)); } @@ -24,7 +24,7 @@ public class CompoundMarkerTest { public void averageOfSingleMarkIsSingleMark() { GPSCoordinate testCoord = new GPSCoordinate(20, 25); - CompoundMarker testMark = new CompoundMarker(testCoord); + Marker testMark = new Marker(testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(testCoord)); } @@ -34,7 +34,7 @@ public class CompoundMarkerTest { public void averageLatOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(10, 0); - CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD, testCoord); + Marker testMark = new Marker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(5, 0))); } @@ -42,7 +42,7 @@ public class CompoundMarkerTest { public void averageLongOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(0, 10); - CompoundMarker testMark = new CompoundMarker(ORIGIN_COORD, testCoord); + Marker testMark = new Marker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(0, 5))); } @@ -52,7 +52,7 @@ public class CompoundMarkerTest { GPSCoordinate testCoord1 = new GPSCoordinate(10, 30); GPSCoordinate testCoord2 = new GPSCoordinate(30, 60); - CompoundMarker testMark = new CompoundMarker(testCoord1, testCoord2); + Marker testMark = new Marker(testCoord1, testCoord2); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(020.644102, 44.014817))); } diff --git a/mock/src/test/java/seng302/Model/LegTest.java b/mock/src/test/java/seng302/Model/LegTest.java index feccb9d3..cae7b203 100644 --- a/mock/src/test/java/seng302/Model/LegTest.java +++ b/mock/src/test/java/seng302/Model/LegTest.java @@ -14,7 +14,7 @@ import static junit.framework.TestCase.assertEquals; */ public class LegTest { - private CompoundMarker ORIGIN_Compound_MARKER = new CompoundMarker(new GPSCoordinate(0, 0)); + private Marker ORIGIN_Compound_MARKER = new Marker(new GPSCoordinate(0, 0)); @Test public void calculateDistanceHandles5nmNorth() { @@ -22,8 +22,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(0, 5 * Constants.NMToMetersConversion); - CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endMarker, 0); assertEquals(test.getDistance(), 5, 1e-8); } @@ -33,8 +33,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(90, 12 * Constants.NMToMetersConversion); - CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endMarker, 0); assertEquals(test.getDistance(), 12, 1e-8); } @@ -44,8 +44,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(180, 0.5 * Constants.NMToMetersConversion); - CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endMarker, 0); assertEquals(test.getDistance(), 0.5, 1e-8); } @@ -55,8 +55,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion); - CompoundMarker endCompoundMarker = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endCompoundMarker, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Compound_MARKER, endMarker, 0); assertEquals(test.getDistance(), 0.1, 1e-8); } @@ -67,11 +67,11 @@ public class LegTest { assertEquals(test.getDistance(), 0, 1e-8); } - private CompoundMarker getEndMarker(Point2D point) { + private Marker getEndMarker(Point2D point) { GPSCoordinate coords = new GPSCoordinate(point.getY(), point.getX()); - return new CompoundMarker(coords); + return new Marker(coords); } } diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index ccf41621..bbac7680 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -28,8 +28,8 @@ //public class RaceTest{ // // private static MockOutput mockOutput; -// SharedModel.Leg START_LEG = new SharedModel.Leg("Start", new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(0, 0)), new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(1, 1)), 0); -// SharedModel.Leg FINISH_LEG = new SharedModel.Leg("Finish", new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(1, 1)), new SharedModel.CompoundMarker(new SharedModel.GPSCoordinate(2, 2)), 0); +// 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{} diff --git a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java index 8992c019..45050bda 100644 --- a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java @@ -88,7 +88,7 @@ public class BoatXMLReader extends XMLReader { Element nBoats = (Element) doc.getElementsByTagName("Boats").item(0); for (int i = 0; i < nBoats.getChildNodes().getLength(); i++) { Node boat = nBoats.getChildNodes().item(i); - if (boat.getNodeName().equals("Boat")) { + if (boat.getNodeName().equals("Boat") && boat.getAttributes().getNamedItem("Type").getTextContent().equals("Yacht")) { readSingleBoat(boat); } } From 91b17737033bdd26b21d1c7d7de122bee8c3e8a1 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Wed, 10 May 2017 17:02:25 +1200 Subject: [PATCH 08/23] Commented out obsolete tests, may be useful if refactored. #story[881] --- .../test/java/seng302/Data/BoatDataTest.java | 174 ++++++++-------- .../test/java/seng302/Data/RaceDataTest.java | 166 +++++++-------- .../test/java/seng302/Model/RaceXMLTest.java | 192 +++++++++--------- .../test/java/seng302/Mock/BoatsXMLTest.java | 94 ++++----- .../java/seng302/Mock/FailBoatXMLTest.java | 52 ++--- .../test/java/seng302/Model/RaceXMLTest.java | 186 ++++++++--------- 6 files changed, 432 insertions(+), 432 deletions(-) diff --git a/mock/src/test/java/seng302/Data/BoatDataTest.java b/mock/src/test/java/seng302/Data/BoatDataTest.java index 14d3ff5a..d6cc4d17 100644 --- a/mock/src/test/java/seng302/Data/BoatDataTest.java +++ b/mock/src/test/java/seng302/Data/BoatDataTest.java @@ -1,87 +1,87 @@ -package seng302.Data; - - -import org.junit.Before; -import org.junit.Test; -import org.xml.sax.SAXException; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RaceXMLReader; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; - -import static junit.framework.TestCase.assertTrue; - -/** - * Created by esa46 on 25/04/17. - */ -public class BoatDataTest { - - - private static final String ROOT_TAG = "BoatConfig"; - private static final String[] REQUIRED_TAGS = new String[]{ - "Boats", "GPSposition" - }; - private static final String[] REQUIRED_ATTRIBUTES = new String[]{ - "SourceID", "ShapeID", "HullNum", "StoweName", - "ShortName", "BoatName" - }; - - String result; - RaceDataSource raceDataSource; - - @Before - public void initReader() { - try { - raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); - BoatData boatData = new BoatData(raceDataSource.getBoats()); - result = boatData.createXML(); - - - } catch (IOException e) { - e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } - } - - @Test - public void xmlHasAllNecessaryTags() { - - assertTrue(result.contains("<" + ROOT_TAG + ">")); - for (String tag : REQUIRED_TAGS) { - assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); - } - } - - @Test - public void xmlHasAllNecessaryAttributes() { - - for (String attribute : REQUIRED_ATTRIBUTES) { - assertTrue(result.contains(attribute + "=")); - } - } - - @Test - public void allTagsAreTerminated() { - - for (String tag : REQUIRED_TAGS) { - int lastIndex = 0; - String openTag = "<" + tag + ">"; - String closeTag = ""; - while (lastIndex < result.length() && lastIndex > 0) { - lastIndex = result.indexOf(openTag, lastIndex); - if (lastIndex > 0) { - - lastIndex = result.indexOf(closeTag, lastIndex); - assertTrue(lastIndex > 0); - } - } - } - } - - - -} +//package seng302.Data; +// +// +//import org.junit.Before; +//import org.junit.Test; +//import org.xml.sax.SAXException; +//import seng302.DataInput.RaceDataSource; +//import seng302.DataInput.RaceXMLReader; +// +//import javax.xml.parsers.ParserConfigurationException; +//import java.io.IOException; +// +//import static junit.framework.TestCase.assertTrue; +// +///** +// * Created by esa46 on 25/04/17. +// */ +//public class BoatDataTest { +// +// +// private static final String ROOT_TAG = "BoatConfig"; +// private static final String[] REQUIRED_TAGS = new String[]{ +// "Boats", "GPSposition" +// }; +// private static final String[] REQUIRED_ATTRIBUTES = new String[]{ +// "SourceID", "ShapeID", "HullNum", "StoweName", +// "ShortName", "BoatName" +// }; +// +// String result; +// RaceDataSource raceDataSource; +// +// @Before +// public void initReader() { +// try { +// raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); +// BoatData boatData = new BoatData(raceDataSource.getBoats()); +// result = boatData.createXML(); +// +// +// } catch (IOException e) { +// e.printStackTrace(); +// } catch (SAXException e) { +// e.printStackTrace(); +// } catch (ParserConfigurationException e) { +// e.printStackTrace(); +// } +// } +// +// @Test +// public void xmlHasAllNecessaryTags() { +// +// assertTrue(result.contains("<" + ROOT_TAG + ">")); +// for (String tag : REQUIRED_TAGS) { +// assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); +// } +// } +// +// @Test +// public void xmlHasAllNecessaryAttributes() { +// +// for (String attribute : REQUIRED_ATTRIBUTES) { +// assertTrue(result.contains(attribute + "=")); +// } +// } +// +// @Test +// public void allTagsAreTerminated() { +// +// for (String tag : REQUIRED_TAGS) { +// int lastIndex = 0; +// String openTag = "<" + tag + ">"; +// String closeTag = ""; +// while (lastIndex < result.length() && lastIndex > 0) { +// lastIndex = result.indexOf(openTag, lastIndex); +// if (lastIndex > 0) { +// +// lastIndex = result.indexOf(closeTag, lastIndex); +// assertTrue(lastIndex > 0); +// } +// } +// } +// } +// +// +// +//} diff --git a/mock/src/test/java/seng302/Data/RaceDataTest.java b/mock/src/test/java/seng302/Data/RaceDataTest.java index 5f9ed54c..22ff3056 100644 --- a/mock/src/test/java/seng302/Data/RaceDataTest.java +++ b/mock/src/test/java/seng302/Data/RaceDataTest.java @@ -1,83 +1,83 @@ -package seng302.Data; - -import org.junit.Before; -import org.junit.Test; -import org.xml.sax.SAXException; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RaceXMLReader; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; - -import static junit.framework.TestCase.assertTrue; - -/** - * Created by esa46 on 25/04/17. - */ -public class RaceDataTest { - - private static final String ROOT_TAG = "Race"; - private static final String[] REQUIRED_TAGS = new String[]{ - "RaceID", "RaceType", "CreationTimeDate", "RaceStartTime", "Participants", "Yacht", - "CompoundMarkSequence", "Course", "CompoundMark", "Mark", "CourseLimit", "Limit" - }; - String result; - RaceDataSource raceDataSource; - - @Before - public void initReader() { - try { - raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); - RaceData raceData = new RaceData(raceDataSource); - result = raceData.createXML(); - - - } catch (IOException e) { - e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } - } - - @Test - public void xmlHasAllNecessaryFields() { - - assertTrue(result.contains("<" + ROOT_TAG + ">")); - for (String tag : REQUIRED_TAGS) { - System.out.println(tag); - assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); - } - } - - @Test - public void allTagsAreTerminated() { - - for (String tag : REQUIRED_TAGS) { - int lastIndex = 0; - String openTag = "<" + tag + ">"; - String closeTag = ""; - while (lastIndex < result.length() && lastIndex > 0) { - lastIndex = result.indexOf(openTag, lastIndex); - if (lastIndex > 0) { - - lastIndex = result.indexOf(closeTag, lastIndex); - assertTrue(lastIndex > 0); - } - } - } - } - - - @Test - public void idAndTypeAreEquivalent() { - String newId = result.substring(result.indexOf("") + 8, result.indexOf("")); - String newRaceType = result.substring(result.indexOf("") + 10, result.indexOf("")); - - assertTrue(raceDataSource.getRaceId() == Integer.parseInt(newId)); - assertTrue(raceDataSource.getRaceType().equals(newRaceType)); - } - - -} +//package seng302.Data; +// +//import org.junit.Before; +//import org.junit.Test; +//import org.xml.sax.SAXException; +//import seng302.DataInput.RaceDataSource; +//import seng302.DataInput.RaceXMLReader; +// +//import javax.xml.parsers.ParserConfigurationException; +//import java.io.IOException; +// +//import static junit.framework.TestCase.assertTrue; +// +///** +// * Created by esa46 on 25/04/17. +// */ +//public class RaceDataTest { +// +// private static final String ROOT_TAG = "Race"; +// private static final String[] REQUIRED_TAGS = new String[]{ +// "RaceID", "RaceType", "CreationTimeDate", "RaceStartTime", "Participants", "Yacht", +// "CompoundMarkSequence", "Course", "CompoundMark", "Mark", "CourseLimit", "Limit" +// }; +// String result; +// RaceDataSource raceDataSource; +// +// @Before +// public void initReader() { +// try { +// raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); +// RaceData raceData = new RaceData(raceDataSource); +// result = raceData.createXML(); +// +// +// } catch (IOException e) { +// e.printStackTrace(); +// } catch (SAXException e) { +// e.printStackTrace(); +// } catch (ParserConfigurationException e) { +// e.printStackTrace(); +// } +// } +// +// @Test +// public void xmlHasAllNecessaryFields() { +// +// assertTrue(result.contains("<" + ROOT_TAG + ">")); +// for (String tag : REQUIRED_TAGS) { +// System.out.println(tag); +// assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); +// } +// } +// +// @Test +// public void allTagsAreTerminated() { +// +// for (String tag : REQUIRED_TAGS) { +// int lastIndex = 0; +// String openTag = "<" + tag + ">"; +// String closeTag = ""; +// while (lastIndex < result.length() && lastIndex > 0) { +// lastIndex = result.indexOf(openTag, lastIndex); +// if (lastIndex > 0) { +// +// lastIndex = result.indexOf(closeTag, lastIndex); +// assertTrue(lastIndex > 0); +// } +// } +// } +// } +// +// +// @Test +// public void idAndTypeAreEquivalent() { +// String newId = result.substring(result.indexOf("") + 8, result.indexOf("")); +// String newRaceType = result.substring(result.indexOf("") + 10, result.indexOf("")); +// +// assertTrue(raceDataSource.getRaceId() == Integer.parseInt(newId)); +// assertTrue(raceDataSource.getRaceType().equals(newRaceType)); +// } +// +// +//} diff --git a/mock/src/test/java/seng302/Model/RaceXMLTest.java b/mock/src/test/java/seng302/Model/RaceXMLTest.java index 6007bb56..50fac007 100644 --- a/mock/src/test/java/seng302/Model/RaceXMLTest.java +++ b/mock/src/test/java/seng302/Model/RaceXMLTest.java @@ -1,96 +1,96 @@ -package seng302.Model;/** - * Created by Gondr on 26/03/2017. - */ - -import org.junit.Ignore; -import org.junit.Test; -import seng302.DataInput.RaceXMLReader; - - -import java.util.List; - -import static org.junit.Assert.*; - -public class RaceXMLTest { - RaceXMLReader raceXMLReader; - - @Test - public void canFindFile() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - } catch (Exception e) { - fail("Cannot find raceXML/bermuda_AC35.xml in the resources folder"); - } - } - - @Ignore - @Test - public void canReadBoats() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readBoats(); - List boats = raceXMLReader.getBoats(); - assertTrue(boats.size() == 6); - //test boat 1 - assertEquals(boats.get(0).getName(), "ORACLE TEAM USA"); - assertTrue(boats.get(0).getVelocity() == 20); - //test boat 2 - assertEquals(boats.get(1).getName(), "Land Rover BAR"); - assertTrue(boats.get(1).getVelocity() == 30); - assertEquals(boats.get(1).getCountry(), "GBR"); - //test boat 3 - assertEquals(boats.get(2).getName(), "SoftBank Team Japan"); - assertTrue(boats.get(2).getVelocity() == 25); - assertEquals(boats.get(2).getCountry(), "JPN"); - //test boat 4 - assertEquals(boats.get(3).getName(), "Groupama Team France"); - assertTrue(boats.get(3).getVelocity() == 20); - assertEquals(boats.get(3).getCountry(), "FRA"); - //test boat 5 - assertEquals(boats.get(4).getName(), "Artemis Racing"); - assertTrue(boats.get(4).getVelocity() == 29); - assertEquals(boats.get(4).getCountry(), "SWE"); - //test boat 6 - assertEquals(boats.get(5).getName(), "Emirates Team New Zealand"); - assertTrue(boats.get(5).getVelocity() == 62); - assertEquals(boats.get(5).getCountry(), "NZL"); - } catch (Exception e) { - fail("Boat Unreadable"); - } - } - - @Test - public void canReadLegs() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readLegs(); - assertTrue(raceXMLReader.getLegs().size() == 5); - } catch (Exception e) { - fail("Legs Unreadable"); - } - } - - @Test - public void canReadCourse() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readCourse(); - assertTrue(raceXMLReader.getMapTopLeft() != null); - assertTrue(raceXMLReader.getMapBottomRight() != null); - assertTrue(raceXMLReader.getFinishPt1() != null); - assertTrue(raceXMLReader.getFinishPt2() != null); - assertTrue(raceXMLReader.getStartPt1() != null); - assertTrue(raceXMLReader.getStartPt2() != null); - assertTrue(raceXMLReader.getLeewardPt1() != null); - assertTrue(raceXMLReader.getLeewardPt2() != null); - assertTrue(raceXMLReader.getWindwardPt1() != null); - assertTrue(raceXMLReader.getWindwardPt2() != null); - assertTrue(raceXMLReader.getMark() != null); - assertTrue(raceXMLReader.getBoundary().size() == 11); - } catch (Exception e) { - e.printStackTrace(); - fail("Course Unreadable"); - } - } - -} +//package seng302.Model;/** +// * Created by Gondr on 26/03/2017. +// */ +// +//import org.junit.Ignore; +//import org.junit.Test; +//import seng302.DataInput.RaceXMLReader; +// +// +//import java.util.List; +// +//import static org.junit.Assert.*; +// +//public class RaceXMLTest { +// RaceXMLReader raceXMLReader; +// +// @Test +// public void canFindFile() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// } catch (Exception e) { +// fail("Cannot find raceXML/bermuda_AC35.xml in the resources folder"); +// } +// } +// +// @Ignore +// @Test +// public void canReadBoats() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readBoats(); +// List boats = raceXMLReader.getBoats(); +// assertTrue(boats.size() == 6); +// //test boat 1 +// assertEquals(boats.get(0).getName(), "ORACLE TEAM USA"); +// assertTrue(boats.get(0).getVelocity() == 20); +// //test boat 2 +// assertEquals(boats.get(1).getName(), "Land Rover BAR"); +// assertTrue(boats.get(1).getVelocity() == 30); +// assertEquals(boats.get(1).getCountry(), "GBR"); +// //test boat 3 +// assertEquals(boats.get(2).getName(), "SoftBank Team Japan"); +// assertTrue(boats.get(2).getVelocity() == 25); +// assertEquals(boats.get(2).getCountry(), "JPN"); +// //test boat 4 +// assertEquals(boats.get(3).getName(), "Groupama Team France"); +// assertTrue(boats.get(3).getVelocity() == 20); +// assertEquals(boats.get(3).getCountry(), "FRA"); +// //test boat 5 +// assertEquals(boats.get(4).getName(), "Artemis Racing"); +// assertTrue(boats.get(4).getVelocity() == 29); +// assertEquals(boats.get(4).getCountry(), "SWE"); +// //test boat 6 +// assertEquals(boats.get(5).getName(), "Emirates Team New Zealand"); +// assertTrue(boats.get(5).getVelocity() == 62); +// assertEquals(boats.get(5).getCountry(), "NZL"); +// } catch (Exception e) { +// fail("Boat Unreadable"); +// } +// } +// +// @Test +// public void canReadLegs() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readLegs(); +// assertTrue(raceXMLReader.getLegs().size() == 5); +// } catch (Exception e) { +// fail("Legs Unreadable"); +// } +// } +// +// @Test +// public void canReadCourse() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readCourse(); +// assertTrue(raceXMLReader.getMapTopLeft() != null); +// assertTrue(raceXMLReader.getMapBottomRight() != null); +// assertTrue(raceXMLReader.getFinishPt1() != null); +// assertTrue(raceXMLReader.getFinishPt2() != null); +// assertTrue(raceXMLReader.getStartPt1() != null); +// assertTrue(raceXMLReader.getStartPt2() != null); +// assertTrue(raceXMLReader.getLeewardPt1() != null); +// assertTrue(raceXMLReader.getLeewardPt2() != null); +// assertTrue(raceXMLReader.getWindwardPt1() != null); +// assertTrue(raceXMLReader.getWindwardPt2() != null); +// assertTrue(raceXMLReader.getMark() != null); +// assertTrue(raceXMLReader.getBoundary().size() == 11); +// } catch (Exception e) { +// e.printStackTrace(); +// fail("Course Unreadable"); +// } +// } +// +//} diff --git a/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java b/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java index 985473f5..35e21a0e 100644 --- a/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java +++ b/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java @@ -1,47 +1,47 @@ -package seng302.Mock; - -import org.junit.Before; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.assertEquals; - -/** - * Created by jjg64 on 21/04/17. - */ -public class BoatsXMLTest { - private BoatXMLReader boatXMLReader; - - @Before - public void setup() { - try { - boatXMLReader = new BoatXMLReader("mockXML/boatXML/boatTest.xml", false); - } catch (Exception e) { - e.printStackTrace(); - //fail("Cannot find mockXML/raceXML/raceTest.xml in the resources folder"); - } - } - - @Test - public void testInvalidParticipant() { - Map inputParticipants = new HashMap<>(); - inputParticipants.put(420, new StreamedBoat(420)); - boatXMLReader.setParticipants(inputParticipants); - boatXMLReader.read(); - assertEquals(boatXMLReader.getBoats().size(), 0); - } - - @Test - public void testValidParticipant() { - Map inputParticipants = new HashMap<>(); - inputParticipants.put(101, new StreamedBoat(101)); - boatXMLReader.setParticipants(inputParticipants); - boatXMLReader.read(); - assertEquals(boatXMLReader.getBoats().size(), 1); - StreamedBoat boat = (StreamedBoat) boatXMLReader.getBoats().get(0); - assertEquals(boat.getSourceID(), 101); - } - -} +//package seng302.Mock; +// +//import org.junit.Before; +//import org.junit.Test; +// +//import java.util.HashMap; +//import java.util.Map; +// +//import static org.junit.Assert.assertEquals; +// +///** +// * Created by jjg64 on 21/04/17. +// */ +//public class BoatsXMLTest { +// private BoatXMLReader boatXMLReader; +// +// @Before +// public void setup() { +// try { +// boatXMLReader = new BoatXMLReader("mockXML/boatXML/boatTest.xml", false); +// } catch (Exception e) { +// e.printStackTrace(); +// //fail("Cannot find mockXML/raceXML/raceTest.xml in the resources folder"); +// } +// } +// +// @Test +// public void testInvalidParticipant() { +// Map inputParticipants = new HashMap<>(); +// inputParticipants.put(420, new StreamedBoat(420)); +// boatXMLReader.setParticipants(inputParticipants); +// boatXMLReader.read(); +// assertEquals(boatXMLReader.getBoats().size(), 0); +// } +// +// @Test +// public void testValidParticipant() { +// Map inputParticipants = new HashMap<>(); +// inputParticipants.put(101, new StreamedBoat(101)); +// boatXMLReader.setParticipants(inputParticipants); +// boatXMLReader.read(); +// assertEquals(boatXMLReader.getBoats().size(), 1); +// StreamedBoat boat = (StreamedBoat) boatXMLReader.getBoats().get(0); +// assertEquals(boat.getSourceID(), 101); +// } +// +//} diff --git a/visualiser/src/test/java/seng302/Mock/FailBoatXMLTest.java b/visualiser/src/test/java/seng302/Mock/FailBoatXMLTest.java index 02c7bdce..a299c2bf 100644 --- a/visualiser/src/test/java/seng302/Mock/FailBoatXMLTest.java +++ b/visualiser/src/test/java/seng302/Mock/FailBoatXMLTest.java @@ -1,26 +1,26 @@ -package seng302.Mock; - -import org.junit.Test; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.text.ParseException; - -/** - * Created by jjg64 on 1/05/17. - */ -public class FailBoatXMLTest { - private final String path = "mockXML/boatXML/"; - - @Test(expected = NumberFormatException.class) - public void invalidSourceID() throws SAXException, ParserConfigurationException, ParseException, IOException { - new BoatXMLReader(path + "invalidSourceID.xml"); - } - - @Test(expected = NullPointerException.class) - public void insufficientInformation() throws SAXException, ParserConfigurationException, ParseException, IOException { - new BoatXMLReader(path + "insufficientInformation.xml"); - } - -} +//package seng302.Mock; +// +//import org.junit.Test; +//import org.xml.sax.SAXException; +// +//import javax.xml.parsers.ParserConfigurationException; +//import java.io.IOException; +//import java.text.ParseException; +// +///** +// * Created by jjg64 on 1/05/17. +// */ +//public class FailBoatXMLTest { +// private final String path = "mockXML/boatXML/"; +// +// @Test(expected = NumberFormatException.class) +// public void invalidSourceID() throws SAXException, ParserConfigurationException, ParseException, IOException { +// new BoatXMLReader(path + "invalidSourceID.xml"); +// } +// +// @Test(expected = NullPointerException.class) +// public void insufficientInformation() throws SAXException, ParserConfigurationException, ParseException, IOException { +// new BoatXMLReader(path + "insufficientInformation.xml"); +// } +// +//} diff --git a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java index 7b48218c..0c1489af 100644 --- a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java +++ b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java @@ -1,93 +1,93 @@ -package seng302.Model; -/** - * Created by Gondr on 26/03/2017. - */ - -import org.junit.Test; -import seng302.RaceXMLReader; - -import java.util.List; - -import static org.junit.Assert.*; - -public class RaceXMLTest { - RaceXMLReader raceXMLReader; - - @Test - public void canFindFile() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - } catch (Exception e) { - fail("Cannot find raceXML/bermuda_AC35.xml in the resources folder"); - } - } - - @Test - public void canReadBoats() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readBoats(); - List boats = raceXMLReader.getBoats(); - assertTrue(boats.size() == 6); - //test boat 1 - assertEquals(boats.get(0).getName().getValue(), "ORACLE TEAM USA"); - assertTrue(boats.get(0).getVelocity() == 20); - //test boat 2 - assertEquals(boats.get(1).getName().getValue(), "Land Rover BAR"); - assertTrue(boats.get(1).getVelocity() == 30); - assertEquals(boats.get(1).getAbbrev(), "GBR"); - //test boat 3 - assertEquals(boats.get(2).getName().getValue(), "SoftBank Team Japan"); - assertTrue(boats.get(2).getVelocity() == 25); - assertEquals(boats.get(2).getAbbrev(), "JPN"); - //test boat 4 - assertEquals(boats.get(3).getName().getValue(), "Groupama Team France"); - assertTrue(boats.get(3).getVelocity() == 20); - assertEquals(boats.get(3).getAbbrev(), "FRA"); - //test boat 5 - assertEquals(boats.get(4).getName().getValue(), "Artemis Racing"); - assertTrue(boats.get(4).getVelocity() == 29); - assertEquals(boats.get(4).getAbbrev(), "SWE"); - //test boat 6 - assertEquals(boats.get(5).getName().getValue(), "Emirates Team New Zealand"); - assertTrue(boats.get(5).getVelocity() == 62); - assertEquals(boats.get(5).getAbbrev(), "NZL"); - } catch (Exception e) { - fail("Boat Unreadable"); - } - } - - @Test - public void canReadLegs() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readLegs(); - assertTrue(raceXMLReader.getLegs().size() == 5); - } catch (Exception e) { - fail("Legs Unreadable"); - } - } - - @Test - public void canReadCourse() { - try { - RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); - raceXMLReader.readCourse(); - assertTrue(raceXMLReader.getMapTopLeft() != null); - assertTrue(raceXMLReader.getMapBottomRight() != null); - assertTrue(raceXMLReader.getFinishPt1() != null); - assertTrue(raceXMLReader.getFinishPt2() != null); - assertTrue(raceXMLReader.getStartPt1() != null); - assertTrue(raceXMLReader.getStartPt2() != null); - assertTrue(raceXMLReader.getLeewardPt1() != null); - assertTrue(raceXMLReader.getLeewardPt2() != null); - assertTrue(raceXMLReader.getWindwardPt1() != null); - assertTrue(raceXMLReader.getWindwardPt2() != null); - assertTrue(raceXMLReader.getBoundary().size() == 11); - } catch (Exception e) { - e.printStackTrace(); - fail("Course Unreadable"); - } - } - -} \ No newline at end of file +//package seng302.Model; +///** +// * Created by Gondr on 26/03/2017. +// */ +// +//import org.junit.Test; +//import seng302.RaceXMLReader; +// +//import java.util.List; +// +//import static org.junit.Assert.*; +// +//public class RaceXMLTest { +// RaceXMLReader raceXMLReader; +// +// @Test +// public void canFindFile() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// } catch (Exception e) { +// fail("Cannot find raceXML/bermuda_AC35.xml in the resources folder"); +// } +// } +// +// @Test +// public void canReadBoats() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readBoats(); +// List boats = raceXMLReader.getBoats(); +// assertTrue(boats.size() == 6); +// //test boat 1 +// assertEquals(boats.get(0).getName().getValue(), "ORACLE TEAM USA"); +// assertTrue(boats.get(0).getVelocity() == 20); +// //test boat 2 +// assertEquals(boats.get(1).getName().getValue(), "Land Rover BAR"); +// assertTrue(boats.get(1).getVelocity() == 30); +// assertEquals(boats.get(1).getAbbrev(), "GBR"); +// //test boat 3 +// assertEquals(boats.get(2).getName().getValue(), "SoftBank Team Japan"); +// assertTrue(boats.get(2).getVelocity() == 25); +// assertEquals(boats.get(2).getAbbrev(), "JPN"); +// //test boat 4 +// assertEquals(boats.get(3).getName().getValue(), "Groupama Team France"); +// assertTrue(boats.get(3).getVelocity() == 20); +// assertEquals(boats.get(3).getAbbrev(), "FRA"); +// //test boat 5 +// assertEquals(boats.get(4).getName().getValue(), "Artemis Racing"); +// assertTrue(boats.get(4).getVelocity() == 29); +// assertEquals(boats.get(4).getAbbrev(), "SWE"); +// //test boat 6 +// assertEquals(boats.get(5).getName().getValue(), "Emirates Team New Zealand"); +// assertTrue(boats.get(5).getVelocity() == 62); +// assertEquals(boats.get(5).getAbbrev(), "NZL"); +// } catch (Exception e) { +// fail("Boat Unreadable"); +// } +// } +// +// @Test +// public void canReadLegs() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readLegs(); +// assertTrue(raceXMLReader.getLegs().size() == 5); +// } catch (Exception e) { +// fail("Legs Unreadable"); +// } +// } +// +// @Test +// public void canReadCourse() { +// try { +// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); +// raceXMLReader.readCourse(); +// assertTrue(raceXMLReader.getMapTopLeft() != null); +// assertTrue(raceXMLReader.getMapBottomRight() != null); +// assertTrue(raceXMLReader.getFinishPt1() != null); +// assertTrue(raceXMLReader.getFinishPt2() != null); +// assertTrue(raceXMLReader.getStartPt1() != null); +// assertTrue(raceXMLReader.getStartPt2() != null); +// assertTrue(raceXMLReader.getLeewardPt1() != null); +// assertTrue(raceXMLReader.getLeewardPt2() != null); +// assertTrue(raceXMLReader.getWindwardPt1() != null); +// assertTrue(raceXMLReader.getWindwardPt2() != null); +// assertTrue(raceXMLReader.getBoundary().size() == 11); +// } catch (Exception e) { +// e.printStackTrace(); +// fail("Course Unreadable"); +// } +// } +// +//} \ No newline at end of file From ffa3d530aeca0b89fb9e4d933c10a3eb3e611f18 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 21:46:24 +1200 Subject: [PATCH 09/23] Event takes string and sets time of race - RaceXmlReaders can handle strings now - Not working with visualiser, gps coords may be worng #story[881] --- mock/src/main/java/seng302/App.java | 25 +- mock/src/main/java/seng302/Data/BoatData.java | 2 - mock/src/main/java/seng302/Data/RaceData.java | 6 +- .../java/seng302/DataInput/RaceXMLReader.java | 436 +++++++----------- .../java/seng302/DataInput/XMLReader.java | 19 +- .../StreamedCourseXMLException.java | 2 +- mock/src/main/java/seng302/Model/Boat.java | 2 +- mock/src/main/java/seng302/Model/Event.java | 96 ++-- mock/src/main/java/seng302/Model/Race.java | 13 +- .../Model/StreamedCourseXMLReader.java | 274 ----------- mock/src/main/resources/mockXML/raceTest.xml | 4 +- .../java/seng302/Data/RegattaDataTest.java | 1 - .../main/java/seng302/Mock/StreamedBoat.java | 14 - .../java/seng302/Mock/StreamedCourse.java | 1 + .../main/java/seng302/VisualiserInput.java | 3 +- 15 files changed, 275 insertions(+), 623 deletions(-) rename mock/src/main/java/seng302/{Model => Exceptions}/StreamedCourseXMLException.java (78%) delete mode 100644 mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 40077276..3816093d 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -6,13 +6,14 @@ import javafx.stage.Stage; import org.xml.sax.SAXException; import seng302.DataInput.*; import seng302.Model.Event; -import seng302.Model.StreamedCourseXMLException; -import seng302.Model.StreamedCourseXMLReader; +import seng302.Exceptions.StreamedCourseXMLException; +import seng302.DataInput.RaceXMLReader; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.text.ParseException; @@ -30,6 +31,7 @@ public class App extends Application { + static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); @@ -38,21 +40,16 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - RegattaDataSource regattaData = new RegattaXMLReader("mockXML/regattaTest.xml"); - BoatDataSource boatData = new BoatXMLReader("mockXML/boatTest.xml"); - RaceDataSource raceData = new StreamedCourseXMLReader("mockXML/raceTest.xml", boatData); - Event raceEvent = new Event(raceData, regattaData, boatData); + + String regattaXML = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); + String raceXML = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); + String boatXML = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); + + Event raceEvent = new Event(raceXML, regattaXML, boatXML); raceEvent.start(); + } catch (IOException e) { e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (StreamedCourseXMLException e) { - e.printStackTrace(); } } } diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java index c34dc614..4851d53d 100644 --- a/mock/src/main/java/seng302/Data/BoatData.java +++ b/mock/src/main/java/seng302/Data/BoatData.java @@ -66,8 +66,6 @@ public class BoatData { StreamResult result = new StreamResult(stringWriter); transformer.transform(source, result); - - System.out.println(stringWriter.toString()); return stringWriter.toString(); diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java index cabc5471..f4c7cc8c 100644 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ b/mock/src/main/java/seng302/Data/RaceData.java @@ -124,7 +124,7 @@ public class RaceData { */ private void appendRaceStartTime() { Element startTimeElement = doc.createElement("RaceStartTime"); - startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(0)))); + startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(3)))); startTimeElement.setAttribute("Postpone", "false"); rootElement.appendChild(startTimeElement); } @@ -232,19 +232,19 @@ public class RaceData { rootElement.appendChild(courseLimitElement); } + /** * Format time data and return it. * @param time time data. * @return formatted time data. */ private String toTruncatedString(ZonedDateTime time) { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); String text = dateFormat.format(time); return text; + } - } } diff --git a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java index e751aad8..c306ab86 100644 --- a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java @@ -1,376 +1,274 @@ package seng302.DataInput; -import javafx.scene.paint.Color; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; - +import seng302.Exceptions.StreamedCourseXMLException; import seng302.Model.*; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.text.ParseException; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; +import java.time.format.DateTimeFormatter; +import java.util.*; /** - * Created by fwy13 on 26/03/2017. - * @deprecated please use {@link seng302.Model.StreamedCourseXMLReader} + * Created by jjg64 on 21/04/17. */ public class RaceXMLReader extends XMLReader implements RaceDataSource { - private static double COORDINATEPADDING = 0.0005; - private int raceID; - private List boats = new ArrayList<>(); - private Color[] colors = {Color.BLUEVIOLET, Color.BLACK, Color.RED, Color.ORANGE, Color.DARKOLIVEGREEN, Color.LIMEGREEN};//TODO make this established in xml or come up with a better system. - private List legs = new ArrayList<>(); - private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; + private static final double COORDINATEPADDING = 0.000; private GPSCoordinate mapTopLeft, mapBottomRight; - private List boundary = new ArrayList<>(); - private List compoundMarks = new ArrayList<>(); + private final List boundary = new ArrayList<>(); + private final Map compoundMarkMap = new HashMap<>(); + private final Map participants = new HashMap<>(); + private final List legs = new ArrayList<>(); + private final List compoundMarks = new ArrayList<>(); + private ZonedDateTime creationTimeDate; + private ZonedDateTime raceStartTime; + private int raceID; + private String raceType; + private boolean postpone; + + private Map boats; + private Map marks; /** - * Constractor for Race XML - * + * Constructor for Streamed Race XML * @param filePath path of the file - * @throws IOException error - * @throws SAXException error + * @throws IOException error + * @throws SAXException error * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error */ - public RaceXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException { - this(filePath, true); + public RaceXMLReader(String filePath, BoatDataSource boatData) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { + this(filePath, boatData, true); } + + /** - * COnstructor for Race XML - * + * Constructor for Streamed Race XML * @param filePath file path to read - * @param read whether or not to read and store the files straight away. - * @throws IOException error - * @throws SAXException error + * @param read whether or not to read and store the files straight away. + * @throws IOException error + * @throws SAXException error * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error */ - public RaceXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException { + public RaceXMLReader(String filePath, BoatDataSource boatData, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { super(filePath); + this.boats = boatData.getBoats(); + this.marks = boatData.getMarkerBoats(); if (read) { read(); } } /** - * Read the files + * reads + * @throws StreamedCourseXMLException error */ - private void read() { - + private void read() throws StreamedCourseXMLException { + readRace(); + readParticipants(); readCourse(); - readID(); - readLegs(); - readMarkers(); - readBoats(); } /** - * Read in race ID from XML object. + * reads a race */ - public void readID() { - NodeList race = doc.getElementsByTagName("race"); - raceID = Integer.parseInt(getTextValueOfNode((Element) race.item(0), "raceId")); - } + private void readRace() { + DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + Element settings = (Element) doc.getElementsByTagName("Race").item(0); + NamedNodeMap raceTimeTag = doc.getElementsByTagName("RaceStartTime").item(0).getAttributes(); - /** - * Read all the boats in the XML file - */ - public void readBoats() { - //get all boats - NodeList nBoats = doc.getElementsByTagName("boat"); - - for (int i = 0; i < nBoats.getLength(); i++) { - String name = getTextValueOfNode((Element) nBoats.item(i), "name"); - String country = getTextValueOfNode((Element) nBoats.item(i), "abbr"); - int sourceID = Integer.parseInt(getTextValueOfNode((Element) nBoats.item(i), "sourceID")); - Boat boat = new Boat(sourceID, name, country); - boat.setCurrentPosition(startPt1); - if (legs.size() > 0) { - boat.setCurrentLeg(legs.get(0)); - } - boats.add(boat); - } - } + if (raceTimeTag.getNamedItem("Time") != null) dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - /** - * Read all the boats in the XML file - */ - public void readMarkers() { - //get all boats - NodeList nMarkers = doc.getElementsByTagName("marker"); + raceID = Integer.parseInt(getTextValueOfNode(settings, "RaceID")); + raceType = getTextValueOfNode(settings, "RaceType"); - for (int i = 0; i < nMarkers.getLength(); i++) { - CompoundMark compoundMark = getMarker((Element) nMarkers.item(i)); - if (compoundMark.getName() != null) compoundMarks.add(compoundMark); - } - } + creationTimeDate = ZonedDateTime.parse(getTextValueOfNode(settings, "CreationTimeDate"), dateFormat); - /** - * Read all the legs in the XML file - */ - public void readLegs() { - //get all legs - NodeList nLegs = doc.getElementsByTagName("leg"); - - for (int i = 0; i < nLegs.getLength(); i++) { - String label = getTextValueOfNode((Element) nLegs.item(i), "name"); - NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - CompoundMark startCompoundMark = getMarker(start); - NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - CompoundMark finishCompoundMark = getMarker(finish); - legs.add(new Leg(label, startCompoundMark, finishCompoundMark, i)); - } + if (raceTimeTag.getNamedItem("Time") != null) raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Time").getTextContent(), dateFormat); + else raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Start").getTextContent(), dateFormat); + + postpone = Boolean.parseBoolean(raceTimeTag.getNamedItem("Postpone").getTextContent()); } - /** - * Read courses in XML file - */ - public void readCourse() { - NodeList nCourse = doc.getElementsByTagName("course"); - - NodeList nBounds = ((Element) nCourse.item(0)).getElementsByTagName("boundaries"); - nBounds = ((Element) nBounds.item(0)).getElementsByTagName("coordinate"); - int maxLatitudeIndex = 0; - double maxLatitude = -Double.MIN_VALUE; - int maxLongitudeIndex = 0; - double maxLongitude = -180; - int minLatitudeIndex = 0; - double minLatitude = Double.MAX_VALUE; - int minLongitudeIndex = 0; - double minLongitude = Double.MAX_VALUE; - for (int i = 0; i < nBounds.getLength(); i++) { - boundary.add(getCoordinates((Element) nBounds.item(i))); - if (boundary.get(i).getLatitude() > maxLatitude) { - maxLatitudeIndex = i; - maxLatitude = boundary.get(i).getLatitude(); - } - if (boundary.get(i).getLatitude() < minLatitude) { - minLatitudeIndex = i; - minLatitude = boundary.get(i).getLatitude(); - } - if (boundary.get(i).getLongitude() > maxLongitude) { - maxLongitudeIndex = i; - maxLongitude = boundary.get(i).getLongitude(); + private void readParticipants() { + Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0); + nParticipants.getChildNodes().getLength(); + for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) { + int sourceID; + Node yacht = nParticipants.getChildNodes().item(i); + if (yacht.getNodeName().equals("Yacht")) { + if (exists(yacht, "SourceID")) { + sourceID = Integer.parseInt(yacht.getAttributes().getNamedItem("SourceID").getTextContent()); + participants.put(sourceID, boats.get(sourceID)); + } } - if (boundary.get(i).getLongitude() < minLongitude) { - minLongitudeIndex = i; - minLongitude = boundary.get(i).getLongitude(); - } - } - - double difference = 0;//this will hold the largest difference so we can make the map square. - double latitudeDiff = Math.abs(Math.abs(boundary.get(maxLatitudeIndex).getLatitude()) - Math.abs(boundary.get(minLatitudeIndex).getLatitude())); - double longitudeDiff = Math.abs(Math.abs(boundary.get(maxLongitudeIndex).getLongitude()) - Math.abs(boundary.get(minLongitudeIndex).getLongitude())); - if (latitudeDiff >= longitudeDiff) { - difference = latitudeDiff - longitudeDiff; - maxLongitude += difference / 2; - minLongitude -= difference / 2; - } else { - difference = longitudeDiff - latitudeDiff; - maxLatitude += difference / 2; - minLatitude -= difference / 2; } - maxLatitude += COORDINATEPADDING; - minLatitude -= COORDINATEPADDING; - maxLongitude += COORDINATEPADDING; - minLongitude -= COORDINATEPADDING; - //now create map boundaries - //top left canvas point is min logitude, max latitude - //bottom right of canvas point is min longitude, max latitude. - mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); - mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); - - NodeList nMarks = ((Element) nCourse.item(0)).getElementsByTagName("marker"); - startPt1 = getCoordinates(nMarks, 0); - startPt2 = getCoordinates(nMarks, 0, 1); - mark = getCoordinates(nMarks, 1); - windwardPt1 = getCoordinates(nMarks, 2); - windwardPt2 = getCoordinates(nMarks, 2, 1); - leewardPt1 = getCoordinates(nMarks, 3); - leewardPt2 = getCoordinates(nMarks, 3, 1); - finishPt1 = getCoordinates(nMarks, 4); - finishPt2 = getCoordinates(nMarks, 4, 1); - } - - /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @return - */ - private CompoundMark getMarker(NodeList start) { - return getMarker(start, 0); } /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex index in the node that has the coordinate tag - * @return + * reads a course + * @throws StreamedCourseXMLException error */ - private CompoundMark getMarker(NodeList start, int startIndex) { - return getMarker(start, startIndex, 0); + private void readCourse() throws StreamedCourseXMLException { + readCompoundMarks(); + readCompoundMarkSequence(); + readCourseLimit(); } /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex index in the node that has the coordinate tag - * @param nodeIndex coordinate index - * @return + * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. + * @see CompoundMark */ - private CompoundMark getMarker(NodeList start, int startIndex, int nodeIndex) { - NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); - Element marker = (Element) nodeList.item(nodeIndex); - return getMarker(marker); + private void readCompoundMarks() throws StreamedCourseXMLException { + Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); + for(int i = 0; i < nCourse.getChildNodes().getLength(); i++) { + Node compoundMark = nCourse.getChildNodes().item(i); + if(compoundMark.getNodeName().equals("CompoundMark")) { + int compoundMarkID = getCompoundMarkID((Element) compoundMark); + compoundMarkMap.put(compoundMarkID, (Element)compoundMark); + compoundMarks.add(getCompoundMark(compoundMarkID)); + } + } } /** - * gets a changes a marker to GPS coordinates into a marker - * - * @param markerNode marker to turn into coordinates - * @return + * Generates a CompoundMark from the CompoundMark element with given ID. + * @param compoundMarkID index of required CompoundMark element + * @return generated CompoundMark + * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks + * @see CompoundMark */ - private CompoundMark getMarker(Element markerNode) { - - NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); - - GPSCoordinate side1 = getCoordinates((Element) nCoordinates.item(0)); - GPSCoordinate side2; - if (nCoordinates.getLength() > 1) { - side2 = getCoordinates((Element) nCoordinates.item(1)); - } else { - side2 = side1; + private CompoundMark getCompoundMark(int compoundMarkID) throws StreamedCourseXMLException { + Element compoundMark = compoundMarkMap.get(compoundMarkID); + NodeList nMarks = compoundMark.getElementsByTagName("Mark"); + CompoundMark marker; + + switch(nMarks.getLength()) { + case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; + case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; + default: throw new StreamedCourseXMLException(); } - NodeList name = markerNode.getElementsByTagName("name"); - return null;//name.getLength() == 1 ? new CompoundMark(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new CompoundMark(side1, side2); + + return marker; } - /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @return - */ - private GPSCoordinate getCoordinates(NodeList start) { - return getCoordinates(start, 0); + private Mark getMark(Element mark) { + int sourceID = Integer.parseInt(mark.getAttribute("SourceID")); + return marks.get(sourceID); } /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex the index the tag containing the coordinate should be in - * @return + * Reads "compoundMarkID" attribute of CompoundMark or Corner element + * @param element with "compoundMarkID" attribute + * @return value of "compoundMarkID" attribute */ - private GPSCoordinate getCoordinates(NodeList start, int startIndex) { - return getCoordinates(start, startIndex, 0); + private int getCompoundMarkID(Element element) { + return Integer.parseInt(element.getAttribute("CompoundMarkID")); } /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex the index the tag containing the coordinate should be in - * @param nodeIndex The coordinate index - * @return + * Reads "name" attribute of CompoundMark element with corresponding CompoundMarkID + * @param compoundMarkID unique ID for CompoundMark element + * @return value of "name" attribute */ - private GPSCoordinate getCoordinates(NodeList start, int startIndex, int nodeIndex) { - NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("coordinate"); - Element coord = (Element) nodeList.item(nodeIndex); - return getCoordinates(coord); + private String getCompoundMarkName(int compoundMarkID) { + return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); } /** - * Returns the coordinate TODO raise exception that runs when the XML is formatted wrongly. - * - * @param coordNode - * @return + * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. + * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark */ - private GPSCoordinate getCoordinates(Element coordNode) { - - double startLat = Double.parseDouble(getTextValueOfNode(coordNode, "latitude")); - double startLong = Double.parseDouble(getTextValueOfNode(coordNode, "longitude")); - return new GPSCoordinate(startLat, startLong); - } - - public List getBoats() { - return boats; - } - - public List getLegs() { - return legs; + private void readCompoundMarkSequence() throws StreamedCourseXMLException { + Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); + NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); + Element markXML = (Element)nCorners.item(0); + CompoundMark lastCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + String legName = getCompoundMarkName(getCompoundMarkID(markXML)); + for(int i = 1; i < nCorners.getLength(); i++) { + markXML = (Element)nCorners.item(i); + CompoundMark currentCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); + lastCompoundMark = currentCompoundMark; + legName = getCompoundMarkName(getCompoundMarkID(markXML)); + } } - public GPSCoordinate getMark() { - return mark; - } + private void readCourseLimit() { + Element nCourseLimit = (Element) doc.getElementsByTagName("CourseLimit").item(0); + for(int i = 0; i < nCourseLimit.getChildNodes().getLength(); i++) { + Node limit = nCourseLimit.getChildNodes().item(i); + if (limit.getNodeName().equals("Limit")) { + double lat = Double.parseDouble(limit.getAttributes().getNamedItem("Lat").getTextContent()); + double lon = Double.parseDouble(limit.getAttributes().getNamedItem("Lon").getTextContent()); + boundary.add(new GPSCoordinate(lat, lon)); + } + } - public GPSCoordinate getStartPt1() { - return startPt1; - } - public GPSCoordinate getStartPt2() { - return startPt2; - } + double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; + double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double minLongitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - public GPSCoordinate getFinishPt1() { - return finishPt1; + mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); + mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); } - public GPSCoordinate getFinishPt2() { - return finishPt2; + public List getBoundary() { + return boundary; } - public GPSCoordinate getLeewardPt1() { - return leewardPt1; + public GPSCoordinate getMapTopLeft() { + return mapTopLeft; } - public GPSCoordinate getLeewardPt2() { - return leewardPt2; + public GPSCoordinate getMapBottomRight() { + return mapBottomRight; } - public GPSCoordinate getWindwardPt1() { - return windwardPt1; + public List getLegs() { + return legs; } - public GPSCoordinate getWindwardPt2() { - return windwardPt2; - } + public List getCompoundMarks() { return compoundMarks; } - public List getBoundary() { - return boundary; + public Double getPadding() { + return COORDINATEPADDING; } - public GPSCoordinate getMapTopLeft() { - return mapTopLeft; + public ZonedDateTime getCreationTimeDate() { + return creationTimeDate; } - public GPSCoordinate getMapBottomRight() { - return mapBottomRight; + public ZonedDateTime getZonedDateTime() { + return raceStartTime; } public int getRaceId() { return raceID; } - public List getCompoundMarks() { - return compoundMarks; + public String getRaceType() { + return raceType; } - public String getRaceType() { - return "FLEET"; + public boolean isPostpone() { + return postpone; } - @Override - public ZonedDateTime getZonedDateTime() { - return null; + public List getBoats() { + return new ArrayList<>(participants.values()); } } diff --git a/mock/src/main/java/seng302/DataInput/XMLReader.java b/mock/src/main/java/seng302/DataInput/XMLReader.java index b2b89e30..e24fb160 100644 --- a/mock/src/main/java/seng302/DataInput/XMLReader.java +++ b/mock/src/main/java/seng302/DataInput/XMLReader.java @@ -3,6 +3,7 @@ package seng302.DataInput; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; @@ -10,6 +11,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; /** * Created by fwy13 on 26/03/2017. @@ -26,13 +28,28 @@ public abstract class XMLReader { * @throws SAXException */ public XMLReader(String filePath) throws ParserConfigurationException, IOException, SAXException { - InputStream fXmlFile = getClass().getClassLoader().getResourceAsStream(filePath); + + + + InputSource fXmlFile; + if (filePath.contains("<")) { + fXmlFile = new InputSource(); + fXmlFile.setCharacterStream(new StringReader(filePath)); + + } else { + fXmlFile = new InputSource(getClass().getClassLoader().getResourceAsStream(filePath)); + } + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); } + public XMLReader(String xmlFile, Boolean isWholeFile) { + + } + /** * Return Document data of the read-in XML * @return XML document diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java b/mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java similarity index 78% rename from mock/src/main/java/seng302/Model/StreamedCourseXMLException.java rename to mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java index 453bacfd..eb21e0fa 100644 --- a/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java +++ b/mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java @@ -1,4 +1,4 @@ -package seng302.Model; +package seng302.Exceptions; /** * Created by cbt24 on 25/04/17. diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index a53e6626..91fe6f24 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -27,7 +27,7 @@ public class Boat { * @param country nam abbreviation */ public Boat(int sourceID, String name, String country) { - this.velocity = 5; // TODO - please dont commit + this.velocity = 30; // TODO - please dont commit this.country = this.country; this.name = name; this.sourceID = sourceID; diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 25a303d6..3d49c1d3 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -1,21 +1,19 @@ package seng302.Model; -import seng302.Data.BoatData; -import seng302.Data.RaceData; -import seng302.Data.RegattaData; -import seng302.DataInput.BoatDataSource; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RegattaDataSource; -import seng302.Exceptions.InvalidBoatDataException; -import seng302.Exceptions.InvalidRaceDataException; -import seng302.Exceptions.InvalidRegattaDataException; +import org.xml.sax.SAXException; +import seng302.DataInput.*; +import seng302.Exceptions.StreamedCourseXMLException; import seng302.MockOutput; +import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; +import java.text.ParseException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; /** @@ -24,59 +22,87 @@ import java.nio.file.Paths; public class Event { RaceDataSource raceDataSource; + String raceXML; RegattaDataSource regattaDataSource; + String regattaXML; BoatDataSource boatDataSource; - + String boatXML; MockOutput mockOutput; - public Event(RaceDataSource raceData, RegattaDataSource regattaData, BoatDataSource boatDataSource) { - this.raceDataSource = raceData; - this.regattaDataSource = regattaData; - this.boatDataSource = boatDataSource; + + public Event(String raceXML, String regattaXML, String boatXML) { + + this.raceXML = getRaceAtCurrentTime(raceXML); + this.boatXML = boatXML; + this.regattaXML = regattaXML; + try { + boatDataSource = new BoatXMLReader(boatXML); + raceDataSource = new RaceXMLReader(this.raceXML, boatDataSource); + regattaDataSource = new RegattaXMLReader(regattaXML); + mockOutput = new MockOutput(); new Thread(mockOutput).start(); + + } catch (ParserConfigurationException e) { + e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (StreamedCourseXMLException e) { + e.printStackTrace(); } + + } + + private String getRaceAtCurrentTime(String raceXML) { + ZonedDateTime creationTime = ZonedDateTime.now(); + return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime)) + .replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3))); } /** * Send the initial race data and then begin race simulation */ public void start() { - sendXMLs(); - int scaleFactor = 5;//TEMP - was 15. + int scaleFactor = 10;//TEMP - was 15. Race newRace = new Race(raceDataSource, scaleFactor, mockOutput); new Thread((newRace)).start(); } private void sendXMLs() { - try { - System.out.println("Sending Regatta"); - String regattaData = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); - mockOutput.setRegattaXml(regattaData); - mockOutput.parseXMLString(regattaData, 26); + System.out.println("Sending Regatta"); + mockOutput.setRegattaXml(regattaXML); + mockOutput.parseXMLString(regattaXML, 26); + + System.out.println("Sending Race"); + mockOutput.setRaceXml(raceXML); + System.out.println(raceXML); + mockOutput.parseXMLString(raceXML, 26); + + System.out.println("Sending Boat"); + mockOutput.setBoatsXml(boatXML); + mockOutput.parseXMLString(boatXML, 26); - System.out.println("Sending Race"); - String raceData = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); - mockOutput.setRaceXml(raceData); - mockOutput.parseXMLString(raceData, 26); - System.out.println("Sending Boat"); - String boatData = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); - mockOutput.setBoatsXml(boatData); - mockOutput.parseXMLString(boatData, 26); - } catch (IOException e) { - e.printStackTrace(); - } } - static String readFile(String path, Charset encoding) throws IOException { - byte[] encoded = Files.readAllBytes(Paths.get(path)); - return new String(encoded, encoding); + /** + * Format time data and return it. + * @param time time data. + * @return formatted time data. + */ + private String toTruncatedString(ZonedDateTime time) { + DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); + String text = dateFormat.format(time); + return text; } + } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 05f0d7f7..52cf85ac 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -25,13 +25,13 @@ import java.util.Random; * Created by fwy13 on 3/03/17. */ public class Race implements Runnable { - //protected Boat[] startingBoats; + protected ObservableList startingBoats; protected List legs; protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scaleFactor=25; - protected int PRERACE_TIME = 180000; //time in milliseconds to pause during pre-race. At the moment, 3 minutes + protected int scaleFactor = 25; + protected int PRERACE_TIME = 1800; //time in milliseconds to pause during pre-race. At the moment, 3 minutes private long startTime; protected boolean countdownFinish = false; protected boolean runRace = true; @@ -59,7 +59,7 @@ public class Race implements Runnable { this.scaleFactor = scaleFactor; this.mockOutput = mockOutput; - //TODO refactor + this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); if (startingBoats != null && startingBoats.size() > 0) { @@ -83,7 +83,6 @@ public class Race implements Runnable { public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { //Find new coordinate using current heading and distance - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); //Load start point into calculator Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); @@ -93,6 +92,7 @@ public class Race implements Runnable { //get new point Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); + System.out.println(endPoint.getX()); return new GPSCoordinate(endPoint.getY(), endPoint.getX()); } @@ -121,6 +121,7 @@ public class Race implements Runnable { @Override public void handle(long arg0) { timeLeft = startTime - currentTime; + System.out.println(timeLeft); ArrayList boatStatuses = new ArrayList<>(); //For each boat, we update it's position, and generate a BoatLocationMessage. for (int i = 0; i < startingBoats.size(); i++) { @@ -165,6 +166,7 @@ public class Race implements Runnable { for (Boat boat : startingBoats) { boat.setStarted(true); + System.out.println(boat.getName()); } new AnimationTimer() { @@ -208,6 +210,7 @@ public class Race implements Runnable { } boatOffset = (boatOffset + 1) % (startingBoats.size()); RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses);//TODO FIX the second currentTime is a placeholder! Also, replace magic values. + System.out.println(raceStatus.getBoatStatuses().get(0).getLegNumber()); mockOutput.parseRaceStatus(raceStatus); } } diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java b/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java deleted file mode 100644 index 9a089e41..00000000 --- a/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java +++ /dev/null @@ -1,274 +0,0 @@ -package seng302.Model; - -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import seng302.DataInput.BoatDataSource; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.XMLReader; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.text.ParseException; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; - -/** - * Created by jjg64 on 21/04/17. - */ -public class StreamedCourseXMLReader extends XMLReader implements RaceDataSource { - private static final double COORDINATEPADDING = 0.000; - private GPSCoordinate mapTopLeft, mapBottomRight; - private final List boundary = new ArrayList<>(); - private final Map compoundMarkMap = new HashMap<>(); - private final Map participants = new HashMap<>(); - private final List legs = new ArrayList<>(); - private final List compoundMarks = new ArrayList<>(); - private ZonedDateTime creationTimeDate; - private ZonedDateTime raceStartTime; - private int raceID; - private String raceType; - private boolean postpone; - - private Map boats; - private Map marks; - - /** - * Constructor for Streamed Race XML - * @param filePath path of the file - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - * @throws ParseException error - * @throws StreamedCourseXMLException error - */ - public StreamedCourseXMLReader(String filePath, BoatDataSource boatData) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { - this(filePath, boatData, true); - } - - /** - * Constructor for Streamed Race XML - * @param filePath file path to read - * @param read whether or not to read and store the files straight away. - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - * @throws ParseException error - * @throws StreamedCourseXMLException error - */ - public StreamedCourseXMLReader(String filePath, BoatDataSource boatData, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { - super(filePath); - this.boats = boatData.getBoats(); - this.marks = boatData.getMarkerBoats(); - if (read) { - read(); - } - } - - /** - * reads - * @throws StreamedCourseXMLException error - */ - private void read() throws StreamedCourseXMLException { - readRace(); - readParticipants(); - readCourse(); - } - - /** - * reads a race - */ - private void readRace() { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - Element settings = (Element) doc.getElementsByTagName("Race").item(0); - NamedNodeMap raceTimeTag = doc.getElementsByTagName("RaceStartTime").item(0).getAttributes(); - - if (raceTimeTag.getNamedItem("Time") != null) dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - - - raceID = Integer.parseInt(getTextValueOfNode(settings, "RaceID")); - raceType = getTextValueOfNode(settings, "RaceType"); - - creationTimeDate = ZonedDateTime.parse(getTextValueOfNode(settings, "CreationTimeDate"), dateFormat); - - if (raceTimeTag.getNamedItem("Time") != null) raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Time").getTextContent(), dateFormat); - else raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Start").getTextContent(), dateFormat); - - postpone = Boolean.parseBoolean(raceTimeTag.getNamedItem("Postpone").getTextContent()); - } - - private void readParticipants() { - Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0); - nParticipants.getChildNodes().getLength(); - for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) { - int sourceID; - Node yacht = nParticipants.getChildNodes().item(i); - if (yacht.getNodeName().equals("Yacht")) { - if (exists(yacht, "SourceID")) { - sourceID = Integer.parseInt(yacht.getAttributes().getNamedItem("SourceID").getTextContent()); - participants.put(sourceID, boats.get(sourceID)); - } - } - } - } - - /** - * reads a course - * @throws StreamedCourseXMLException error - */ - private void readCourse() throws StreamedCourseXMLException { - readCompoundMarks(); - readCompoundMarkSequence(); - readCourseLimit(); - } - - /** - * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. - * @see CompoundMark - */ - private void readCompoundMarks() throws StreamedCourseXMLException { - Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); - for(int i = 0; i < nCourse.getChildNodes().getLength(); i++) { - Node compoundMark = nCourse.getChildNodes().item(i); - if(compoundMark.getNodeName().equals("CompoundMark")) { - int compoundMarkID = getCompoundMarkID((Element) compoundMark); - compoundMarkMap.put(compoundMarkID, (Element)compoundMark); - compoundMarks.add(getCompoundMark(compoundMarkID)); - } - } - } - - /** - * Generates a CompoundMark from the CompoundMark element with given ID. - * @param compoundMarkID index of required CompoundMark element - * @return generated CompoundMark - * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks - * @see CompoundMark - */ - private CompoundMark getCompoundMark(int compoundMarkID) throws StreamedCourseXMLException { - Element compoundMark = compoundMarkMap.get(compoundMarkID); - NodeList nMarks = compoundMark.getElementsByTagName("Mark"); - CompoundMark marker; - - switch(nMarks.getLength()) { - case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; - case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; - default: throw new StreamedCourseXMLException(); - } - - return marker; - } - - private Mark getMark(Element mark) { - int sourceID = Integer.parseInt(mark.getAttribute("SourceID")); - System.out.println(marks.get(sourceID).getPosition()); - return marks.get(sourceID); - } - - /** - * Reads "compoundMarkID" attribute of CompoundMark or Corner element - * @param element with "compoundMarkID" attribute - * @return value of "compoundMarkID" attribute - */ - private int getCompoundMarkID(Element element) { - return Integer.parseInt(element.getAttribute("CompoundMarkID")); - } - - /** - * Reads "name" attribute of CompoundMark element with corresponding CompoundMarkID - * @param compoundMarkID unique ID for CompoundMark element - * @return value of "name" attribute - */ - private String getCompoundMarkName(int compoundMarkID) { - return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); - } - - /** - * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. - * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark - */ - private void readCompoundMarkSequence() throws StreamedCourseXMLException { - Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); - NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); - Element markXML = (Element)nCorners.item(0); - CompoundMark lastCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); - String legName = getCompoundMarkName(getCompoundMarkID(markXML)); - for(int i = 1; i < nCorners.getLength(); i++) { - markXML = (Element)nCorners.item(i); - CompoundMark currentCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); - legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); - lastCompoundMark = currentCompoundMark; - legName = getCompoundMarkName(getCompoundMarkID(markXML)); - } - } - - private void readCourseLimit() { - Element nCourseLimit = (Element) doc.getElementsByTagName("CourseLimit").item(0); - for(int i = 0; i < nCourseLimit.getChildNodes().getLength(); i++) { - Node limit = nCourseLimit.getChildNodes().item(i); - if (limit.getNodeName().equals("Limit")) { - double lat = Double.parseDouble(limit.getAttributes().getNamedItem("Lat").getTextContent()); - double lon = Double.parseDouble(limit.getAttributes().getNamedItem("Lon").getTextContent()); - boundary.add(new GPSCoordinate(lat, lon)); - } - } - - - double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; - double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; - double minLongitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - - mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); - mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); - } - - public List getBoundary() { - return boundary; - } - - public GPSCoordinate getMapTopLeft() { - return mapTopLeft; - } - - public GPSCoordinate getMapBottomRight() { - return mapBottomRight; - } - - public List getLegs() { - return legs; - } - - public List getCompoundMarks() { return compoundMarks; } - - public Double getPadding() { - return COORDINATEPADDING; - } - - public ZonedDateTime getCreationTimeDate() { - return creationTimeDate; - } - - public ZonedDateTime getZonedDateTime() { - return raceStartTime; - } - - public int getRaceId() { - return raceID; - } - - public String getRaceType() { - return raceType; - } - - public boolean isPostpone() { - return postpone; - } - - public List getBoats() { - return new ArrayList<>(participants.values()); - } -} diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index 40a509a2..85ff00eb 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -2,8 +2,8 @@ 5326 FLEET - 2017-05-10T12:35:19+1200 - + CREATION_TIME + diff --git a/mock/src/test/java/seng302/Data/RegattaDataTest.java b/mock/src/test/java/seng302/Data/RegattaDataTest.java index c3040498..da2d833e 100644 --- a/mock/src/test/java/seng302/Data/RegattaDataTest.java +++ b/mock/src/test/java/seng302/Data/RegattaDataTest.java @@ -4,7 +4,6 @@ import org.junit.Before; import org.junit.Test; import org.xml.sax.SAXException; import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RaceXMLReader; import seng302.DataInput.RegattaDataSource; import seng302.DataInput.RegattaXMLReader; diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index d4485b5a..d5134cc0 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -29,18 +29,4 @@ public class StreamedBoat extends Boat { return sourceID; } - /** - * Calculates the azimuth of the travel via heading of the boat - * - * @return the direction that the boat is heading towards in degrees (-180 to 180). - */ - public double calculateAzimuth() { - double azimuth; - if (heading <= 180) { - azimuth = heading; - } else { - azimuth = -heading + 180; - } - return azimuth; - } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 1233b519..6301f584 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -33,6 +33,7 @@ public class StreamedCourse extends Observable implements RaceDataSource { this.boatXMLReader = boatXMLReader; if (streamedCourseXMLReader != null && boatXMLReader != null) { this.boatXMLReader.setParticipants(streamedCourseXMLReader.getParticipants()); + System.out.println(streamedCourseXMLReader.getParticipants().size()); boatXMLReader.read(); } diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index ffba53c3..e35c4b7f 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -219,7 +219,6 @@ public class VisualiserInput implements Runnable { //If no heartbeat has been received in more the heartbeat period //then the connection will need to be restarted. - System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE long heartBeatPeriod = 10 * 1000; if (timeSinceHeartbeat() > heartBeatPeriod) { System.out.println("Connection has stopped, trying to reconnect."); @@ -369,6 +368,8 @@ public class VisualiserInput implements Runnable { BoatLocation boatLocation = (BoatLocation) message; //System.out.println("Boat Location!"); + //System.out.println(boatLocation.getSourceID()); + if (this.boatLocationMap.containsKey(boatLocation.getSourceID())) { //If our boatlocation map already contains a boat location message for this boat, check that the new message is actually for a later timestamp (i.e., newer). if (boatLocation.getTime() > this.boatLocationMap.get(boatLocation.getSourceID()).getTime()){ From 081a7d56668eb886ff7584644aa3b19277bef1a2 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 22:23:49 +1200 Subject: [PATCH 10/23] Attempting to solve boats not apearing problem - Appears to be becaus elat and long are getting switched somewhere #story[881] --- mock/src/main/java/seng302/Model/Race.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 52cf85ac..b5112550 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -59,13 +59,7 @@ public class Race implements Runnable { this.scaleFactor = scaleFactor; this.mockOutput = mockOutput; - this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); - - if (startingBoats != null && startingBoats.size() > 0) { - initialiseBoats(); - } - } public Race(RaceDataSource raceData, int scaleFactor, MockOutput mockOutput) { @@ -201,7 +195,7 @@ public class Race implements Runnable { boat.getCurrentLeg().getLegNumber() >= 0 ? BoatStatusEnum.RACING : BoatStatusEnum.DNF, boat.getCurrentLeg().getLegNumber())); } if (startingBoats.size()==finished){ - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 4, startTime, 0, 2300, 2, boatStatuses);//TODO FIX the second currentTime is a placeholder! Also, replace magic values. + RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 4, startTime, 0, 2300, 2, boatStatuses); mockOutput.parseRaceStatus(raceStatus); } } else { @@ -209,8 +203,7 @@ public class Race implements Runnable { } } boatOffset = (boatOffset + 1) % (startingBoats.size()); - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses);//TODO FIX the second currentTime is a placeholder! Also, replace magic values. - System.out.println(raceStatus.getBoatStatuses().get(0).getLegNumber()); + RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses); mockOutput.parseRaceStatus(raceStatus); } } @@ -218,7 +211,6 @@ public class Race implements Runnable { } public void initialiseBoats() { Leg officialStart = legs.get(0); - String name = officialStart.getName(); ArrayList startingPositions = getSpreadStartingPositions(); for (int i = 0; i < startingBoats.size(); i++) { @@ -226,6 +218,7 @@ public class Race implements Runnable { if (boat != null) { boat.setScaledVelocity(boat.getVelocity() * scaleFactor); boat.setCurrentPosition(startingPositions.get(i)); + System.out.println(boat.getCurrentPosition()); boat.setCurrentLeg(officialStart); boat.setHeading(boat.calculateHeading()); } @@ -242,6 +235,8 @@ public class Race implements Runnable { int nBoats = startingBoats.size(); Marker compoundMark = legs.get(0).getStartCompoundMark(); + System.out.println(compoundMark.getAverageGPSCoordinate()); + GeodeticCalculator initialCalc = new GeodeticCalculator(); initialCalc.setStartingGeographicPoint(compoundMark.getMark1().getLongitude(), compoundMark.getMark1().getLatitude()); initialCalc.setDestinationGeographicPoint(compoundMark.getMark2().getLongitude(), compoundMark.getMark2().getLatitude()); @@ -259,6 +254,7 @@ public class Race implements Runnable { Point2D position = positionCalc.getDestinationGeographicPoint(); positions.add(new GPSCoordinate(position.getY(), position.getX())); + System.out.println(position.getX()); positionCalc = new GeodeticCalculator(); positionCalc.setStartingGeographicPoint(position); } From af3dfbad059256e930ef6a1f03b00053228b93ca Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 22:33:29 +1200 Subject: [PATCH 11/23] Fixed boats not displayinggit stash - Was gps coordinates being initialised with X and Y switched around #story[881] --- mock/src/main/java/seng302/DataInput/BoatXMLReader.java | 2 +- mock/src/main/java/seng302/DataInput/RaceXMLReader.java | 4 ++-- mock/src/main/java/seng302/Model/Race.java | 6 ------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java index 39f6b13e..16edd1de 100644 --- a/mock/src/main/java/seng302/DataInput/BoatXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/BoatXMLReader.java @@ -99,7 +99,7 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource { Node nCoord = ((Element)boatNode).getElementsByTagName("GPSposition").item(0); double x = Double.parseDouble(nCoord.getAttributes().getNamedItem("X").getTextContent()); double y = Double.parseDouble(nCoord.getAttributes().getNamedItem("Y").getTextContent()); - Mark mark = new Mark(sourceID, name, new GPSCoordinate(x,y)); + Mark mark = new Mark(sourceID, name, new GPSCoordinate(y,x)); markerMap.put(sourceID, mark); } diff --git a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java index c306ab86..60b01d79 100644 --- a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java @@ -155,7 +155,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { CompoundMark marker; switch(nMarks.getLength()) { - case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; + case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); + break; case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; default: throw new StreamedCourseXMLException(); } @@ -216,7 +217,6 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { } } - double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index b5112550..a1775ecc 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -86,7 +86,6 @@ public class Race implements Runnable { //get new point Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - System.out.println(endPoint.getX()); return new GPSCoordinate(endPoint.getY(), endPoint.getX()); } @@ -115,7 +114,6 @@ public class Race implements Runnable { @Override public void handle(long arg0) { timeLeft = startTime - currentTime; - System.out.println(timeLeft); ArrayList boatStatuses = new ArrayList<>(); //For each boat, we update it's position, and generate a BoatLocationMessage. for (int i = 0; i < startingBoats.size(); i++) { @@ -160,7 +158,6 @@ public class Race implements Runnable { for (Boat boat : startingBoats) { boat.setStarted(true); - System.out.println(boat.getName()); } new AnimationTimer() { @@ -218,7 +215,6 @@ public class Race implements Runnable { if (boat != null) { boat.setScaledVelocity(boat.getVelocity() * scaleFactor); boat.setCurrentPosition(startingPositions.get(i)); - System.out.println(boat.getCurrentPosition()); boat.setCurrentLeg(officialStart); boat.setHeading(boat.calculateHeading()); } @@ -235,7 +231,6 @@ public class Race implements Runnable { int nBoats = startingBoats.size(); Marker compoundMark = legs.get(0).getStartCompoundMark(); - System.out.println(compoundMark.getAverageGPSCoordinate()); GeodeticCalculator initialCalc = new GeodeticCalculator(); initialCalc.setStartingGeographicPoint(compoundMark.getMark1().getLongitude(), compoundMark.getMark1().getLatitude()); @@ -254,7 +249,6 @@ public class Race implements Runnable { Point2D position = positionCalc.getDestinationGeographicPoint(); positions.add(new GPSCoordinate(position.getY(), position.getX())); - System.out.println(position.getX()); positionCalc = new GeodeticCalculator(); positionCalc.setStartingGeographicPoint(position); } From 1a780d6955ca82fa5b0aac8a6a566ee6a4ec5d8b Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 23:31:32 +1200 Subject: [PATCH 12/23] Fixed spread starting positions being reset at start of race #story[881] --- mock/src/main/java/seng302/Model/Race.java | 29 +++++++++------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index a1775ecc..334d1fbe 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -30,8 +30,8 @@ public class Race implements Runnable { protected List legs; protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scaleFactor = 25; - protected int PRERACE_TIME = 1800; //time in milliseconds to pause during pre-race. At the moment, 3 minutes + protected int scaleFactor = 20; + protected int PRERACE_TIME = 18000; //time in milliseconds to pause during pre-race. At the moment, 3 minutes private long startTime; protected boolean countdownFinish = false; protected boolean runRace = true; @@ -42,7 +42,6 @@ public class Race implements Runnable { private static int boatOffset = 0; private int finished = 0; - /** * Initailiser for Race * @@ -106,23 +105,17 @@ public class Race implements Runnable { protected void countdownTimer() { AnimationTimer timer = new AnimationTimer() { long currentTime = System.currentTimeMillis(); - //long startTime = currentTime + (PRERACE_TIME / scaleFactor); - //long minutes; - //long hours; long timeLeft; @Override public void handle(long arg0) { timeLeft = startTime - currentTime; ArrayList boatStatuses = new ArrayList<>(); - //For each boat, we update it's position, and generate a BoatLocationMessage. + //For each boat, we update its position, and generate a BoatLocationMessage. for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get((i + boatOffset) % startingBoats.size()); - if (boat != null) { - mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); - boatStatuses.add(new BoatStatus(boat.getSourceID(), - boat.getCurrentLeg().getLegNumber() >= 0 ? BoatStatusEnum.RACING : BoatStatusEnum.DNF, boat.getCurrentLeg().getLegNumber())); - } + mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); + boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.RACING, boat.getCurrentLeg().getLegNumber())); } boatOffset = (boatOffset + 1) % (startingBoats.size()); @@ -145,7 +138,6 @@ public class Race implements Runnable { } }; timer.start(); - //countdownFinish = true; } /** @@ -160,6 +152,7 @@ public class Race implements Runnable { boat.setStarted(true); } + new AnimationTimer() { //Start time of loop. long timeRaceStarted = System.currentTimeMillis(); @@ -171,7 +164,7 @@ public class Race implements Runnable { long currentTime = System.currentTimeMillis(); //Update the total elapsed time. totalTimeElapsed = currentTime - timeRaceStarted; - ArrayList boatStatuses = new ArrayList(); + ArrayList boatStatuses = new ArrayList<>(); finished = 0; //For each boat, we update it's position, and generate a BoatLocationMessage. for (int i = 0; i < startingBoats.size(); i++) { @@ -208,19 +201,21 @@ public class Race implements Runnable { } public void initialiseBoats() { Leg officialStart = legs.get(0); + String name = officialStart.getName(); + Marker endMark = officialStart.getEndCompoundMark(); ArrayList startingPositions = getSpreadStartingPositions(); for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get(i); if (boat != null) { + Leg newLeg = new Leg(name, new Marker(startingPositions.get(i)), endMark, 0); + boat.setCurrentLeg(newLeg); boat.setScaledVelocity(boat.getVelocity() * scaleFactor); boat.setCurrentPosition(startingPositions.get(i)); - boat.setCurrentLeg(officialStart); boat.setHeading(boat.calculateHeading()); } } } - /** * Creates a list of starting positions for the different boats, so they do not appear cramped at the start line * @@ -231,7 +226,6 @@ public class Race implements Runnable { int nBoats = startingBoats.size(); Marker compoundMark = legs.get(0).getStartCompoundMark(); - GeodeticCalculator initialCalc = new GeodeticCalculator(); initialCalc.setStartingGeographicPoint(compoundMark.getMark1().getLongitude(), compoundMark.getMark1().getLatitude()); initialCalc.setDestinationGeographicPoint(compoundMark.getMark2().getLongitude(), compoundMark.getMark2().getLatitude()); @@ -249,6 +243,7 @@ public class Race implements Runnable { Point2D position = positionCalc.getDestinationGeographicPoint(); positions.add(new GPSCoordinate(position.getY(), position.getX())); + positionCalc = new GeodeticCalculator(); positionCalc.setStartingGeographicPoint(position); } From e7f84eaf8381c243388d24c09657f4fea9154036 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 23:43:42 +1200 Subject: [PATCH 13/23] Refactored Event Class #story[881] --- mock/src/main/java/seng302/App.java | 22 +- mock/src/main/java/seng302/Constants.java | 1 - mock/src/main/java/seng302/Data/BoatData.java | 218 --------------- mock/src/main/java/seng302/Data/RaceData.java | 250 ------------------ .../main/java/seng302/Data/RegattaData.java | 169 ------------ mock/src/main/java/seng302/Model/Event.java | 52 ++-- mock/src/main/java/seng302/Model/Race.java | 8 +- 7 files changed, 25 insertions(+), 695 deletions(-) delete mode 100644 mock/src/main/java/seng302/Data/BoatData.java delete mode 100644 mock/src/main/java/seng302/Data/RaceData.java delete mode 100644 mock/src/main/java/seng302/Data/RegattaData.java diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 3816093d..17afabbc 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -3,20 +3,14 @@ package seng302; import javafx.application.Application; import javafx.stage.Stage; -import org.xml.sax.SAXException; -import seng302.DataInput.*; -import seng302.Model.Event; -import seng302.Exceptions.StreamedCourseXMLException; -import seng302.DataInput.RaceXMLReader; +import seng302.Model.Event; -import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.text.ParseException; public class App extends Application { @@ -29,14 +23,6 @@ public class App extends Application { launch(args); } - - - - static String readFile(String path, Charset encoding) throws IOException { - byte[] encoded = Files.readAllBytes(Paths.get(path)); - return new String(encoded, encoding); - } - @Override public void start(Stage primaryStage) { try { @@ -52,4 +38,10 @@ public class App extends Application { e.printStackTrace(); } } + + static String readFile(String path, Charset encoding) throws IOException { + byte[] encoded = Files.readAllBytes(Paths.get(path)); + return new String(encoded, encoding); + } + } diff --git a/mock/src/main/java/seng302/Constants.java b/mock/src/main/java/seng302/Constants.java index cd2909bd..04eee894 100644 --- a/mock/src/main/java/seng302/Constants.java +++ b/mock/src/main/java/seng302/Constants.java @@ -8,5 +8,4 @@ public class Constants { public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters - } diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java deleted file mode 100644 index 4851d53d..00000000 --- a/mock/src/main/java/seng302/Data/BoatData.java +++ /dev/null @@ -1,218 +0,0 @@ -package seng302.Data; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import seng302.Exceptions.InvalidBoatDataException; -import seng302.Model.Boat; - - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.StringWriter; -import java.util.List; - -/** - * Created by esa46 on 25/04/17. - */ -public class BoatData { - - Document doc; - private List boatData; - - - public BoatData(List boatData) { - this.boatData = boatData; - } - - /** - * Creates an AC35 officially formatted xml description of boats competing in a race - * - * @return String containing xml-formatted boats description - */ - public String createXML() { - - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - - //root element - doc = docBuilder.newDocument(); - Element rootElement = doc.createElement("BoatConfig"); - doc.appendChild(rootElement); - - //Boats element - Element boats = doc.createElement("Boats"); - rootElement.appendChild(boats); - - appendIndividualBoats(boats); - - // write the content into xml file - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - DOMSource source = new DOMSource(doc); - - //Serialize document. - StringWriter stringWriter = new StringWriter(); - StreamResult result = new StreamResult(stringWriter); - transformer.transform(source, result); - - return stringWriter.toString(); - - - } catch (ParserConfigurationException pce) { - throw new InvalidBoatDataException(); - } catch (TransformerException tfe) { - throw new InvalidBoatDataException(); - } - } - - - /** - * Runs through competing boats, creating an element for each - * - * @param boatsElement boats element to be added to - */ - private void appendIndividualBoats(Element boatsElement) { - - for (int i = 0; i < boatData.size(); i++) { - Element boat = doc.createElement("Boat"); - appendType(boat); - appendSourceID(boat, i); - appendShapeID(boat); - appendHullNum(boat); - appendStoweName(boat, i); - appendShortName(boat, i); - appendBoatName(boat, i); - appendGPSCoords(boat, i); - //Write boat to boats - boatsElement.appendChild(boat); - } - } - - /** - * Creates and appends type attribute of a boat - * - * @param boat element being added to - */ - private void appendType(Element boat) { - //Type attribute - Attr attrType = doc.createAttribute("Type"); - attrType.setValue("Yacht"); - boat.setAttributeNode(attrType); - } - - /** - * Creates and appends sourceID attribute of a boat - * - * @param boat element being added to - * @param i boat number - */ - private void appendSourceID(Element boat, int i) { - //SourceID attribute - Attr attrSourceID = doc.createAttribute("SourceID"); - attrSourceID.setValue(Integer.toString(boatData.get(i).getSourceID())); - boat.setAttributeNode(attrSourceID); - } - - /** - * Creates and appends shapeID attribute of a boat - * - * @param boat element being added to - */ - private void appendShapeID(Element boat) { - //ShapeID attribute - Attr attrShapeID = doc.createAttribute("ShapeID"); - attrShapeID.setValue("0"); - boat.setAttributeNode(attrShapeID); - } - - /** - * Creates and appends hull name attribute of a boat - * - * @param boat element being added to - */ - private void appendHullNum(Element boat) { - //HullNum attribute - Attr attrHullNum = doc.createAttribute("HullNum"); - attrHullNum.setValue("RG01"); - boat.setAttributeNode(attrHullNum); - } - - /** - * Creates and appends stow name attribute of a boat - * - * @param boat element being added to - * @param i boat number - */ - private void appendStoweName(Element boat, int i) { - //StoweName attribute - Attr attrStoweName = doc.createAttribute("StoweName"); - attrStoweName.setValue(boatData.get(i).getCountry()); - boat.setAttributeNode(attrStoweName); - } - - /** - * Creates and appends short name attribute of a boat - * - * @param boat element being added to - * @param i boat number - */ - private void appendShortName(Element boat, int i) { - //ShortName attribute - Attr attrShortName = doc.createAttribute("ShortName"); - attrShortName.setValue(boatData.get(i).getCountry()); - boat.setAttributeNode(attrShortName); - } - - /** - * Creates and appends boat name attribute of a boat - * - * @param boat element being added to - * @param i boat number - */ - private void appendBoatName(Element boat, int i) { - //BoatName attribute - Attr attrBoatName = doc.createAttribute("BoatName"); - attrBoatName.setValue(boatData.get(i).getName()); - boat.setAttributeNode(attrBoatName); - } - - /** - * Creates and appends gps attributes of a boat - * - * @param boat element being added to - * @param i boat number - */ - private void appendGPSCoords(Element boat, int i) { - //GPSCoord for element - Element GPSCoord = doc.createElement("GPSposition"); - //Z axis attribute - Attr attrZCoord = doc.createAttribute("Z"); - attrZCoord.setValue("0"); - GPSCoord.setAttributeNode(attrZCoord); - - //Y axis attribute - Attr attrYCoord = doc.createAttribute("Y"); - attrYCoord.setValue(Double.toString(boatData.get(i).getCurrentPosition().getLatitude())); - GPSCoord.setAttributeNode(attrYCoord); - - //X axis attribute - Attr attrXCoord = doc.createAttribute("X"); - attrXCoord.setValue(Double.toString(boatData.get(i).getCurrentPosition().getLongitude())); - GPSCoord.setAttributeNode(attrXCoord); - - //Write GPSCoord to boat - boat.appendChild(GPSCoord); - } - -} diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java deleted file mode 100644 index f4c7cc8c..00000000 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ /dev/null @@ -1,250 +0,0 @@ -package seng302.Data; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import seng302.DataInput.RaceDataSource; -import seng302.Exceptions.InvalidRaceDataException; -import seng302.Model.Boat; -import seng302.Model.CompoundMark; -import seng302.Model.GPSCoordinate; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.StringWriter; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; - -/** - * Created by esa46 on 21/04/17. - */ -public class RaceData { - - private RaceDataSource dataSource; - private Document doc; - private Element rootElement; - private ZonedDateTime creationTimeDate; - - public RaceData(RaceDataSource dataSource) { - this.dataSource = dataSource; - creationTimeDate = ZonedDateTime.now(); - } - - /** - * Creates an AC35 officially formatted xml description of a race. - * - * @return String containing xml-formatted race description - */ - public String createXML() { - - try { - - //create base xml document - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - doc = docBuilder.newDocument(); - - //create root element (In this case, "Race") - rootElement = doc.createElement("Race"); - doc.appendChild(rootElement); - - appendChildElements(); - - // write the content into xml file - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - DOMSource source = new DOMSource(doc); - - //Serialize document. - StringWriter stringWriter = new StringWriter(); - StreamResult result = new StreamResult(stringWriter); - transformer.transform(source, result); - - return stringWriter.toString(); - - } catch (ParserConfigurationException pce) { - throw new InvalidRaceDataException(); - } catch (TransformerException tfe) { - throw new InvalidRaceDataException(); - } - } - - /** - * Creates all necessary child elements and appends them to the xml doc - */ - private void appendChildElements() { - appendRaceId(); - appendRaceType(); - appendCreationTimeDate(); - appendRaceStartTime(); - appendParticipants(); - appendCourse(); - appendCourseLimit(); - } - - /** - * Creates and appends race id element - */ - private void appendRaceId() { - Element raceIdElement = doc.createElement("RaceID"); - raceIdElement.appendChild(doc.createTextNode(Integer.toString(dataSource.getRaceId()))); - rootElement.appendChild(raceIdElement); - } - - /** - * Creates and appends race type element - */ - private void appendRaceType() { - Element raceTypeElement = doc.createElement("RaceType"); - raceTypeElement.appendChild(doc.createTextNode(dataSource.getRaceType())); - rootElement.appendChild(raceTypeElement); - } - - /** - * Creates and appends creation time date element - */ - private void appendCreationTimeDate() { - Element creationTimeElement = doc.createElement("CreationTimeDate"); - - - creationTimeElement.appendChild(doc.createTextNode(toTruncatedString(creationTimeDate))); - rootElement.appendChild(creationTimeElement); - } - - /** - * Creates and appends race start time element, which is 3 minutes after the race was created by default - */ - private void appendRaceStartTime() { - Element startTimeElement = doc.createElement("RaceStartTime"); - startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(3)))); - startTimeElement.setAttribute("Postpone", "false"); - rootElement.appendChild(startTimeElement); - } - - /** - * Creates and appends participants element - */ - private void appendParticipants() { - Element participantsElement = doc.createElement("Participants"); - - for (Boat boat : dataSource.getBoats()) { - Element yachtElement = doc.createElement("Yacht"); - yachtElement.setAttribute("SourceID", boat.getSourceID() + ""); - participantsElement.appendChild(yachtElement); - } - rootElement.appendChild(participantsElement); - } - - /** - * Creates and appends course elements - */ - private void appendCourse() { - Element courseElement = doc.createElement("Course"); - Element compoundMarkSeqElement = doc.createElement("CompoundMarkSequence"); - - int i = 1; - for (CompoundMark compoundMark : dataSource.getCompoundMarks()) { - - courseElement.appendChild(createCompoundMarker(compoundMark, i)); - compoundMarkSeqElement.appendChild(createCornerElement(i)); - i++; - } - - rootElement.appendChild(compoundMarkSeqElement); - rootElement.appendChild(courseElement); - } - - - /** - * Creates a mark element for insertion in a coumpound mark element - * - * @param marker GPS coordinates of the mark - * @return Element mark element - */ - private Element createMark(GPSCoordinate marker) { - Element mark = doc.createElement("Mark"); - mark.setAttribute("TargetLat", marker.getLatitude() + ""); - mark.setAttribute("TargetLng", marker.getLongitude() + ""); - return mark; - } - - /** - * Creates a compound compoundMark holding one or two marks,and a sequence number - * - * @param compoundMark compoundMark - * @param i sequence number - * @return Element compound mark element - */ - private Element createCompoundMarker(CompoundMark compoundMark, int i) { - Element compoundMarkElement = doc.createElement("CompoundMark"); - compoundMarkElement.setAttribute("CompoundMarkID", i + ""); - compoundMarkElement.setAttribute("Name", compoundMark.getName()); - - compoundMarkElement.appendChild(createMark(compoundMark.getMark1())); - - if (!(compoundMark.getMark1().equals(compoundMark.getMark2()))) { - compoundMarkElement.appendChild(createMark(compoundMark.getMark2())); - } - - return compoundMarkElement; - } - - /** - * Creates a corner element - * - * @param i sequence number - * @return Element corner element - */ - private Element createCornerElement(int i) { - Element cornerElement = doc.createElement("Corner"); - cornerElement.setAttribute("SeqID", i + ""); - cornerElement.setAttribute("CompoundMarkID", i + ""); - - return cornerElement; - } - - /** - * Creates and appends course limits element (boundaries) - */ - private void appendCourseLimit() { - int j = 1; - - Element courseLimitElement = doc.createElement("CourseLimit"); - for (GPSCoordinate coordinate : dataSource.getBoundary()) { - Element limitElement = doc.createElement("Limit"); - limitElement.setAttribute("SeqID", j + ""); - limitElement.setAttribute("Lat", coordinate.getLatitude() + ""); - limitElement.setAttribute("Lon", coordinate.getLongitude() + ""); - - courseLimitElement.appendChild(limitElement); - - j++; - } - - rootElement.appendChild(courseLimitElement); - } - - - /** - * Format time data and return it. - * @param time time data. - * @return formatted time data. - */ - private String toTruncatedString(ZonedDateTime time) { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - String text = dateFormat.format(time); - return text; - } - - - -} diff --git a/mock/src/main/java/seng302/Data/RegattaData.java b/mock/src/main/java/seng302/Data/RegattaData.java deleted file mode 100644 index a559bf00..00000000 --- a/mock/src/main/java/seng302/Data/RegattaData.java +++ /dev/null @@ -1,169 +0,0 @@ -package seng302.Data; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import seng302.DataInput.RegattaDataSource; -import seng302.Exceptions.InvalidRegattaDataException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.StringWriter; - -/** - * Created by esa46 on 25/04/17. - */ -public class RegattaData { - - - private RegattaDataSource regattaDataSource; - private Document doc; - private Element rootElement; - - public RegattaData(RegattaDataSource regattaDataSource) { - this.regattaDataSource = regattaDataSource; - } - - - /** - * Creates an AC35 officially formatted xml description of a regatta - * - * @return String containing xml-formatted regatta description - */ - public String createXML() { - - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - - //root element - doc = docBuilder.newDocument(); - rootElement = doc.createElement("RegattaConfig"); - doc.appendChild(rootElement); - - appendChildElements(); - - // write the content into xml file - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - DOMSource source = new DOMSource(doc); - - //Serialize document. - StringWriter stringWriter = new StringWriter(); - StreamResult result = new StreamResult(stringWriter); - transformer.transform(source, result); - - return stringWriter.toString(); - - - } catch (ParserConfigurationException pce) { - throw new InvalidRegattaDataException(); - } catch (TransformerException tfe) { - throw new InvalidRegattaDataException(); - } - } - - /** - * Creates all necessary child elements and appends them to the xml doc - */ - private void appendChildElements() { - appendRegattaID(); - appendRegattaName(); - appendCourseName(); - appendCentralLatitude(); - appendCentralLongitude(); - appendCentralAltitude(); - appedUtcOffset(); - appendMagneticVariation(); - } - - /** - * Creates and appends regatta id element - */ - private void appendRegattaID() { - //regattaID element - Element regattaID = doc.createElement("RegattaID"); - regattaID.appendChild(doc.createTextNode(Integer.toString(regattaDataSource.getRegatta().getRegattaID()))); - rootElement.appendChild(regattaID); - } - - /** - * Creates and appends regatta name element - */ - private void appendRegattaName() { - //regattaName element - Element regattaName = doc.createElement("RegattaName"); - regattaName.appendChild(doc.createTextNode(regattaDataSource.getRegatta().getRegattaName())); - rootElement.appendChild(regattaName); - } - - /** - * Creates and appends course name element - */ - private void appendCourseName() { - //courseName element - Element courseName = doc.createElement("CourseName"); - courseName.appendChild(doc.createTextNode(regattaDataSource.getRegatta().getCourseName())); - rootElement.appendChild(courseName); - } - - /** - * Creates and appends central latitude element - */ - private void appendCentralLatitude() { - //centralLatitude element - Element centralLat = doc.createElement("CentralLatitude"); - centralLat.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralLatitude()))); - rootElement.appendChild(centralLat); - } - - /** - * Creates and appends central longitude element - */ - private void appendCentralLongitude() { - //centralLongitude element - Element centralLong = doc.createElement("CentralLongitude"); - centralLong.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralLongitude()))); - rootElement.appendChild(centralLong); - } - - /** - * Creates and appends central altitude element - */ - private void appendCentralAltitude() { - //centralAltitude element - Element centralAlt = doc.createElement("CentralAltitude"); - centralAlt.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralAltitude()))); - rootElement.appendChild(centralAlt); - } - - /** - * Creates and appends utc offset element - */ - private void appedUtcOffset() { - //utcOffset element - Element utcOffset = doc.createElement("UtcOffset"); - utcOffset.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getUtcOffset()))); - rootElement.appendChild(utcOffset); - } - - /** - * Creates and appends magnetic variation element - */ - private void appendMagneticVariation() { - //magneticVariation element - Element magneticVariation = doc.createElement("MagneticVariation"); - magneticVariation.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getMagneticVariation()))); - rootElement.appendChild(magneticVariation); - - } - -} diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 3d49c1d3..4da94803 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -7,10 +7,6 @@ import seng302.MockOutput; import javax.xml.parsers.ParserConfigurationException; import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; import java.text.ParseException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -21,59 +17,37 @@ import java.time.format.DateTimeFormatter; */ public class Event { - RaceDataSource raceDataSource; String raceXML; - RegattaDataSource regattaDataSource; String regattaXML; - BoatDataSource boatDataSource; String boatXML; MockOutput mockOutput; - public Event(String raceXML, String regattaXML, String boatXML) { - this.raceXML = getRaceAtCurrentTime(raceXML); + this.raceXML = getRaceXMLAtCurrentTime(raceXML); this.boatXML = boatXML; this.regattaXML = regattaXML; - try { - boatDataSource = new BoatXMLReader(boatXML); - raceDataSource = new RaceXMLReader(this.raceXML, boatDataSource); - regattaDataSource = new RegattaXMLReader(regattaXML); - mockOutput = new MockOutput(); new Thread(mockOutput).start(); - - } catch (ParserConfigurationException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (StreamedCourseXMLException e) { - e.printStackTrace(); } - - } - - private String getRaceAtCurrentTime(String raceXML) { - ZonedDateTime creationTime = ZonedDateTime.now(); - return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime)) - .replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3))); } /** * Send the initial race data and then begin race simulation */ public void start() { - sendXMLs(); - int scaleFactor = 10;//TEMP - was 15. - Race newRace = new Race(raceDataSource, scaleFactor, mockOutput); - new Thread((newRace)).start(); - } + try { + sendXMLs(); + Race newRace = new Race(new RaceXMLReader(this.raceXML, new BoatXMLReader(boatXML)), mockOutput); + new Thread((newRace)).start(); + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + } + } private void sendXMLs() { @@ -89,8 +63,6 @@ public class Event { System.out.println("Sending Boat"); mockOutput.setBoatsXml(boatXML); mockOutput.parseXMLString(boatXML, 26); - - } /** @@ -105,4 +77,10 @@ public class Event { return text; } + private String getRaceXMLAtCurrentTime(String raceXML) { + ZonedDateTime creationTime = ZonedDateTime.now(); + return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime)) + .replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3))); + } + } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 334d1fbe..89c44c24 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -47,22 +47,20 @@ public class Race implements Runnable { * * @param boats Takes in an array of boats that are participating in the race. * @param legs Number of marks in order that the boats pass in order to complete the race. - * @param scaleFactor for race */ - public Race(List boats, List legs, int raceID, int scaleFactor, MockOutput mockOutput) { + public Race(List boats, List legs, int raceID, MockOutput mockOutput) { this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; this.legs.add(new Leg("Finish", this.legs.size())); this.raceId = raceID; - this.scaleFactor = scaleFactor; this.mockOutput = mockOutput; this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); } - public Race(RaceDataSource raceData, int scaleFactor, MockOutput mockOutput) { - this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), scaleFactor, mockOutput); + public Race(RaceDataSource raceData, MockOutput mockOutput) { + this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), mockOutput); } /** From a35d9cbc5a6706e07d7412af964d9158ba6938d5 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 23:54:29 +1200 Subject: [PATCH 14/23] Re-refactored Event class #story[881] --- mock/src/main/java/seng302/Model/Event.java | 34 +++----- mock/src/main/java/seng302/Model/Race.java | 2 +- .../test/java/seng302/Data/BoatDataTest.java | 87 ------------------- .../test/java/seng302/Data/RaceDataTest.java | 83 ------------------ .../java/seng302/Data/RegattaDataTest.java | 73 ---------------- 5 files changed, 15 insertions(+), 264 deletions(-) delete mode 100644 mock/src/test/java/seng302/Data/BoatDataTest.java delete mode 100644 mock/src/test/java/seng302/Data/RaceDataTest.java delete mode 100644 mock/src/test/java/seng302/Data/RegattaDataTest.java diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 4da94803..7a5cecba 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -4,6 +4,7 @@ import org.xml.sax.SAXException; import seng302.DataInput.*; import seng302.Exceptions.StreamedCourseXMLException; import seng302.MockOutput; +import seng302.Networking.Messages.Enums.MessageType; import javax.xml.parsers.ParserConfigurationException; import java.io.*; @@ -36,7 +37,7 @@ public class Event { } /** - * Send the initial race data and then begin race simulation + * Sends the initial race data and then begins race simulation */ public void start() { try { @@ -49,38 +50,31 @@ public class Event { } } + /** + * Sends out each xml string, via the mock output + */ private void sendXMLs() { - System.out.println("Sending Regatta"); mockOutput.setRegattaXml(regattaXML); - mockOutput.parseXMLString(regattaXML, 26); + mockOutput.parseXMLString(regattaXML, MessageType.XMLMESSAGE.getValue()); - System.out.println("Sending Race"); mockOutput.setRaceXml(raceXML); - System.out.println(raceXML); - mockOutput.parseXMLString(raceXML, 26); + mockOutput.parseXMLString(raceXML, MessageType.XMLMESSAGE.getValue()); - System.out.println("Sending Boat"); mockOutput.setBoatsXml(boatXML); - mockOutput.parseXMLString(boatXML, 26); + mockOutput.parseXMLString(boatXML, MessageType.XMLMESSAGE.getValue()); } /** - * Format time data and return it. - * @param time time data. - * @return formatted time data. + * Sets the xml description of the race to show the race was created now, and starts in 3 minutes + * @param raceXML + * @return String containing edited xml */ - private String toTruncatedString(ZonedDateTime time) { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - String text = dateFormat.format(time); - return text; - } - private String getRaceXMLAtCurrentTime(String raceXML) { + DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); ZonedDateTime creationTime = ZonedDateTime.now(); - return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime)) - .replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3))); + return raceXML.replace("CREATION_TIME", dateFormat.format(creationTime)) + .replace("START_TIME", dateFormat.format(creationTime.plusMinutes(3))); } } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 89c44c24..a8dbece1 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -113,7 +113,7 @@ public class Race implements Runnable { for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get((i + boatOffset) % startingBoats.size()); mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); - boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.RACING, boat.getCurrentLeg().getLegNumber())); + boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.PRESTART, boat.getCurrentLeg().getLegNumber())); } boatOffset = (boatOffset + 1) % (startingBoats.size()); diff --git a/mock/src/test/java/seng302/Data/BoatDataTest.java b/mock/src/test/java/seng302/Data/BoatDataTest.java deleted file mode 100644 index d6cc4d17..00000000 --- a/mock/src/test/java/seng302/Data/BoatDataTest.java +++ /dev/null @@ -1,87 +0,0 @@ -//package seng302.Data; -// -// -//import org.junit.Before; -//import org.junit.Test; -//import org.xml.sax.SAXException; -//import seng302.DataInput.RaceDataSource; -//import seng302.DataInput.RaceXMLReader; -// -//import javax.xml.parsers.ParserConfigurationException; -//import java.io.IOException; -// -//import static junit.framework.TestCase.assertTrue; -// -///** -// * Created by esa46 on 25/04/17. -// */ -//public class BoatDataTest { -// -// -// private static final String ROOT_TAG = "BoatConfig"; -// private static final String[] REQUIRED_TAGS = new String[]{ -// "Boats", "GPSposition" -// }; -// private static final String[] REQUIRED_ATTRIBUTES = new String[]{ -// "SourceID", "ShapeID", "HullNum", "StoweName", -// "ShortName", "BoatName" -// }; -// -// String result; -// RaceDataSource raceDataSource; -// -// @Before -// public void initReader() { -// try { -// raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); -// BoatData boatData = new BoatData(raceDataSource.getBoats()); -// result = boatData.createXML(); -// -// -// } catch (IOException e) { -// e.printStackTrace(); -// } catch (SAXException e) { -// e.printStackTrace(); -// } catch (ParserConfigurationException e) { -// e.printStackTrace(); -// } -// } -// -// @Test -// public void xmlHasAllNecessaryTags() { -// -// assertTrue(result.contains("<" + ROOT_TAG + ">")); -// for (String tag : REQUIRED_TAGS) { -// assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); -// } -// } -// -// @Test -// public void xmlHasAllNecessaryAttributes() { -// -// for (String attribute : REQUIRED_ATTRIBUTES) { -// assertTrue(result.contains(attribute + "=")); -// } -// } -// -// @Test -// public void allTagsAreTerminated() { -// -// for (String tag : REQUIRED_TAGS) { -// int lastIndex = 0; -// String openTag = "<" + tag + ">"; -// String closeTag = ""; -// while (lastIndex < result.length() && lastIndex > 0) { -// lastIndex = result.indexOf(openTag, lastIndex); -// if (lastIndex > 0) { -// -// lastIndex = result.indexOf(closeTag, lastIndex); -// assertTrue(lastIndex > 0); -// } -// } -// } -// } -// -// -// -//} diff --git a/mock/src/test/java/seng302/Data/RaceDataTest.java b/mock/src/test/java/seng302/Data/RaceDataTest.java deleted file mode 100644 index 22ff3056..00000000 --- a/mock/src/test/java/seng302/Data/RaceDataTest.java +++ /dev/null @@ -1,83 +0,0 @@ -//package seng302.Data; -// -//import org.junit.Before; -//import org.junit.Test; -//import org.xml.sax.SAXException; -//import seng302.DataInput.RaceDataSource; -//import seng302.DataInput.RaceXMLReader; -// -//import javax.xml.parsers.ParserConfigurationException; -//import java.io.IOException; -// -//import static junit.framework.TestCase.assertTrue; -// -///** -// * Created by esa46 on 25/04/17. -// */ -//public class RaceDataTest { -// -// private static final String ROOT_TAG = "Race"; -// private static final String[] REQUIRED_TAGS = new String[]{ -// "RaceID", "RaceType", "CreationTimeDate", "RaceStartTime", "Participants", "Yacht", -// "CompoundMarkSequence", "Course", "CompoundMark", "Mark", "CourseLimit", "Limit" -// }; -// String result; -// RaceDataSource raceDataSource; -// -// @Before -// public void initReader() { -// try { -// raceDataSource = new RaceXMLReader("raceXML/bermuda_AC35.xml"); -// RaceData raceData = new RaceData(raceDataSource); -// result = raceData.createXML(); -// -// -// } catch (IOException e) { -// e.printStackTrace(); -// } catch (SAXException e) { -// e.printStackTrace(); -// } catch (ParserConfigurationException e) { -// e.printStackTrace(); -// } -// } -// -// @Test -// public void xmlHasAllNecessaryFields() { -// -// assertTrue(result.contains("<" + ROOT_TAG + ">")); -// for (String tag : REQUIRED_TAGS) { -// System.out.println(tag); -// assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); -// } -// } -// -// @Test -// public void allTagsAreTerminated() { -// -// for (String tag : REQUIRED_TAGS) { -// int lastIndex = 0; -// String openTag = "<" + tag + ">"; -// String closeTag = ""; -// while (lastIndex < result.length() && lastIndex > 0) { -// lastIndex = result.indexOf(openTag, lastIndex); -// if (lastIndex > 0) { -// -// lastIndex = result.indexOf(closeTag, lastIndex); -// assertTrue(lastIndex > 0); -// } -// } -// } -// } -// -// -// @Test -// public void idAndTypeAreEquivalent() { -// String newId = result.substring(result.indexOf("") + 8, result.indexOf("")); -// String newRaceType = result.substring(result.indexOf("") + 10, result.indexOf("")); -// -// assertTrue(raceDataSource.getRaceId() == Integer.parseInt(newId)); -// assertTrue(raceDataSource.getRaceType().equals(newRaceType)); -// } -// -// -//} diff --git a/mock/src/test/java/seng302/Data/RegattaDataTest.java b/mock/src/test/java/seng302/Data/RegattaDataTest.java deleted file mode 100644 index da2d833e..00000000 --- a/mock/src/test/java/seng302/Data/RegattaDataTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package seng302.Data; - -import org.junit.Before; -import org.junit.Test; -import org.xml.sax.SAXException; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RegattaDataSource; -import seng302.DataInput.RegattaXMLReader; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; - -import static junit.framework.TestCase.assertTrue; - -/** - * Created by esa46 on 25/04/17. - */ -public class RegattaDataTest { - - private static final String ROOT_TAG = "RegattaConfig"; - private static final String[] REQUIRED_TAGS = new String[]{ - "RegattaID", "RegattaName", "CourseName", "CentralLatitude", "CentralLongitude", - "CentralAltitude", "UtcOffset", "MagneticVariation" - }; - String result; - RegattaDataSource regattaDataSource; - - @Before - public void initReader() { - try { - regattaDataSource = new RegattaXMLReader("mockXML/regattaTest.xml"); - RegattaData regattaData = new RegattaData(regattaDataSource); - result = regattaData.createXML(); - - - } catch (IOException e) { - e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } - } - - @Test - public void xmlHasAllNecessaryFields() { - - assertTrue(result.contains("<" + ROOT_TAG + ">")); - for (String tag : REQUIRED_TAGS) { - System.out.println(tag); - assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " ")); - } - } - - @Test - public void allTagsAreTerminated() { - - for (String tag : REQUIRED_TAGS) { - int lastIndex = 0; - String openTag = "<" + tag + ">"; - String closeTag = ""; - while (lastIndex < result.length() && lastIndex > 0) { - lastIndex = result.indexOf(openTag, lastIndex); - if (lastIndex > 0) { - - lastIndex = result.indexOf(closeTag, lastIndex); - assertTrue(lastIndex > 0); - } - } - } - } - -} From fd036c183596f2c6e3f7b4d3c168baab52670b60 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 00:51:34 +1200 Subject: [PATCH 15/23] Refactored countdown timer in race class - Also fixed all boats having ame velocity #story[881] --- mock/src/main/java/seng302/Constants.java | 3 + .../seng302/DataInput/RegattaDataSource.java | 11 - .../seng302/DataInput/RegattaXMLReader.java | 75 ----- .../java/seng302/DataInput/XMLReader.java | 2 - .../InvalidRegattaDataException.java | 17 -- mock/src/main/java/seng302/Model/Boat.java | 1 - mock/src/main/java/seng302/Model/Race.java | 252 ++++++--------- mock/src/main/java/seng302/Model/Regatta.java | 99 ------ mock/src/main/resources/mockXML/raceTest.xml | 6 +- .../main/resources/raceXML/bermuda_AC35.xml | 286 ------------------ .../seng302/DataInput/RegattaXMLTest.java | 51 ---- 11 files changed, 102 insertions(+), 701 deletions(-) delete mode 100644 mock/src/main/java/seng302/DataInput/RegattaDataSource.java delete mode 100644 mock/src/main/java/seng302/DataInput/RegattaXMLReader.java delete mode 100644 mock/src/main/java/seng302/Exceptions/InvalidRegattaDataException.java delete mode 100644 mock/src/main/java/seng302/Model/Regatta.java delete mode 100644 mock/src/main/resources/raceXML/bermuda_AC35.xml delete mode 100644 mock/src/test/java/seng302/DataInput/RegattaXMLTest.java diff --git a/mock/src/main/java/seng302/Constants.java b/mock/src/main/java/seng302/Constants.java index 04eee894..321bdab3 100644 --- a/mock/src/main/java/seng302/Constants.java +++ b/mock/src/main/java/seng302/Constants.java @@ -8,4 +8,7 @@ public class Constants { public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters + public static final int PRE_RACE_WAIT_TIME = 18000; + + public static final int TEST_VELOCITIES[] = new int[] { 30, 15, 64, 52, 25, 24 }; } diff --git a/mock/src/main/java/seng302/DataInput/RegattaDataSource.java b/mock/src/main/java/seng302/DataInput/RegattaDataSource.java deleted file mode 100644 index 69a04822..00000000 --- a/mock/src/main/java/seng302/DataInput/RegattaDataSource.java +++ /dev/null @@ -1,11 +0,0 @@ -package seng302.DataInput; - - -import seng302.Model.Regatta; - -/** - * Created by zwu18 on 25/04/17. - */ -public interface RegattaDataSource { - Regatta getRegatta(); -} diff --git a/mock/src/main/java/seng302/DataInput/RegattaXMLReader.java b/mock/src/main/java/seng302/DataInput/RegattaXMLReader.java deleted file mode 100644 index 406d923f..00000000 --- a/mock/src/main/java/seng302/DataInput/RegattaXMLReader.java +++ /dev/null @@ -1,75 +0,0 @@ -package seng302.DataInput; - -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import seng302.Model.Regatta; - - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; - -/** - * Created by jjg64 on 19/04/17. - */ -public class RegattaXMLReader extends XMLReader implements RegattaDataSource { - private Regatta regatta; - - /** - * Constructor for Regatta XML - * - * @param filePath path of the file - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - */ - public RegattaXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException { - this(filePath, true); - } - - /** - * Constructor for Regatta XML - * - * @param filePath file path to read - * @param read whether or not to read and store the files straight away. - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - */ - public RegattaXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException { - super(filePath); - if (read) { - read(); - } - } - - /** - * Read the XML - */ - private void read() { - NodeList attributeConfig = doc.getElementsByTagName("RegattaConfig"); - Element attributes = (Element) attributeConfig.item(0); - makeRegatta(attributes); - } - - /** - * Create new regatta - * @param attributes - */ - private void makeRegatta(Element attributes) { - int regattaID = Integer.parseInt(getTextValueOfNode(attributes, "RegattaID")); - String regattaName = getTextValueOfNode(attributes, "RegattaName"); - String courseName = getTextValueOfNode(attributes, "CourseName"); - double centralLatitude = Double.parseDouble(getTextValueOfNode(attributes, "CentralLatitude")); - double centralLongitude = Double.parseDouble(getTextValueOfNode(attributes, "CentralLongitude")); - double centralAltitude = Double.parseDouble(getTextValueOfNode(attributes, "CentralAltitude")); - float utcOffset = Float.parseFloat(getTextValueOfNode(attributes, "UtcOffset")); - float magneticVariation = Float.parseFloat(getTextValueOfNode(attributes, "MagneticVariation")); - - regatta = new Regatta(regattaID, regattaName, courseName, centralLatitude, centralLongitude, centralAltitude, utcOffset, magneticVariation); - } - - public Regatta getRegatta() { - return regatta; - } -} diff --git a/mock/src/main/java/seng302/DataInput/XMLReader.java b/mock/src/main/java/seng302/DataInput/XMLReader.java index e24fb160..13c4808b 100644 --- a/mock/src/main/java/seng302/DataInput/XMLReader.java +++ b/mock/src/main/java/seng302/DataInput/XMLReader.java @@ -29,8 +29,6 @@ public abstract class XMLReader { */ public XMLReader(String filePath) throws ParserConfigurationException, IOException, SAXException { - - InputSource fXmlFile; if (filePath.contains("<")) { fXmlFile = new InputSource(); diff --git a/mock/src/main/java/seng302/Exceptions/InvalidRegattaDataException.java b/mock/src/main/java/seng302/Exceptions/InvalidRegattaDataException.java deleted file mode 100644 index 1249ae96..00000000 --- a/mock/src/main/java/seng302/Exceptions/InvalidRegattaDataException.java +++ /dev/null @@ -1,17 +0,0 @@ -package seng302.Exceptions; - -/** - * Created by f123 on 25-Apr-17. - */ - -/** - * An exception thrown when a Regatta.xml message cannot be generated and sent. - */ -public class InvalidRegattaDataException extends RuntimeException { - public InvalidRegattaDataException() { - } - - public InvalidRegattaDataException(String message) { - super(message); - } -} diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 91fe6f24..98162abf 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -27,7 +27,6 @@ public class Boat { * @param country nam abbreviation */ public Boat(int sourceID, String name, String country) { - this.velocity = 30; // TODO - please dont commit this.country = this.country; this.name = name; this.sourceID = sourceID; diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index a8dbece1..2ef104c7 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -1,12 +1,10 @@ package seng302.Model; - import javafx.animation.AnimationTimer; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import org.geotools.referencing.GeodeticCalculator; - import seng302.Constants; import seng302.DataInput.RaceDataSource; import seng302.MockOutput; @@ -19,7 +17,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; - /** * Parent class for races * Created by fwy13 on 3/03/17. @@ -30,60 +27,19 @@ public class Race implements Runnable { protected List legs; protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scaleFactor = 20; - protected int PRERACE_TIME = 18000; //time in milliseconds to pause during pre-race. At the moment, 3 minutes + protected int scaleFactor = 3; private long startTime; - 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 private MockOutput mockOutput; - private static int boatOffset = 0; - private int finished = 0; - - /** - * Initailiser for Race - * - * @param boats Takes in an array of boats that are participating in the race. - * @param legs Number of marks in order that the boats pass in order to complete the race. - */ - public Race(List boats, List legs, int raceID, MockOutput mockOutput) { - this.startingBoats = FXCollections.observableArrayList(boats); - this.legs = legs; + public Race(RaceDataSource raceData, MockOutput mockOutput) { + this.startingBoats = FXCollections.observableArrayList(raceData.getBoats()); + this.legs = raceData.getLegs(); this.legs.add(new Leg("Finish", this.legs.size())); - this.raceId = raceID; + this.raceId = raceData.getRaceId(); this.mockOutput = mockOutput; - - this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); - } - - public Race(RaceDataSource raceData, MockOutput mockOutput) { - this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), mockOutput); - } - - /** - * Calculates the boats next GPS position based on its distance travelled and heading - * - * @param oldCoordinates GPS coordinates of the boat's starting position - * @param distanceTravelled distance in nautical miles - * @param azimuth boat's current direction. Value between -180 and 180 - * @return The boat's new coordinate - */ - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - - //Find new coordinate using current heading and distance - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); - //Load start point into calculator - Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); - geodeticCalculator.setStartingGeographicPoint(startPoint); - //load direction and distance tranvelled into calculator - geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); - //get new point - Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - - return new GPSCoordinate(endPoint.getY(), endPoint.getX()); + this.startTime = System.currentTimeMillis() + (Constants.PRE_RACE_WAIT_TIME / this.scaleFactor); } /** @@ -91,123 +47,94 @@ public class Race implements Runnable { */ public void run() { initialiseBoats(); - countdownTimer(); + countdownTimer.start(); } /** - * Starts the heartbeat timer, which sends a heartbeat message every so often (i.e., 5 seconds). - */ - /** - * Countdown timer until race starts. Use PRERACE_TIME to set countdown duration. + * Countdown timer until race starts. */ - protected void countdownTimer() { - AnimationTimer timer = new AnimationTimer() { - long currentTime = System.currentTimeMillis(); - long timeLeft; - - @Override - public void handle(long arg0) { - timeLeft = startTime - currentTime; - ArrayList boatStatuses = new ArrayList<>(); - //For each boat, we update its position, and generate a BoatLocationMessage. - for (int i = 0; i < startingBoats.size(); i++) { - Boat boat = startingBoats.get((i + boatOffset) % startingBoats.size()); - mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); - boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.PRESTART, boat.getCurrentLeg().getLegNumber())); - } - boatOffset = (boatOffset + 1) % (startingBoats.size()); - if (timeLeft <= 60000/scaleFactor && timeLeft > 0) { - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 2, startTime, 0, 2300, 1, boatStatuses); - mockOutput.parseRaceStatus(raceStatus); - } - else if (timeLeft <= 0) { - countdownFinish = true; - if (runRace) { - simulateRace(); - } - stop(); - } - else { - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 1, startTime, 0, 2300,1, boatStatuses); - mockOutput.parseRaceStatus(raceStatus); - } - currentTime = System.currentTimeMillis(); + private AnimationTimer countdownTimer = new AnimationTimer() { + long currentTime = System.currentTimeMillis(); + long timeLeft; + @Override + public void handle(long arg0) { + timeLeft = startTime - currentTime; + if (timeLeft <= 0) { + System.setProperty("javafx.animation.fullspeed", "true"); + raceTimer.start(); + stop(); } - }; - timer.start(); - } - /** - * Starts the Race Simulation, playing the race start to finish with the timescale. - * This prints the boats participating, the order that the events occur in time order, and the respective information of the events. - */ - private void simulateRace() { + ArrayList boatStatuses = new ArrayList<>(); + for (Boat boat : startingBoats) { + mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), + boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); + boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.PRESTART, 0)); + } - System.setProperty("javafx.animation.fullspeed", "true"); + int raceStatusNumber = timeLeft <= 60000 / scaleFactor && timeLeft > 0? 2 : 1; + RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, raceStatusNumber, startTime, 0, 2300, 1, boatStatuses); + mockOutput.parseRaceStatus(raceStatus); - for (Boat boat : startingBoats) { - boat.setStarted(true); + currentTime = System.currentTimeMillis(); } + }; - new AnimationTimer() { - //Start time of loop. - long timeRaceStarted = System.currentTimeMillis(); - - @Override - public void handle(long arg0) { - if (boatsFinished < startingBoats.size()) { - //Get the current time. - long currentTime = System.currentTimeMillis(); - //Update the total elapsed time. - totalTimeElapsed = currentTime - timeRaceStarted; - ArrayList boatStatuses = new ArrayList<>(); - finished = 0; - //For each boat, we update it's position, and generate a BoatLocationMessage. - for (int i = 0; i < startingBoats.size(); i++) { - Boat boat = startingBoats.get((i + boatOffset) % startingBoats.size()); - if (boat != null) { - //Update position. - if (boat.getTimeFinished() < 0) { - updatePosition(boat, Math.round(1000 / lastFPS) > 20 ? 15 : Math.round(1000 / lastFPS)); - checkPosition(boat, totalTimeElapsed); - } - if (boat.getTimeFinished() > 0) { - mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), boat.getVelocity()); - boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.FINISHED, boat.getCurrentLeg().getLegNumber())); - finished++; - } else { - mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), boat.getVelocity()); - boatStatuses.add(new BoatStatus(boat.getSourceID(), - boat.getCurrentLeg().getLegNumber() >= 0 ? BoatStatusEnum.RACING : BoatStatusEnum.DNF, boat.getCurrentLeg().getLegNumber())); - } - if (startingBoats.size()==finished){ - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 4, startTime, 0, 2300, 2, boatStatuses); - mockOutput.parseRaceStatus(raceStatus); - } + private AnimationTimer raceTimer = new AnimationTimer() { + //Start time of loop. + long timeRaceStarted = System.currentTimeMillis(); + int boatOffset = 0; + + @Override + public void handle(long arg0) { + if (boatsFinished < startingBoats.size()) { + //Get the current time. + long currentTime = System.currentTimeMillis(); + //Update the total elapsed time. + totalTimeElapsed = currentTime - timeRaceStarted; + ArrayList boatStatuses = new ArrayList<>(); + //For each boat, we update its position, and generate a BoatLocationMessage. + for (int i = 0; i < startingBoats.size(); i++) { + Boat boat = startingBoats.get((i + boatOffset) % startingBoats.size()); + if (boat != null) { + //Update position. + if (boat.getTimeFinished() < 0) { + updatePosition(boat, 15); + checkPosition(boat, totalTimeElapsed); + } + if (boat.getTimeFinished() > 0) { + mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), boat.getVelocity()); + boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.FINISHED, boat.getCurrentLeg().getLegNumber())); } else { - stop(); + mockOutput.parseBoatLocation(boat.getSourceID(), boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getHeading(), boat.getVelocity()); + boatStatuses.add(new BoatStatus(boat.getSourceID(), + boat.getCurrentLeg().getLegNumber() >= 0 ? BoatStatusEnum.RACING : BoatStatusEnum.DNF, boat.getCurrentLeg().getLegNumber())); } + } else { + stop(); } - boatOffset = (boatOffset + 1) % (startingBoats.size()); - RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses); - mockOutput.parseRaceStatus(raceStatus); } + boatOffset = (boatOffset + 1) % (startingBoats.size()); + RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses); + mockOutput.parseRaceStatus(raceStatus); } - }.start(); - } + } + }; + public void initialiseBoats() { Leg officialStart = legs.get(0); String name = officialStart.getName(); Marker endMark = officialStart.getEndCompoundMark(); - ArrayList startingPositions = getSpreadStartingPositions(); + for (int i = 0; i < startingBoats.size(); i++) { Boat boat = startingBoats.get(i); if (boat != null) { Leg newLeg = new Leg(name, new Marker(startingPositions.get(i)), endMark, 0); boat.setCurrentLeg(newLeg); + boat.setVelocity(Constants.TEST_VELOCITIES[i]); boat.setScaledVelocity(boat.getVelocity() * scaleFactor); boat.setCurrentPosition(startingPositions.get(i)); boat.setHeading(boat.calculateHeading()); @@ -249,19 +176,26 @@ public class Race implements Runnable { } /** - * Sets the chance each boat has of failing at a gate or marker + * Calculates the boats next GPS position based on its distance travelled and heading * - * @param chance percentage chance a boat has of failing per checkpoint. + * @param oldCoordinates GPS coordinates of the boat's starting position + * @param distanceTravelled distance in nautical miles + * @param azimuth boat's current direction. Value between -180 and 180 + * @return The boat's new coordinate */ - protected void setDnfChance(int chance) { - if (chance >= 0 && chance <= 100) { - dnfChance = chance; - } - } + public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - protected boolean doNotFinish() { - Random rand = new Random(); - return rand.nextInt(100) < dnfChance; + //Find new coordinate using current heading and distance + GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); + //Load start point into calculator + Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); + geodeticCalculator.setStartingGeographicPoint(startPoint); + //load direction and distance travelled into calculator + geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); + //get new point + Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); + + return new GPSCoordinate(endPoint.getY(), endPoint.getX()); } /** @@ -316,13 +250,19 @@ public class Race implements Runnable { } /** - * Returns the boats that have started the race. + * Sets the chance each boat has of failing at a gate or marker * - * @return ObservableList of Boat class that participated in the race. - * @see ObservableList - * @see Boat + * @param chance percentage chance a boat has of failing per checkpoint. */ - public ObservableList getStartingBoats() { - return startingBoats; + protected void setDnfChance(int chance) { + if (chance >= 0 && chance <= 100) { + dnfChance = chance; + } } + + protected boolean doNotFinish() { + Random rand = new Random(); + return rand.nextInt(100) < dnfChance; + } + } diff --git a/mock/src/main/java/seng302/Model/Regatta.java b/mock/src/main/java/seng302/Model/Regatta.java deleted file mode 100644 index 0060f2c4..00000000 --- a/mock/src/main/java/seng302/Model/Regatta.java +++ /dev/null @@ -1,99 +0,0 @@ -package seng302.Model; - -/** - * Created by jjg64 on 19/04/17. - */ -public class Regatta { - int regattaID; - String RegattaName; - int raceID = 0; - String courseName; - double centralLatitude; - double centralLongitude; - double centralAltitude; - float utcOffset; - float magneticVariation; - - public Regatta(int regattaID, String regattaName, String courseName, double centralLatitude, double centralLongitude, double centralAltitude, float utcOffset, float magneticVariation) { - this.regattaID = regattaID; - this.RegattaName = regattaName; - this.courseName = courseName; - this.centralLatitude = centralLatitude; - this.centralLongitude = centralLongitude; - this.centralAltitude = centralAltitude; - this.utcOffset = utcOffset; - this.magneticVariation = magneticVariation; - } - - public int getRegattaID() { - return regattaID; - } - - public void setRegattaID(int ID) { - this.regattaID = ID; - } - - public String getRegattaName() { - return RegattaName; - } - - public void setRegattaName(String regattaName) { - RegattaName = regattaName; - } - - public int getRaceID() { - return raceID; - } - - public void setRaceID(int raceID) { - this.raceID = raceID; - } - - public String getCourseName() { - return courseName; - } - - public void setCourseName(String courseName) { - this.courseName = courseName; - } - - public double getCentralLatitude() { - return centralLatitude; - } - - public void setCentralLatitude(double centralLatitude) { - this.centralLatitude = centralLatitude; - } - - public double getCentralLongitude() { - return centralLongitude; - } - - public void setCentralLongitude(double centralLongitude) { - this.centralLongitude = centralLongitude; - } - - public double getCentralAltitude() { - return centralAltitude; - } - - public void setCentralAltitude(double centralAltitude) { - this.centralAltitude = centralAltitude; - } - - public float getUtcOffset() { - return utcOffset; - } - - public void setUtcOffset(float utcOffset) { - this.utcOffset = utcOffset; - } - - public float getMagneticVariation() { - return magneticVariation; - } - - public void setMagneticVariation(float magneticVariation) { - this.magneticVariation = magneticVariation; - } -} diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index 85ff00eb..63fac32d 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -15,9 +15,9 @@ - - - + + + diff --git a/mock/src/main/resources/raceXML/bermuda_AC35.xml b/mock/src/main/resources/raceXML/bermuda_AC35.xml deleted file mode 100644 index 7a73fc7f..00000000 --- a/mock/src/main/resources/raceXML/bermuda_AC35.xml +++ /dev/null @@ -1,286 +0,0 @@ - - 5326 - - - Team ORACLE USA - 20 - USA - 121 - BLUEVIOLET - - - Land Rover BAR - 30 - GBR - 122 - BLACK - - - SoftBank Team Japan - 25 - JPN - 123 - RED - - - Groupama Team France - 20 - FRA - 124 - ORANGE - - - Artemis Racing - 29 - SWE - 125 - DARKOLIVEGREEN - - - Emirates Team New Zealand - 62 - NZL - 126 - LIMEGREEN - - - - - Start to Mark 1 - - - - 32.296577 - -64.854304 - - - 32.293771 - -64.855242 - - - - - - - 32.293039 - -64.843983 - - - - - - Mark 1 to Leeward Gate - - - - 32.293039 - -64.843983 - - - - - - - 32.309693 - -64.835249 - - - 32.308046 - -64.831785 - - - - - - Leeward Gate to Windward Gate - - - - 32.309693 - -64.835249 - - - 32.308046 - -64.831785 - - - - - - - 32.284680 - -64.850045 - - - 32.280164 - -64.847591 - - - - - - Windward Gate to Leeward Gate - - - - 32.284680 - -64.850045 - - - 32.280164 - -64.847591 - - - - - - - 32.309693 - -64.835249 - - - 32.308046 - -64.831785 - - - - - - Leeward Gate to Finish - - - - 32.309693 - -64.835249 - - - 32.308046 - -64.831785 - - - - - - - 32.317379 - -64.839291 - - - 32.317257 - -64.836260 - - - - - - - - - 32.313922 - -64.837168 - - - 32.317379 - -64.839291 - - - 32.317911 - -64.836996 - - - 32.317257 - -64.836260 - - - 32.304273 - -64.822834 - - - 32.279097 - -64.841545 - - - 32.279604 - -64.849871 - - - 32.289545 - -64.854162 - - - 32.290198 - -64.858711 - - - 32.297164 - -64.856394 - - - 32.296148 - -64.849184 - - - - Start Line - - 32.296577 - -64.854304 - - - 32.293771 - -64.855242 - - - - Mark - - 32.293039 - -64.843983 - - - - Windward Gate - - 32.284680 - -64.850045 - - - 32.280164 - -64.847591 - - - - Leeward Gate - - 32.309693 - -64.835249 - - - 32.308046 - -64.831785 - - - - Windward Gate - - 32.284680 - -64.850045 - - - 32.280164 - -64.847591 - - - - Finish Line - - 32.317379 - -64.839291 - - - 32.317257 - -64.836260 - - - - diff --git a/mock/src/test/java/seng302/DataInput/RegattaXMLTest.java b/mock/src/test/java/seng302/DataInput/RegattaXMLTest.java deleted file mode 100644 index 44b7f1c5..00000000 --- a/mock/src/test/java/seng302/DataInput/RegattaXMLTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package seng302.DataInput; - -import org.junit.Before; -import org.junit.Test; -import seng302.Model.Regatta; - -import static org.junit.Assert.*; - -/** - * Created by jjg64 on 19/04/17. - */ -public class RegattaXMLTest { - RegattaXMLReader regattaXMLReader; - - @Before - public void findFile() { - try { - regattaXMLReader = new RegattaXMLReader("mockXML/regattaTest.xml", false); - } catch (Exception e) { - fail("Cannot find mockXML/regattaXML/regattaTest.xml in the resources folder"); - } - } - - @Test - public void makeRegattaTest() { - try { - regattaXMLReader = new RegattaXMLReader("mockXML/regattaTest.xml"); - assertNotEquals(regattaXMLReader.getRegatta(), null); - } catch (Exception e) { - fail("Did not make a Regatta object"); - } - } - - @Test - public void correctValuesTest() { - try { - regattaXMLReader = new RegattaXMLReader("mockXML/regattaTest.xml"); - Regatta regatta = regattaXMLReader.getRegatta(); - assertEquals(regatta.getRegattaID(), 3); - assertEquals(regatta.getRegattaName(), "New Zealand Test"); - assertEquals(regatta.getCourseName(), "North Head"); - assertEquals(regatta.getCentralLatitude(), -36.82791529, 0.00000001); - assertEquals(regatta.getCentralLongitude(), 174.81218919, 0.00000001); - assertEquals(regatta.getCentralAltitude(), 0.00, 0.00000001); - assertEquals(regatta.getUtcOffset(), 12.0, 0.001); - assertEquals(regatta.getMagneticVariation(), 14.1, 0.001); - } catch (Exception e) { - fail("Did not have the correct values"); - } - } -} From 892bfd9676a86f3da7655354e6ebc00c9d82c74b Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 01:22:28 +1200 Subject: [PATCH 16/23] Began on tests for Race class. - Made really good progress using Mockito and calling .handle() on animation timers #story[881] --- mock/src/main/java/seng302/Model/Race.java | 2 +- .../src/test/java/seng302/Model/RaceTest.java | 224 +++++++--------- .../test/java/seng302/Model/RaceXMLTest.java | 96 ------- mock/src/test/resources/mockXML/boatTest.xml | 55 ++++ .../resources/mockXML/boatXML/boatTest.xml | 251 ------------------ mock/src/test/resources/mockXML/raceTest.xml | 57 ++++ .../test/resources/mockXML/regattaTest.xml | 10 - 7 files changed, 204 insertions(+), 491 deletions(-) delete mode 100644 mock/src/test/java/seng302/Model/RaceXMLTest.java create mode 100644 mock/src/test/resources/mockXML/boatTest.xml delete mode 100644 mock/src/test/resources/mockXML/boatXML/boatTest.xml create mode 100644 mock/src/test/resources/mockXML/raceTest.xml diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 2ef104c7..aa6f37a2 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -54,7 +54,7 @@ public class Race implements Runnable { * Countdown timer until race starts. */ - private AnimationTimer countdownTimer = new AnimationTimer() { + protected AnimationTimer countdownTimer = new AnimationTimer() { long currentTime = System.currentTimeMillis(); long timeLeft; @Override diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index bbac7680..cb4a28dc 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -1,146 +1,104 @@ -//package seng302.Model; -// -//import javafx.scene.paint.Color; -//import org.junit.BeforeClass; -//import org.junit.Ignore; -//import org.junit.Test; -//import org.mockito.Mockito; -//import org.xml.sax.SAXException; -//import seng302.DataInput.RaceDataSource; -//import seng302.DataInput.RaceXMLReader; -//import seng302.MockOutput; -// -//import javax.xml.parsers.ParserConfigurationException; -//import java.io.IOException; -//import java.util.ArrayList; -//import java.util.List; -// -//import static org.junit.Assert.assertEquals; -//import static org.junit.Assert.assertTrue; -//import static org.junit.Assert.fail; -//import static org.mockito.Matchers.any; -//import static org.mockito.Mockito.atLeast; -//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); -// -//// @Override -//// public void start(Stage primaryStage) throws Exception{} -//// -//// public static void main(String[] args) { -//// launch(args); -//// } -// -// -//// @BeforeClass -//// public static void initJFX() { -//// Thread t = new Thread("JavaFX Init Thread") { -//// public void run() { -//// Application.launch(TestApp.class, new String[0]); -//// } -//// }; -//// 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); -// } -// +package seng302.Model; + +import javafx.scene.paint.Color; +import org.junit.BeforeClass; +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 java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.*; + +/** + * Created by esa46 on 15/03/17. + */ +public class RaceTest{ + + @Test + public void countdownTimerSendsBoatLocations() { + + 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.initialiseBoats(); + testRace.countdownTimer.handle(1); + verify(mockOutput, atLeast(boatDataSource.getBoats().size())).parseBoatLocation(anyInt(), anyDouble(), anyDouble(), anyDouble(), anyDouble()); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void countdownTimerSendsRaceStatusMessages() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + 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(); + } + } + // @Test // public void checkPositionUpdatesNumberFinishedBoats() { // -// SharedModel.BoatInRace finishedBoat = new SharedModel.BoatInRace("Test", 1000, Color.ALICEBLUE, "tt", 1); +// Boat finishedBoat = new Boat(1000, "Name", "Country"); // finishedBoat.setDistanceTravelledInLeg(500); // // finishedBoat.setCurrentLeg(FINISH_LEG); // -// ArrayList boats = new ArrayList<>(); +// ArrayList boats = new ArrayList<>(); // boats.add(finishedBoat); // -// ArrayList legs = new ArrayList<>(); +// 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); +// Boat unFinishedBoat = new Boat("Test", 10, Color.ALICEBLUE, "tt", 1); // unFinishedBoat.setDistanceTravelledInLeg(0); // // unFinishedBoat.setCurrentLeg(FINISH_LEG); // -// ArrayList boats = new ArrayList<>(); +// ArrayList boats = new ArrayList<>(); // boats.add(unFinishedBoat); // -// ArrayList legs = new ArrayList<>(); +// ArrayList legs = new ArrayList<>(); // legs.add(FINISH_LEG); // // @@ -155,9 +113,9 @@ // @Test // public void distanceTravelledBeforeUpdatingLegIsRetained() { // -// ArrayList boats = new ArrayList<>(); +// ArrayList boats = new ArrayList<>(); // -// ArrayList legs = new ArrayList<>(); +// ArrayList legs = new ArrayList<>(); // // legs.add(START_LEG); // legs.add(FINISH_LEG); @@ -165,7 +123,7 @@ // Race race = new Race(boats, legs, 1, mockOutput); // race.setDnfChance(0); // -// SharedModel.BoatInRace unFinishedBoat = new SharedModel.BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 4); +// Boat unFinishedBoat = new Boat("Test", 10, Color.ALICEBLUE, "tt", 4); // unFinishedBoat.setDistanceTravelledInLeg(100); // unFinishedBoat.setCurrentLeg(START_LEG); // @@ -179,9 +137,9 @@ // @Test // public void timerDelaysByHalfSecond() throws InterruptedException { // -// ArrayList boats = new ArrayList<>(); +// ArrayList boats = new ArrayList<>(); // -// ArrayList legs = new ArrayList<>(); +// ArrayList legs = new ArrayList<>(); // legs.add(START_LEG); // // Race race = new Race(boats, legs, 1, mockOutput); @@ -207,17 +165,17 @@ // 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<>(); +// Boat boat1 = new Boat("test", vel1, Color.ALICEBLUE, "tt",1); +// Boat boat2 = new Boat("test", vel2, Color.ALICEBLUE, "tt", 2); +// Boat boat3 = new Boat("test", vel3, Color.ALICEBLUE, "tt", 3); +// Boat boat4 = new Boat("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<>(); +// ArrayList legs = new ArrayList<>(); // legs.add(START_LEG); // // @@ -232,9 +190,9 @@ // } // @Test // public void doNotFinishCorrectly() { -// ArrayList boats = new ArrayList<>(); +// ArrayList boats = new ArrayList<>(); // -// ArrayList legs = new ArrayList<>(); +// ArrayList legs = new ArrayList<>(); // legs.add(START_LEG); // // Race race = new Race(boats, legs, 1, mockOutput); @@ -245,7 +203,7 @@ // race.setDnfChance(0); // assertTrue(!race.doNotFinish()); // } -// -// -// -//} + + + +} diff --git a/mock/src/test/java/seng302/Model/RaceXMLTest.java b/mock/src/test/java/seng302/Model/RaceXMLTest.java deleted file mode 100644 index 50fac007..00000000 --- a/mock/src/test/java/seng302/Model/RaceXMLTest.java +++ /dev/null @@ -1,96 +0,0 @@ -//package seng302.Model;/** -// * Created by Gondr on 26/03/2017. -// */ -// -//import org.junit.Ignore; -//import org.junit.Test; -//import seng302.DataInput.RaceXMLReader; -// -// -//import java.util.List; -// -//import static org.junit.Assert.*; -// -//public class RaceXMLTest { -// RaceXMLReader raceXMLReader; -// -// @Test -// public void canFindFile() { -// try { -// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); -// } catch (Exception e) { -// fail("Cannot find raceXML/bermuda_AC35.xml in the resources folder"); -// } -// } -// -// @Ignore -// @Test -// public void canReadBoats() { -// try { -// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); -// raceXMLReader.readBoats(); -// List boats = raceXMLReader.getBoats(); -// assertTrue(boats.size() == 6); -// //test boat 1 -// assertEquals(boats.get(0).getName(), "ORACLE TEAM USA"); -// assertTrue(boats.get(0).getVelocity() == 20); -// //test boat 2 -// assertEquals(boats.get(1).getName(), "Land Rover BAR"); -// assertTrue(boats.get(1).getVelocity() == 30); -// assertEquals(boats.get(1).getCountry(), "GBR"); -// //test boat 3 -// assertEquals(boats.get(2).getName(), "SoftBank Team Japan"); -// assertTrue(boats.get(2).getVelocity() == 25); -// assertEquals(boats.get(2).getCountry(), "JPN"); -// //test boat 4 -// assertEquals(boats.get(3).getName(), "Groupama Team France"); -// assertTrue(boats.get(3).getVelocity() == 20); -// assertEquals(boats.get(3).getCountry(), "FRA"); -// //test boat 5 -// assertEquals(boats.get(4).getName(), "Artemis Racing"); -// assertTrue(boats.get(4).getVelocity() == 29); -// assertEquals(boats.get(4).getCountry(), "SWE"); -// //test boat 6 -// assertEquals(boats.get(5).getName(), "Emirates Team New Zealand"); -// assertTrue(boats.get(5).getVelocity() == 62); -// assertEquals(boats.get(5).getCountry(), "NZL"); -// } catch (Exception e) { -// fail("Boat Unreadable"); -// } -// } -// -// @Test -// public void canReadLegs() { -// try { -// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); -// raceXMLReader.readLegs(); -// assertTrue(raceXMLReader.getLegs().size() == 5); -// } catch (Exception e) { -// fail("Legs Unreadable"); -// } -// } -// -// @Test -// public void canReadCourse() { -// try { -// RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); -// raceXMLReader.readCourse(); -// assertTrue(raceXMLReader.getMapTopLeft() != null); -// assertTrue(raceXMLReader.getMapBottomRight() != null); -// assertTrue(raceXMLReader.getFinishPt1() != null); -// assertTrue(raceXMLReader.getFinishPt2() != null); -// assertTrue(raceXMLReader.getStartPt1() != null); -// assertTrue(raceXMLReader.getStartPt2() != null); -// assertTrue(raceXMLReader.getLeewardPt1() != null); -// assertTrue(raceXMLReader.getLeewardPt2() != null); -// assertTrue(raceXMLReader.getWindwardPt1() != null); -// assertTrue(raceXMLReader.getWindwardPt2() != null); -// assertTrue(raceXMLReader.getMark() != null); -// assertTrue(raceXMLReader.getBoundary().size() == 11); -// } catch (Exception e) { -// e.printStackTrace(); -// fail("Course Unreadable"); -// } -// } -// -//} diff --git a/mock/src/test/resources/mockXML/boatTest.xml b/mock/src/test/resources/mockXML/boatTest.xml new file mode 100644 index 00000000..84f911bc --- /dev/null +++ b/mock/src/test/resources/mockXML/boatTest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mock/src/test/resources/mockXML/boatXML/boatTest.xml b/mock/src/test/resources/mockXML/boatXML/boatTest.xml deleted file mode 100644 index 51f788b0..00000000 --- a/mock/src/test/resources/mockXML/boatXML/boatTest.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - - - 2012-05-17T07:49:40+0200 - - 12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mock/src/test/resources/mockXML/raceTest.xml b/mock/src/test/resources/mockXML/raceTest.xml new file mode 100644 index 00000000..4ad5f88f --- /dev/null +++ b/mock/src/test/resources/mockXML/raceTest.xml @@ -0,0 +1,57 @@ + + + 5326 + FLEET + 2017-04-19T15:30:00+1200 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mock/src/test/resources/mockXML/regattaTest.xml b/mock/src/test/resources/mockXML/regattaTest.xml index 9ec88ccc..86526130 100644 --- a/mock/src/test/resources/mockXML/regattaTest.xml +++ b/mock/src/test/resources/mockXML/regattaTest.xml @@ -1,20 +1,10 @@ - - 3 - New Zealand Test - North Head - -36.82791529 - 174.81218919 - 0.00 - 12 - 14.1 - \ No newline at end of file From 0bb18c7957c443841d178d8e7c3b8cb088931af3 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 13:34:26 +1200 Subject: [PATCH 17/23] Temporarily ignoring animation tests - The VMs don't have the necessary libraries to run them #story[881] --- mock/src/test/java/seng302/Model/RaceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index cb4a28dc..e4b70b73 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.*; */ public class RaceTest{ + @Ignore @Test public void countdownTimerSendsBoatLocations() { @@ -48,6 +49,7 @@ public class RaceTest{ } } + @Ignore @Test public void countdownTimerSendsRaceStatusMessages() { From 11f6dee30179f12f804827f70d4446c36581a247 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 15:43:12 +1200 Subject: [PATCH 18/23] Added a number of race tests. - Still unable to get animation timer tests working. May be necessary to make handle() hold nothing but a method call #story[881] --- mock/src/main/java/seng302/Model/Race.java | 8 +- .../src/test/java/seng302/Model/RaceTest.java | 367 +++++++++++------- 2 files changed, 227 insertions(+), 148 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index aa6f37a2..ee51f996 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -208,8 +208,8 @@ public class Race implements Runnable { //distanceTravelled = velocity (nm p hr) * time taken to update loop double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; - double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); + System.out.println(totalDistanceTravelled); boolean finish = boat.getCurrentLeg().getName().equals("Finish"); if (!finish) { @@ -225,11 +225,14 @@ public class Race implements Runnable { protected void checkPosition(Boat boat, long timeElapsed) { if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { //boat has passed onto new leg + if (boat.getCurrentLeg().getName().equals("Finish")) { //boat has finished boatsFinished++; boat.setTimeFinished(timeElapsed); boat.setTimeFinished(timeElapsed); + boat.setVelocity(0); + boat.setScaledVelocity(0); } else if (doNotFinish()) { boatsFinished++; boat.setTimeFinished(timeElapsed); @@ -241,10 +244,7 @@ public class Race implements Runnable { boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); //Move boat on to next leg Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); - boat.setCurrentLeg(nextLeg); - //Add overshoot distance into the distance travelled for the next leg - boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); } } } diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index e4b70b73..f3e452a9 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -1,7 +1,7 @@ package seng302.Model; -import javafx.scene.paint.Color; -import org.junit.BeforeClass; + +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; @@ -17,11 +17,9 @@ import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; -import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; + +import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; @@ -30,6 +28,24 @@ import static org.mockito.Mockito.*; */ public class RaceTest{ + + public static final Marker ORIGIN = new Marker(new GPSCoordinate(0, 0)); + public static final Marker THREE_NM_FROM_ORIGIN = new Marker(new GPSCoordinate(0.050246769, 0)); + public static final Marker FIFTEEN_NM_FROM_ORIGIN = new Marker(new GPSCoordinate(0.251233845, 0)); + public static ArrayList 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() { @@ -67,145 +83,208 @@ public class RaceTest{ } } -// @Test -// public void checkPositionUpdatesNumberFinishedBoats() { -// -// Boat finishedBoat = new Boat(1000, "Name", "Country"); -// 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); -// assertEquals(race.boatsFinished, 0); -// -// race.checkPosition(finishedBoat, 100000); -// assertEquals(race.boatsFinished, 1); -// assertEquals(finishedBoat.getTimeFinished(), 100000); -// } - -// @Test -// public void checkPositionDoesntUpdateNumberFinishedBoats() { -// -// Boat unFinishedBoat = new Boat("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); -// -// Boat unFinishedBoat = new Boat("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; -// Boat boat1 = new Boat("test", vel1, Color.ALICEBLUE, "tt",1); -// Boat boat2 = new Boat("test", vel2, Color.ALICEBLUE, "tt", 2); -// Boat boat3 = new Boat("test", vel3, Color.ALICEBLUE, "tt", 3); -// Boat boat4 = new Boat("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()); -// } + @Test + public void checkPositionFinishedUpdatesNumberFinishedBoats() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + Race testRace = new Race(dataSource, mockOutput); + testRace.initialiseBoats(); + Boat testBoat = testRace.startingBoats.get(0); + testBoat.setCurrentLeg(FINISH_LEG); + testBoat.setDistanceTravelledInLeg(1); + testRace.checkPosition(testBoat, 1); + + assertEquals(testRace.boatsFinished, 1); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void checkPositionSetFinishedBoatVelocityTo0() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + Race testRace = new Race(dataSource, mockOutput); + testRace.initialiseBoats(); + Boat testBoat = testRace.startingBoats.get(0); + testBoat.setCurrentLeg(FINISH_LEG); + testBoat.setDistanceTravelledInLeg(1); + testRace.checkPosition(testBoat, 1); + + assertEquals(testBoat.getVelocity(), 0, 1e-8); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void checkPositionSetsFinishTime() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + Race testRace = new Race(dataSource, mockOutput); + testRace.initialiseBoats(); + Boat testBoat = testRace.startingBoats.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(); + } + } + + @Test + public void checkPositionUnfinishedDoesntUpdateNumberFinishedBoats() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + Race testRace = new Race(dataSource, mockOutput); + testRace.initialiseBoats(); + Boat testBoat = testRace.startingBoats.get(0); + testBoat.setCurrentLeg(START_LEG); + testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE); + testRace.checkPosition(testBoat, 1); + + assertEquals(testRace.boatsFinished, 0); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void distanceTravelledBeforeUpdatingLegIsRetained() { + + try { + MockOutput mockOutput = Mockito.mock(MockOutput.class); + RaceDataSource dataSource = new RaceXMLReader("mockXML/raceTest.xml", new BoatXMLReader("mockXML/boatTest.xml")); + Race testRace = new Race(dataSource, mockOutput); + testRace.initialiseBoats(); + Boat testBoat = testRace.startingBoats.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(); + } + } + + @Test + public void doNotFinishAnswersYesIf100PercentChance() { + + 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.setDnfChance(100); + assertTrue(testRace.doNotFinish()); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void doNotFinishAnswersNoIf0PercentChance() { + + 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.setDnfChance(0); + assertFalse(testRace.doNotFinish()); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void boatsAreSetToDNF() { + 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.setDnfChance(100); + Boat testBoat = testRace.startingBoats.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(); + } + + } + + @Test + public void updatePositionIgnoresFinishedBoats() { + 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); + Boat testBoat = testRace.startingBoats.get(0); + testBoat.setCurrentLeg(FINISH_LEG); + testBoat.setCurrentPosition(ORIGIN.getAverageGPSCoordinate()); + testRace.updatePosition(testBoat, 1); + assertEquals(testBoat.getCurrentPosition(), ORIGIN.getAverageGPSCoordinate()); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void updatePositionChangesBoatPosition() { + 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.initialiseBoats(); + Boat testBoat = testRace.startingBoats.get(0); + testBoat.setCurrentLeg(START_LEG); + testBoat.setDistanceTravelledInLeg(START_LEG_DISTANCE - 1); + testBoat.setCurrentPosition(ORIGIN.getAverageGPSCoordinate()); + testRace.updatePosition(testBoat, 100); + assertFalse(testBoat.getCurrentPosition() == ORIGIN.getAverageGPSCoordinate()); + + } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { + e.printStackTrace(); + fail(); + } + } } From 799e58814574c8dcaab5451e9ce66fb869083155 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 16:01:44 +1200 Subject: [PATCH 19/23] Unignored a couple of GPS tests - The issue was with accuracy. Average of two coords is fine fo two point fairly close together (<1km), but not for very very large distances. - We only ever use it for small ranges so changed tests to reflect that #story[881] --- mock/src/main/java/seng302/Model/CompoundMark.java | 14 -------------- .../test/java/seng302/Model/CompoundMarkTest.java | 13 +++++++------ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/mock/src/main/java/seng302/Model/CompoundMark.java b/mock/src/main/java/seng302/Model/CompoundMark.java index d4524a20..df9e4cd9 100644 --- a/mock/src/main/java/seng302/Model/CompoundMark.java +++ b/mock/src/main/java/seng302/Model/CompoundMark.java @@ -11,7 +11,6 @@ public class CompoundMark extends Marker{ private GPSCoordinate averageGPSCoordinate; private Mark mark1; private Mark mark2 = null; - private String name; public CompoundMark(Mark mark1) { super(mark1.getPosition()); @@ -28,15 +27,6 @@ public class CompoundMark extends Marker{ } - public CompoundMark(String name, Mark mark1, Mark mark2) { - super(name, mark1.getPosition(), mark2.getPosition()); - this.name = name; - this.mark1 = mark1; - this.mark2 = mark2; - this.averageGPSCoordinate = calculateAverage(); - - } - public GPSCoordinate getMark1() { return mark1.getPosition(); } @@ -49,10 +39,6 @@ public class CompoundMark extends Marker{ return averageGPSCoordinate; } - public String getName() { - return name; - } - private GPSCoordinate calculateAverage() { if(mark2 != null) { GeodeticCalculator calc = new GeodeticCalculator(); diff --git a/mock/src/test/java/seng302/Model/CompoundMarkTest.java b/mock/src/test/java/seng302/Model/CompoundMarkTest.java index 29b542b5..00035995 100644 --- a/mock/src/test/java/seng302/Model/CompoundMarkTest.java +++ b/mock/src/test/java/seng302/Model/CompoundMarkTest.java @@ -4,6 +4,7 @@ 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. @@ -29,13 +30,12 @@ public class CompoundMarkTest { } - @Ignore @Test public void averageLatOfTwoMarksIsAccurate() { - GPSCoordinate testCoord = new GPSCoordinate(10, 0); + GPSCoordinate testCoord = new GPSCoordinate(0.001, 0); Marker testMark = new Marker(ORIGIN_COORD, testCoord); - assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(5, 0))); + assertEquals(testMark.getAverageGPSCoordinate(), new GPSCoordinate(0.0005, 0)); } @Test @@ -50,10 +50,11 @@ public class CompoundMarkTest { @Test public void averageLatAndLongOfTwoMarksIsAccurate() { - GPSCoordinate testCoord1 = new GPSCoordinate(10, 30); - GPSCoordinate testCoord2 = new GPSCoordinate(30, 60); + GPSCoordinate testCoord1 = new GPSCoordinate(0.0, 30); + GPSCoordinate testCoord2 = new GPSCoordinate(0.001, 60); Marker testMark = new Marker(testCoord1, testCoord2); - assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(020.644102, 44.014817))); + assertEquals(testMark.getAverageGPSCoordinate().getLatitude(), 0.00051776, 1e-8); + assertEquals(testMark.getAverageGPSCoordinate().getLongitude(), 45.000000, 1e-8); } } From 5708db1936a7874b5edbfcb5d724a2f548435509 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 11 May 2017 16:29:25 +1200 Subject: [PATCH 20/23] Ignoring all new race tests - Thought they they would be ok bc not calling animation timer directly - Was mistaken #story[881] --- mock/src/test/java/seng302/Model/RaceTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index f3e452a9..fbde16c6 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -83,6 +83,7 @@ public class RaceTest{ } } + @Ignore @Test public void checkPositionFinishedUpdatesNumberFinishedBoats() { @@ -104,6 +105,7 @@ public class RaceTest{ } } + @Ignore @Test public void checkPositionSetFinishedBoatVelocityTo0() { @@ -125,6 +127,7 @@ public class RaceTest{ } } + @Ignore @Test public void checkPositionSetsFinishTime() { @@ -146,6 +149,7 @@ public class RaceTest{ } } + @Ignore @Test public void checkPositionUnfinishedDoesntUpdateNumberFinishedBoats() { @@ -168,6 +172,7 @@ public class RaceTest{ } + @Ignore @Test public void distanceTravelledBeforeUpdatingLegIsRetained() { @@ -189,6 +194,7 @@ public class RaceTest{ } } + @Ignore @Test public void doNotFinishAnswersYesIf100PercentChance() { @@ -207,6 +213,7 @@ public class RaceTest{ } } + @Ignore @Test public void doNotFinishAnswersNoIf0PercentChance() { @@ -225,6 +232,7 @@ public class RaceTest{ } } + @Ignore @Test public void boatsAreSetToDNF() { try { @@ -246,6 +254,7 @@ public class RaceTest{ } + @Ignore @Test public void updatePositionIgnoresFinishedBoats() { try { @@ -265,6 +274,7 @@ public class RaceTest{ } } + @Ignore @Test public void updatePositionChangesBoatPosition() { try { From a91bc459f79bb0e3a0af4d407ae5f8672e79cb4a Mon Sep 17 00:00:00 2001 From: zwu18 Date: Fri, 12 May 2017 02:10:17 +1200 Subject: [PATCH 21/23] Implemented functionality for mock to parse marker boats throughout race. -Added getter to CompoundMark to get the Mark value. #story[881] --- .../main/java/seng302/Model/CompoundMark.java | 4 ++++ mock/src/main/java/seng302/Model/Race.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/mock/src/main/java/seng302/Model/CompoundMark.java b/mock/src/main/java/seng302/Model/CompoundMark.java index df9e4cd9..68e4a5ca 100644 --- a/mock/src/main/java/seng302/Model/CompoundMark.java +++ b/mock/src/main/java/seng302/Model/CompoundMark.java @@ -27,6 +27,10 @@ public class CompoundMark extends Marker{ } + public Mark getMark1Source() { return mark1; } + + public Mark getMark2Source() { return mark2; } + public GPSCoordinate getMark1() { return mark1.getPosition(); } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index ee51f996..18a4c2cc 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -24,6 +24,7 @@ import java.util.Random; public class Race implements Runnable { protected ObservableList startingBoats; + protected ObservableList compoundMarks; protected List legs; protected int boatsFinished = 0; protected long totalTimeElapsed; @@ -36,6 +37,7 @@ public class Race implements Runnable { public Race(RaceDataSource raceData, MockOutput mockOutput) { this.startingBoats = FXCollections.observableArrayList(raceData.getBoats()); this.legs = raceData.getLegs(); + this.compoundMarks = FXCollections.observableArrayList(raceData.getCompoundMarks()); this.legs.add(new Leg("Finish", this.legs.size())); this.raceId = raceData.getRaceId(); this.mockOutput = mockOutput; @@ -50,6 +52,19 @@ public class Race implements Runnable { countdownTimer.start(); } + /** + * Parse the marker boats through mock output + */ + public void parseMarks() { + for (CompoundMark mark : compoundMarks){ + mockOutput.parseBoatLocation(mark.getMark1Source().getSourceID(), mark.getMark1().getLatitude(), mark.getMark1().getLongitude(),0,0); + if (mark.getMark2Source()!=null){ + mockOutput.parseBoatLocation(mark.getMark2Source().getSourceID(), mark.getMark2().getLatitude(), mark.getMark2().getLongitude(),0,0); + } + } + } + + /** * Countdown timer until race starts. */ @@ -72,6 +87,7 @@ public class Race implements Runnable { boat.getCurrentPosition().getLongitude(), boat.getHeading(), 0); boatStatuses.add(new BoatStatus(boat.getSourceID(), BoatStatusEnum.PRESTART, 0)); } + parseMarks(); int raceStatusNumber = timeLeft <= 60000 / scaleFactor && timeLeft > 0? 2 : 1; RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, raceStatusNumber, startTime, 0, 2300, 1, boatStatuses); @@ -116,6 +132,7 @@ public class Race implements Runnable { stop(); } } + parseMarks(); boatOffset = (boatOffset + 1) % (startingBoats.size()); RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses); mockOutput.parseRaceStatus(raceStatus); From 493932b93feab4162dddbfd56275becdf6f401e7 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 12 May 2017 10:27:55 +1200 Subject: [PATCH 22/23] Merged with visualiser side of mark boats #story[881] --- .../java/seng302/Mock/StreamedCourse.java | 4 +- .../main/java/seng302/Mock/StreamedRace.java | 6 +- .../main/java/seng302/Model/BoatInRace.java | 4 +- .../src/main/java/seng302/Model/Leg.java | 30 ++++----- .../Model/{CompoundMark.java => Marker.java} | 0 .../src/main/java/seng302/RaceDataSource.java | 4 +- .../src/main/java/seng302/RaceXMLReader.java | 18 +++--- .../java/seng302/Mock/StreamedRaceTest.java | 4 +- .../java/seng302/Model/BoatInRaceTest.java | 62 +++++++++---------- .../src/test/java/seng302/Model/LegTest.java | 24 +++---- ...{CompoundMarkTest.java => MarkerTest.java} | 12 ++-- 11 files changed, 84 insertions(+), 84 deletions(-) rename visualiser/src/main/java/seng302/Model/{CompoundMark.java => Marker.java} (100%) rename visualiser/src/test/java/seng302/Model/{CompoundMarkTest.java => MarkerTest.java} (77%) diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 28ea85da..2457baf9 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -2,8 +2,8 @@ package seng302.Mock; import seng302.GPSCoordinate; import seng302.Model.Boat; -import seng302.Model.CompoundMark; import seng302.Model.Leg; +import seng302.Model.Marker; import seng302.RaceDataSource; import java.time.ZonedDateTime; @@ -75,7 +75,7 @@ public class StreamedCourse extends Observable implements RaceDataSource { return streamedCourseXMLReader.getLegs(); } - public List getMarkers() { return streamedCourseXMLReader.getCompoundMarks(); } + public List getMarkers() { return streamedCourseXMLReader.getMarkers(); } public List getBoundary() { return streamedCourseXMLReader.getBoundary(); diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 0c16c594..75318754 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -4,7 +4,7 @@ import seng302.Controllers.RaceController; import seng302.GPSCoordinate; import seng302.Model.Boat; import seng302.Model.Leg; -import seng302.Model.CompoundMark; +import seng302.Model.Marker; import seng302.Model.Race; import seng302.Networking.Messages.BoatLocation; import seng302.Networking.Messages.BoatStatus; @@ -25,12 +25,12 @@ public class StreamedRace extends Race { public void initialiseBoats() { Leg officialStart = legs.get(0); String name = officialStart.getName(); - CompoundMark endCompoundMark = officialStart.getEndCompoundMark(); + Marker endCompoundMark = officialStart.getEndMarker(); for (Boat boat : startingBoats) { if (boat != null) { Leg startLeg = new Leg(name, 0); - startLeg.setEndCompoundMark(endCompoundMark); + startLeg.setEndMarker(endCompoundMark); boat.setCurrentLeg(startLeg); } } diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index c1db16a2..39087177 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -58,8 +58,8 @@ public class BoatInRace extends Boat { public double calculateAzimuth() { GeodeticCalculator calc = new GeodeticCalculator(); - GPSCoordinate start = currentLeg.getStartCompoundMark().getAverageGPSCoordinate(); - GPSCoordinate end = currentLeg.getEndCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate(); + GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate(); calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude()); calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude()); diff --git a/visualiser/src/main/java/seng302/Model/Leg.java b/visualiser/src/main/java/seng302/Model/Leg.java index 2702a09f..3b394fd1 100644 --- a/visualiser/src/main/java/seng302/Model/Leg.java +++ b/visualiser/src/main/java/seng302/Model/Leg.java @@ -9,8 +9,8 @@ import seng302.GPSCoordinate; public class Leg { private final String name; //nautical miles private double distance; - private CompoundMark startCompoundMark; - private CompoundMark endCompoundMark; + private Marker startMarker; + private Marker endMarker; private final int legNumber; // 1 nautical mile = 1852 meters public static final int NM_TO_METERS = 1852; @@ -23,10 +23,10 @@ public class Leg { * @param end marker * @param number Leg's position in race */ - public Leg(String name, CompoundMark start, CompoundMark end, int number) { + public Leg(String name, Marker start, Marker end, int number) { this.name = name; - this.startCompoundMark = start; - this.endCompoundMark = end; + this.startMarker = start; + this.endMarker = end; this.legNumber = number; calculateDistance(); } @@ -71,20 +71,20 @@ public class Leg { } - public CompoundMark getStartCompoundMark() { - return startCompoundMark; + public Marker getStartMarker() { + return startMarker; } - public void setStartCompoundMark(CompoundMark startCompoundMark) { - this.startCompoundMark = startCompoundMark; + public void setStartMarker(Marker startMarker) { + this.startMarker = startMarker; } - public CompoundMark getEndCompoundMark() { - return endCompoundMark; + public Marker getEndMarker() { + return endMarker; } - public void setEndCompoundMark(CompoundMark endCompoundMark) { - this.endCompoundMark = endCompoundMark; + public void setEndMarker(Marker endMarker) { + this.endMarker = endMarker; } /** @@ -94,8 +94,8 @@ public class Leg { GeodeticCalculator calc = new GeodeticCalculator(); //Load start and end of leg - GPSCoordinate startMarker = this.startCompoundMark.getAverageGPSCoordinate(); - GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate(); + GPSCoordinate startMarker = this.startMarker.getAverageGPSCoordinate(); + GPSCoordinate endMarker = this.endMarker.getAverageGPSCoordinate(); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); this.distance = calc.getOrthodromicDistance() / NM_TO_METERS; diff --git a/visualiser/src/main/java/seng302/Model/CompoundMark.java b/visualiser/src/main/java/seng302/Model/Marker.java similarity index 100% rename from visualiser/src/main/java/seng302/Model/CompoundMark.java rename to visualiser/src/main/java/seng302/Model/Marker.java diff --git a/visualiser/src/main/java/seng302/RaceDataSource.java b/visualiser/src/main/java/seng302/RaceDataSource.java index a4aba9e6..5f2e52ad 100644 --- a/visualiser/src/main/java/seng302/RaceDataSource.java +++ b/visualiser/src/main/java/seng302/RaceDataSource.java @@ -1,8 +1,8 @@ package seng302; import seng302.Model.Boat; -import seng302.Model.CompoundMark; import seng302.Model.Leg; +import seng302.Model.Marker; import java.time.ZonedDateTime; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; public interface RaceDataSource { List getBoats(); List getLegs(); - List getMarkers(); + List getMarkers(); List getBoundary(); ZonedDateTime getZonedDateTime(); diff --git a/visualiser/src/main/java/seng302/RaceXMLReader.java b/visualiser/src/main/java/seng302/RaceXMLReader.java index d615ddeb..ddab0b27 100644 --- a/visualiser/src/main/java/seng302/RaceXMLReader.java +++ b/visualiser/src/main/java/seng302/RaceXMLReader.java @@ -89,10 +89,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { for (int i = 0; i < nLegs.getLength(); i++) { String label = getTextValueOfNode((Element) nLegs.item(i), "name"); NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - CompoundMark startCompoundMark = getMarker(start); + Marker startMarker = getMarker(start); NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - CompoundMark finishCompoundMark = getMarker(finish); - legs.add(new Leg(label, startCompoundMark, finishCompoundMark, i)); + Marker finishMarker = getMarker(finish); + legs.add(new Leg(label, startMarker, finishMarker, i)); } } @@ -172,7 +172,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param start base nodelist this should be the tag that contains * @return */ - private CompoundMark getMarker(NodeList start) { + private Marker getMarker(NodeList start) { return getMarker(start, 0); } @@ -182,7 +182,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param startIndex index in the node that has the coordinate tag * @return */ - private CompoundMark getMarker(NodeList start, int startIndex) { + private Marker getMarker(NodeList start, int startIndex) { return getMarker(start, startIndex, 0); } @@ -193,7 +193,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param nodeIndex coordinate index * @return */ - private CompoundMark getMarker(NodeList start, int startIndex, int nodeIndex) { + private Marker getMarker(NodeList start, int startIndex, int nodeIndex) { NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); Element marker = (Element) nodeList.item(nodeIndex); return getMarker(marker); @@ -204,7 +204,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { * @param markerNode marker to turn into coordinates * @return */ - private CompoundMark getMarker(Element markerNode) { + private Marker getMarker(Element markerNode) { NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); @@ -215,7 +215,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { } else { side2 = side1; } - return new CompoundMark(side1, side2); + return new Marker(side1, side2); } @@ -265,7 +265,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { } @Override - public List getMarkers() { + public List getMarkers() { return null; } diff --git a/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java b/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java index 98a1f986..bca938c7 100644 --- a/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java +++ b/visualiser/src/test/java/seng302/Mock/StreamedRaceTest.java @@ -5,7 +5,7 @@ import org.junit.Ignore; import org.junit.Test; import seng302.GPSCoordinate; import seng302.Model.Leg; -import seng302.Model.CompoundMark; +import seng302.Model.Marker; import java.util.List; @@ -87,7 +87,7 @@ public class StreamedRaceTest { GPSCoordinate topLeft = streamedCourseXMLReader.getMapTopLeft(); GPSCoordinate bottomRight = streamedCourseXMLReader.getMapBottomRight(); - for(CompoundMark compoundMark : streamedCourseXMLReader.getCompoundMarks()) { + for(Marker compoundMark : streamedCourseXMLReader.getMarkers()) { GPSCoordinate centre = compoundMark.getAverageGPSCoordinate(); assertTrue(centre.getLatitude() < bottomRight.getLatitude()); assertTrue(centre.getLatitude() > topLeft.getLatitude()); diff --git a/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java b/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java index a761bac9..029a0f43 100644 --- a/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java +++ b/visualiser/src/test/java/seng302/Model/BoatInRaceTest.java @@ -19,18 +19,18 @@ public class BoatInRaceTest { @Test public void calculateDueNorthAzimuthReturns0() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 0, 1e-8); } @Test public void calculateDueSouthAzimuthReturns180() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 180, 1e-8); } @@ -39,9 +39,9 @@ public class BoatInRaceTest { @Test public void calculateDueEastAzimuthReturns90() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), 90, 1e-8); } @@ -49,9 +49,9 @@ public class BoatInRaceTest { @Test public void calculateDueWestAzimuthReturnsNegative90() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateAzimuth(), -90, 1e-8); @@ -60,9 +60,9 @@ public class BoatInRaceTest { @Test public void calculateDueNorthHeadingReturns0() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 0, 1e-8); } @@ -70,27 +70,27 @@ public class BoatInRaceTest { @Test public void calculateDueEastHeadingReturns90() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, 50)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, 50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 90, 1e-8); } @Test public void calculateDueSouthHeadingReturns180() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(-50, 0)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 180, 1e-8); } @Test public void calculateDueWestHeadingReturns270() { - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(0, -50)); - Leg start = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(0, -50)); + Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); assertEquals(TEST_BOAT.calculateHeading(), 270, 1e-8); } @@ -117,16 +117,16 @@ public class BoatInRaceTest { BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); // Construct leg of 0 degrees - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); - Leg leg0deg = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg leg0deg = new Leg("Start", startMarker, endMarker, 0); boat.setCurrentLeg(leg0deg); boat.setCurrentPosition(new GPSCoordinate(0, 0)); assertEquals(0, boat.calculateHeading(), 1e-8); // Construct leg from wake - heading should be 180 degrees - Leg leg180deg = new Leg("Start", startCompoundMark, new CompoundMark(boat.getWake()), 0); + Leg leg180deg = new Leg("Start", startMarker, new Marker(boat.getWake()), 0); boat.setCurrentLeg(leg180deg); assertEquals(180, boat.calculateHeading(), 1e-8); @@ -138,9 +138,9 @@ public class BoatInRaceTest { BoatInRace boat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); // Construct leg of 0 degrees at 0 N - CompoundMark startCompoundMark = new CompoundMark(ORIGIN_COORDS); - CompoundMark endCompoundMark = new CompoundMark(new GPSCoordinate(50, 0)); - Leg leg0deg = new Leg("Start", startCompoundMark, endCompoundMark, 0); + Marker startMarker = new Marker(ORIGIN_COORDS); + Marker endMarker = new Marker(new GPSCoordinate(50, 0)); + Leg leg0deg = new Leg("Start", startMarker, endMarker, 0); boat.setCurrentLeg(leg0deg); boat.setCurrentPosition(new GPSCoordinate(0, 0)); diff --git a/visualiser/src/test/java/seng302/Model/LegTest.java b/visualiser/src/test/java/seng302/Model/LegTest.java index 5df351e4..c58f2eb1 100644 --- a/visualiser/src/test/java/seng302/Model/LegTest.java +++ b/visualiser/src/test/java/seng302/Model/LegTest.java @@ -14,7 +14,7 @@ import static seng302.Model.Leg.NM_TO_METERS; */ public class LegTest { - private final CompoundMark ORIGIN_CompoundMark = new CompoundMark(new GPSCoordinate(0, 0)); + private final Marker ORIGIN_Marker = new Marker(new GPSCoordinate(0, 0)); @Test public void calculateDistanceHandles5nmNorth() { @@ -22,8 +22,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(0, 5 * NM_TO_METERS); - CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Marker, endMarker, 0); assertEquals(test.getDistance(), 5, 1e-8); } @@ -33,8 +33,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(90, 12 * NM_TO_METERS); - CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Marker, endMarker, 0); assertEquals(test.getDistance(), 12, 1e-8); } @@ -44,8 +44,8 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(180, 0.5 * NM_TO_METERS); - CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Marker, endMarker, 0); assertEquals(test.getDistance(), 0.5, 1e-8); } @@ -55,23 +55,23 @@ public class LegTest { calc.setStartingGeographicPoint(0, 0); calc.setDirection(-90, 0.1 * NM_TO_METERS); - CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); - Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); + Marker endMarker = getEndMarker(calc.getDestinationGeographicPoint()); + Leg test = new Leg("Test", ORIGIN_Marker, endMarker, 0); assertEquals(test.getDistance(), 0.1, 1e-8); } @Test public void calculateDistanceHandlesZeroDifference() { - Leg test = new Leg("Test", ORIGIN_CompoundMark, ORIGIN_CompoundMark, 0); + Leg test = new Leg("Test", ORIGIN_Marker, ORIGIN_Marker, 0); assertEquals(test.getDistance(), 0, 1e-8); } - private CompoundMark getEndMarker(Point2D point) { + private Marker getEndMarker(Point2D point) { GPSCoordinate coords = new GPSCoordinate(point.getY(), point.getX()); - return new CompoundMark(coords); + return new Marker(coords); } } diff --git a/visualiser/src/test/java/seng302/Model/CompoundMarkTest.java b/visualiser/src/test/java/seng302/Model/MarkerTest.java similarity index 77% rename from visualiser/src/test/java/seng302/Model/CompoundMarkTest.java rename to visualiser/src/test/java/seng302/Model/MarkerTest.java index 9323a5ea..420c5eff 100644 --- a/visualiser/src/test/java/seng302/Model/CompoundMarkTest.java +++ b/visualiser/src/test/java/seng302/Model/MarkerTest.java @@ -8,14 +8,14 @@ import static org.junit.Assert.assertTrue; /** * Created by esa46 on 29/03/17. */ -public class CompoundMarkTest { +public class MarkerTest { private final GPSCoordinate ORIGIN_COORD = new GPSCoordinate(0, 0); @Test public void averageOfSingleMarkAtOriginIsSingleMark() { - CompoundMark testMark = new CompoundMark(ORIGIN_COORD); + Marker testMark = new Marker(ORIGIN_COORD); assertTrue(testMark.getAverageGPSCoordinate().equals(ORIGIN_COORD)); } @@ -24,7 +24,7 @@ public class CompoundMarkTest { public void averageOfSingleMarkIsSingleMark() { GPSCoordinate testCoord = new GPSCoordinate(20, 25); - CompoundMark testMark = new CompoundMark(testCoord); + Marker testMark = new Marker(testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(testCoord)); } @@ -33,7 +33,7 @@ public class CompoundMarkTest { public void averageLatOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(10, 0); - CompoundMark testMark = new CompoundMark(ORIGIN_COORD, testCoord); + Marker testMark = new Marker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(5, 0))); } @@ -41,7 +41,7 @@ public class CompoundMarkTest { public void averageLongOfTwoMarksIsAccurate() { GPSCoordinate testCoord = new GPSCoordinate(0, 10); - CompoundMark testMark = new CompoundMark(ORIGIN_COORD, testCoord); + Marker testMark = new Marker(ORIGIN_COORD, testCoord); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(0, 5))); } @@ -50,7 +50,7 @@ public class CompoundMarkTest { GPSCoordinate testCoord1 = new GPSCoordinate(10, 30); GPSCoordinate testCoord2 = new GPSCoordinate(30, 60); - CompoundMark testMark = new CompoundMark(testCoord1, testCoord2); + Marker testMark = new Marker(testCoord1, testCoord2); assertTrue(testMark.getAverageGPSCoordinate().equals(new GPSCoordinate(020.644102, 44.014817))); } From fb6420524d3bcaa468bbaa27d68363442b5b68a1 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Sat, 13 May 2017 11:57:47 +1200 Subject: [PATCH 23/23] Adding a parameter to test command to debug missing library --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a3225bef..679c9b06 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ junit: stage: test script: - - mvn -B clean test + - mvn -B -Dprism.verbose=true clean test generate_artifacts: stage: deploy