This commit is contained in:
Michael Rausch
2017-03-24 20:45:49 +13:00
19 changed files with 269 additions and 512 deletions
-31
View File
@@ -1,31 +0,0 @@
{
"race-name": "AC35",
"time-scale": 1.0,
"race-size": 6,
"teams": [
{
"team-name": "Oracle Team USA",
"velocity": 60.0
},
{
"team-name": "Artemis Racing",
"velocity": 10.0
},
{
"team-name": "Emirates Team New Zealand",
"velocity": 90.0
},
{
"team-name": "Groupama Team France",
"velocity": 15.0
},
{
"team-name": "Land Rover BAR",
"velocity": 70.0
},
{
"team-name": "SoftBank Team Japan",
"velocity": 45.0
}
]
}
+6 -6
View File
@@ -4,31 +4,31 @@
<team> <team>
<name>Oracle Team USA</name> <name>Oracle Team USA</name>
<alias>USA</alias> <alias>USA</alias>
<velocity>10.0</velocity> <velocity>30.9</velocity>
</team> </team>
<team> <team>
<name>Artemis Racing</name> <name>Artemis Racing</name>
<alias>ART</alias> <alias>ART</alias>
<velocity>10.0</velocity> <velocity>59.3</velocity>
</team> </team>
<team> <team>
<name>Emirates Team New Zealand</name> <name>Emirates Team New Zealand</name>
<alias>NZL</alias> <alias>NZL</alias>
<velocity>10.0</velocity> <velocity>51.5</velocity>
</team> </team>
<team> <team>
<name>Land Rover BAR</name> <name>Land Rover BAR</name>
<alias>BAR</alias> <alias>BAR</alias>
<velocity>10.0</velocity> <velocity>29.9</velocity>
</team> </team>
<team> <team>
<name>SoftBank Team Japan</name> <name>SoftBank Team Japan</name>
<alias>JAP</alias> <alias>JAP</alias>
<velocity>10.0</velocity> <velocity>99.6</velocity>
</team> </team>
<team> <team>
<name>Groupama Team France</name> <name>Groupama Team France</name>
<alias>FRC</alias> <alias>FRC</alias>
<velocity>10</velocity> <velocity>45.6</velocity>
</team> </team>
</teams> </teams>
-3
View File
@@ -14,9 +14,6 @@ public class App extends Application
primaryStage.setTitle("RaceVision"); primaryStage.setTitle("RaceVision");
primaryStage.setScene(new Scene(root)); primaryStage.setScene(new Scene(root));
// seng302.models.OldApp.main(); // Run this to show how positions are updated
// seng302.controllers.RaceController.initializeRace();
primaryStage.show(); primaryStage.show();
} }
@@ -39,7 +39,7 @@ public class BoatPositionController {
positionVbox.getChildren().removeAll(); positionVbox.getChildren().removeAll();
for (Boat boat: boatOrder){ for (Boat boat: boatOrder){
positionVbox.getChildren().add(new Text(boat.getTeamName() + " " + boat.getVelocity())); positionVbox.getChildren().add(new Text(boat.getTeamName() + " " + boat.getSpeedInKnots() + " Knots"));
} }
} }
@@ -3,10 +3,13 @@ package seng302.controllers;
import javafx.animation.*; import javafx.animation.*;
import javafx.beans.property.DoubleProperty; import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.canvas.Canvas; import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
@@ -36,6 +39,16 @@ import java.util.List;
public class CanvasController { public class CanvasController {
@FXML @FXML
private Canvas canvas; private Canvas canvas;
@FXML
private AnchorPane contentAnchorPane;
@FXML
private Text windArrowText, windDirectionText;
@FXML
private Pane raceTimer;
@FXML
private BoatPositionController teamPositionsController;
@FXML
private CheckBox toggleAnnotation;
private Race race; private Race race;
private GraphicsContext gc; private GraphicsContext gc;
@@ -46,87 +59,11 @@ public class CanvasController {
private final double ORIGIN_LAT = 32.320504; private final double ORIGIN_LAT = 32.320504;
private final double ORIGIN_LON = -64.857063; private final double ORIGIN_LON = -64.857063;
@FXML
private AnchorPane contentAnchorPane;
@FXML
private Text windArrowText, windDirectionText;
@FXML Pane raceTimer;
@FXML
BoatPositionController teamPositionsController;
private Animation.Status raceStatus = Animation.Status.PAUSED; private Animation.Status raceStatus = Animation.Status.PAUSED;
private final int SCALE = 16000; private final int SCALE = 16000;
/** private boolean annotationCheck = true;
* Display the list of boats in the order they finished the race
*/
private void loadRaceResultView() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FinishView.fxml"));
loader.setController(new RaceResultController(race));
try {
contentAnchorPane.getChildren().removeAll();
contentAnchorPane.getChildren().clear();
contentAnchorPane.getChildren().addAll((Pane) loader.load());
} catch (javafx.fxml.LoadException e) {
System.err.println(e.getCause());
} catch (IOException e) {
System.err.println(e);
}
}
/**
* Load the race timer
*/
private void loadTimerView(){
FXMLLoader loader = new FXMLLoader(getClass().getResource("/raceTimer.fxml"));
loader.setController(new RaceTimerController(race));
try{
raceTimer.getChildren().clear();
raceTimer.getChildren().removeAll();
raceTimer.getChildren().addAll((Pane) loader.load());
}
catch(javafx.fxml.LoadException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
/**
* Play each boats timeline
*/
private void playTimelines(){
for (TimelineInfo timelineInfo : timelineInfos.values()){
Timeline timeline = timelineInfo.getTimeline();
if (timeline.getStatus() == Animation.Status.PAUSED){
timeline.play();
}
}
raceStatus = Animation.Status.RUNNING;
}
/**
* Pause each boats timeline
*/
private void pauseTimelines(){
for (TimelineInfo timelineInfo : timelineInfos.values()){
Timeline timeline = timelineInfo.getTimeline();
if (timeline.getStatus() == Animation.Status.RUNNING){
timeline.pause();
}
}
raceStatus = Animation.Status.PAUSED;
}
/** /**
* Initialize the controller * Initialize the controller
@@ -196,12 +133,86 @@ public class CanvasController {
loadRaceResultView(); loadRaceResultView();
}); });
toggleAnnotation.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
annotationCheck = !annotationCheck;
}
});
//set wind direction!!!!!!! can't find another place to put my code --haoming //set wind direction!!!!!!! can't find another place to put my code --haoming
double windDirection = new ConfigParser("doc/examples/config.xml").getWindDirection(); double windDirection = new ConfigParser("/config.xml").getWindDirection();
windDirectionText.setText(String.format("%.1f°", windDirection)); windDirectionText.setText(String.format("%.1f°", windDirection));
windArrowText.setRotate(windDirection); windArrowText.setRotate(windDirection);
} }
/**
* Display the list of boats in the order they finished the race
*/
private void loadRaceResultView() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FinishView.fxml"));
loader.setController(new RaceResultController(race));
try {
contentAnchorPane.getChildren().removeAll();
contentAnchorPane.getChildren().clear();
contentAnchorPane.getChildren().addAll((Pane) loader.load());
} catch (javafx.fxml.LoadException e) {
System.err.println(e.getCause());
} catch (IOException e) {
System.err.println(e);
}
}
/**
* Load the race timer
*/
private void loadTimerView(){
FXMLLoader loader = new FXMLLoader(getClass().getResource("/raceTimer.fxml"));
loader.setController(new RaceTimerController(race));
try{
raceTimer.getChildren().clear();
raceTimer.getChildren().removeAll();
raceTimer.getChildren().addAll((Pane) loader.load());
}
catch(javafx.fxml.LoadException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
/**
* Play each boats timeline
*/
private void playTimelines(){
for (TimelineInfo timelineInfo : timelineInfos.values()){
Timeline timeline = timelineInfo.getTimeline();
if (timeline.getStatus() == Animation.Status.PAUSED){
timeline.play();
}
}
raceStatus = Animation.Status.RUNNING;
}
/**
* Pause each boats timeline
*/
private void pauseTimelines(){
for (TimelineInfo timelineInfo : timelineInfos.values()){
Timeline timeline = timelineInfo.getTimeline();
if (timeline.getStatus() == Animation.Status.RUNNING){
timeline.pause();
}
}
raceStatus = Animation.Status.PAUSED;
}
/** /**
* Generates time line for each boat, and stores time time into timelineInfos hash map * Generates time line for each boat, and stores time time into timelineInfos hash map
*/ */
@@ -285,6 +296,8 @@ public class CanvasController {
* @param lat * @param lat
* @param lon * @param lon
* @param color * @param color
* @param name
* @param speed
*/ */
private void drawBoat(double lat, double lon, Color color, String name, double speed, double heading) { private void drawBoat(double lat, double lon, Color color, String name, double speed, double heading) {
// Latitude // Latitude
@@ -293,12 +306,15 @@ public class CanvasController {
double diameter = 9; double diameter = 9;
gc.setFill(color);
if (annotationCheck) {
// Set boat text // Set boat text
gc.setFont(new Font(14)); gc.setFont(new Font(14));
gc.setFill(color);
gc.setLineWidth(3); gc.setLineWidth(3);
gc.setFontSmoothingType(FontSmoothingType.GRAY); gc.setFontSmoothingType(FontSmoothingType.GRAY);
gc.fillText(name + ", " + speed + " knots",x+15,y+15); gc.fillText(name + ", " + speed + " knots", x + 15, y + 15);
}
gc.fillOval(x, y, diameter, diameter); gc.fillOval(x, y, diameter, diameter);
drawWake(gc, x, y, speed, color, heading); drawWake(gc, x, y, speed, color, heading);
@@ -1,15 +1,14 @@
package seng302.controllers; package seng302.controllers;
import seng302.models.Boat; import seng302.models.Boat;
import seng302.models.OldFileParser;
import seng302.models.Race; import seng302.models.Race;
import seng302.models.parsers.ConfigParser;
import seng302.models.parsers.CourseParser; import seng302.models.parsers.CourseParser;
import seng302.models.parsers.TeamsParser;
import java.io.FileNotFoundException;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Map;
import java.util.Random; import java.util.Random;
/** /**
@@ -21,11 +20,11 @@ public class RaceController {
Race race = null; Race race = null;
public void initializeRace() { public void initializeRace() {
String raceConfigFile; String raceConfigFile = "/config.xml";
raceConfigFile = "doc/examples/config.json"; String teamsConfigFile = "/teams.xml";
try { try {
race = createRace(raceConfigFile); race = createRace(raceConfigFile, teamsConfigFile);
} catch (Exception e) { } catch (Exception e) {
System.out.println("There was an error creating the race."); System.out.println("There was an error creating the race.");
} }
@@ -37,36 +36,28 @@ public class RaceController {
} }
} }
public Race createRace(String configFile) throws Exception { public Race createRace(String configFile, String teamsConfigFile) throws Exception {
Race race = new Race(); Race race = new Race();
OldFileParser fp;
// Read team names from file // Read team names from file
try{ TeamsParser tp = new TeamsParser(teamsConfigFile);
fp = new OldFileParser(configFile);
} // Read course from file
catch (FileNotFoundException e){ ConfigParser config = new ConfigParser(configFile);
System.out.println("Config file does not exist");
return null;
}
ArrayList<String> boatNames = new ArrayList<>(); ArrayList<String> boatNames = new ArrayList<>();
ArrayList<Map<String, Object>> teams = fp.getTeams(); ArrayList<Boat> teams = tp.getBoats();
//get race size //get race size
int numberOfBoats = (int) fp.getRaceSize(); int numberOfBoats = teams.size();
int boatsAdded = 0;
//get time scale //get time scale
double timeScale = fp.getTimeScale(); double timeScale = config.getTimeScale();
race.setTimeScale(timeScale); race.setTimeScale(timeScale);
for (Map<String, Object> team : teams) { for (Boat boat : teams) {
if (boatsAdded < numberOfBoats){ boatNames.add(boat.getTeamName());
boatNames.add((String) team.get("team-name")); race.addBoat(boat);
race.addBoat(new Boat(team.get("team-name").toString(), (Double) (team.get("velocity"))));
}
boatsAdded++;
} }
// Shuffle team names // Shuffle team names
@@ -77,8 +68,8 @@ public class RaceController {
return null; return null;
} }
CourseParser cp = new CourseParser("doc/examples/course.xml"); CourseParser course = new CourseParser("/course.xml");
race.addCourse(cp.getCourse()); race.addCourse(course.getCourse());
return race; return race;
} }
-105
View File
@@ -1,105 +0,0 @@
package seng302.models;
import seng302.models.mark.SingleMark;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Random;
import java.io.FileNotFoundException;
public class OldApp {
/**
* Builds a race object for the AC35 course
*
* @return a Race object for the AC35 course
*/
public static Race createRace(String configFile) throws Exception {
Race race = new Race();
OldFileParser fp;
// Read team names from file
try{
fp = new OldFileParser(configFile);
}
catch (FileNotFoundException e){
System.out.println("Config file does not exist");
return null;
}
ArrayList<String> boatNames = new ArrayList<>();
ArrayList<Map<String, Object>> teams = fp.getTeams();
//get race size
int numberOfBoats = (int) fp.getRaceSize();
//get time scale
double timeScale = fp.getTimeScale();
race.setTimeScale(timeScale);
for (Map<String, Object> team : teams) {
boatNames.add((String) team.get("team-name"));
}
// Shuffle team names
long seed = System.nanoTime();
Collections.shuffle(boatNames, new Random(seed));
if (numberOfBoats > Array.getLength(boatNames.toArray())) {
return null;
}
// Add boats to the race
for (int i = 0; i < numberOfBoats; i++) {
race.addBoat(new Boat(boatNames.get(i), (Double) (teams.get(i).get("velocity"))));
}
// Add marks to race in order
// race.addMark(new SingleMark("Start", 32.296038,-64.854401 ));
// race.addMark(new SingleMark("Mid SingleMark", 32.292881,-64.843231 ));
// race.addMark(new SingleMark("Leeward Gate", 32.283808,-64.850012 ));
// race.addMark(new SingleMark("Windward Gate", 32.309908,-64.833665 ));
// race.addMark(new SingleMark("Finish", 32.318439,-64.837367 ));
return race;
}
public static void main() {
Race race = null;
String raceConfigFile;
raceConfigFile = "doc/examples/config.json";
try {
race = createRace(raceConfigFile);
} catch (Exception e) {
System.out.println("There was an error creating the race.");
}
// If race was created
if (race != null) {
//race.displayStartingBoats();
System.out.println("\n\n");
System.out.println("######################");
System.out.println("# Live Race Updates ");
System.out.println("######################");
race.startRace();
System.out.println("\n\n");
System.out.println("######################");
System.out.println("# Race Results ");
System.out.println("######################");
//race.showRaceMarkerResults();
//race.displayFinishingOrder();
} else {
System.out.println("There was an error creating the race. Exiting.");
}
}
}
@@ -1,132 +0,0 @@
package seng302.models;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
/**
* Read team name from a given Json file. So that user can extract information
* efficiently from external files.
*/
public class OldFileParser {
private String filePath;
private JSONObject content;
/**
* used to construct an instance of file parser
*
* @param filePath a string like path to show location of desired file to
* be parsed
*/
public OldFileParser(String filePath) throws Exception {
this.filePath = filePath;
this.readFile();
}
/**
* Reads content from a given file, and return the content as JSONObject.
* Throws FileNotFoundException, if the given file cannot be found.
*/
private void readFile() throws FileNotFoundException {
JSONParser parser = new JSONParser();
try {
this.content = (JSONObject) parser.parse(new FileReader(filePath));
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* Gets time scale setting parameter.
*
* @return long time scale. -1 if parameter is invalid (eg. scale is
* negative number, or containing non numeric character) or cannot be found.
*/
@SuppressWarnings("unchecked")
public double getTimeScale() {
try {
double timeScale = (double) this.content.get("time-scale");
return timeScale >= 0 ? timeScale : -1;
} catch (Exception e) {
e.printStackTrace();
return 1;
}
}
/**
* Gets race name in the setting file.
*
* @return a string of race name. null if race name is invalid or cannot
* be found.
*/
@SuppressWarnings("unchecked")
public String getRaceName() {
try {
return (String) this.content.get("race-name");
} catch (Exception e) {
return null;
}
}
/**
* Gets an array of teams who participate the race.
*
* @return an ArrayList containing strings of team names. null if teams
* setting is invalid or there is no team.
*/
@SuppressWarnings("unchecked")
public ArrayList<Map<String, Object>> getTeams() {
try {
return (ArrayList<Map<String, Object>>) this.content.get("teams");
} catch (Exception e) {
return null;
}
}
/**
* Gets the total number of teams.
*
* @return the number of teams. 0 if no teams or anything goes wrong.
*/
@SuppressWarnings("unchecked")
public long getTotalNumberOfTeams() {
ArrayList<Map<String, Object>> teams = getTeams();
try {
return teams.size();
} catch (Exception e) {
return 0;
}
}
/**
* Gets the number of boats that would compete during a race. Returns the
* total number of race size if parameter is invalid or cannot be found.
*
* @return an int of the race size.
*/
@SuppressWarnings("unchecked")
public long getRaceSize() {
long totalTeams = this.getTotalNumberOfTeams();
try {
long raceSize = (long) this.content.get("race-size");
return raceSize >= 0 && raceSize <= totalTeams ? raceSize : totalTeams;
} catch (Exception e) {
e.printStackTrace();
return totalTeams;
}
}
}
@@ -1,12 +1,14 @@
package seng302.models.parsers; package seng302.models.parsers;
import org.w3c.dom.*; import org.w3c.dom.Document;
import javax.xml.parsers.*;
import java.io.*; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/** /**
*
*
* Created by Haoming Yin (hyi25) on 16/3/2017 * Created by Haoming Yin (hyi25) on 16/3/2017
*/ */
public abstract class FileParser { public abstract class FileParser {
@@ -17,12 +19,12 @@ public abstract class FileParser {
this.filePath = path; this.filePath = path;
} }
protected Document parseFile () { protected Document parseFile() {
try { try {
File file = new File(this.filePath); InputStream is = getClass().getResourceAsStream(this.filePath);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file); Document doc = builder.parse(is);
// optional, in order to recover info from broken line. // optional, in order to recover info from broken line.
doc.getDocumentElement().normalize(); doc.getDocumentElement().normalize();
return doc; return doc;
+1 -3
View File
@@ -25,12 +25,9 @@
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowSpan="3"> <AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowSpan="3">
<children> <children>
<Label layoutX="11.0" layoutY="259.0" text="Team Position" /> <Label layoutX="11.0" layoutY="259.0" text="Team Position" />
<Label layoutX="11.0" layoutY="617.0" text="Race Log" />
<Label layoutX="13.0" layoutY="432.0" text="Annotation toggle" /> <Label layoutX="13.0" layoutY="432.0" text="Annotation toggle" />
<Label layoutX="11.0" layoutY="14.0" text="Timer" /> <Label layoutX="11.0" layoutY="14.0" text="Timer" />
<Label layoutX="11.0" layoutY="88.0" text="Wind direction" /> <Label layoutX="11.0" layoutY="88.0" text="Wind direction" />
<Button layoutX="18.0" layoutY="468.0" mnemonicParsing="false" text="Button" />
<TextArea editable="false" layoutX="11.0" layoutY="640.0" prefHeight="306.0" prefWidth="200.0" />
<Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#76baf8" layoutX="110.0" layoutY="166.0" radius="35.0" stroke="#686868" strokeType="INSIDE" strokeWidth="3.0" /> <Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#76baf8" layoutX="110.0" layoutY="166.0" radius="35.0" stroke="#686868" strokeType="INSIDE" strokeWidth="3.0" />
<Text fx:id="windArrowText" fill="#686868" layoutX="86.0" layoutY="186.0" strokeType="OUTSIDE" strokeWidth="0.0" text="↑"> <Text fx:id="windArrowText" fill="#686868" layoutX="86.0" layoutY="186.0" strokeType="OUTSIDE" strokeWidth="0.0" text="↑">
<font> <font>
@@ -48,6 +45,7 @@
<fx:include fx:id="teamPositions" source="TeamPositions.fxml" /> <fx:include fx:id="teamPositions" source="TeamPositions.fxml" />
</children> </children>
</AnchorPane> </AnchorPane>
<CheckBox fx:id="toggleAnnotation" layoutX="27.0" layoutY="462.0" mnemonicParsing="false" text="Toggle annotation" />
</children> </children>
</AnchorPane> </AnchorPane>
<AnchorPane fx:id="contentAnchorPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="960.0" prefWidth="1280.0" GridPane.columnIndex="1" GridPane.rowSpan="3"> <AnchorPane fx:id="contentAnchorPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="960.0" prefWidth="1280.0" GridPane.columnIndex="1" GridPane.rowSpan="3">
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<configurations>
<race-name>AC35</race-name>
<race-size>6</race-size>
<time-scale>1.0</time-scale>
<wind-direction>135</wind-direction>
</configurations>
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" ?>
<course>
<marks>
<gate>
<name type="start-line">Start</name>
<mark>
<name>Start1</name>
<latitude>32.296577</latitude>
<longitude>-64.854304</longitude>
</mark>
<mark>
<name>Start2</name>
<latitude>32.293771</latitude>
<longitude>-64.855242</longitude>
</mark>
</gate>
<mark>
<name>Mid Mark</name>
<latitude>32.293039</latitude>
<longitude>-64.843983</longitude>
</mark>
<gate>
<name>Leeward Gate</name>
<mark>
<name>Leeward Gate1</name>
<latitude>32.284680</latitude>
<longitude>-64.850045</longitude>
</mark>
<mark>
<name>Leeward Gate2</name>
<latitude>32.280164</latitude>
<longitude>-64.847591</longitude>
</mark>
</gate>
<gate>
<name>Windward Gate</name>
<mark>
<name>Windward Gate1</name>
<latitude>32.309693</latitude>
<longitude>-64.835249</longitude>
</mark>
<mark>
<name>Windward Gate2</name>
<latitude>32.308046</latitude>
<longitude>-64.831785</longitude>
</mark>
</gate>
<gate type="finish-line">
<name>Finish</name>
<mark>
<name>Finish1</name>
<latitude>32.317379</latitude>
<longitude>-64.839291</longitude>
</mark>
<mark>
<name>Finish2</name>
<latitude>32.317257</latitude>
<longitude>-64.836260</longitude>
</mark>
</gate>
</marks>
<order>
<one>Start</one>
<two>Mid Mark</two>
<three>Leeward Gate</three>
<four>Windward Gate</four>
<five>Leeward Gate</five>
<six>Finish</six>
</order>
</course>
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" ?>
<teams>
<team>
<name>Oracle Team USA</name>
<alias>USA</alias>
<velocity>30.9</velocity>
</team>
<team>
<name>Artemis Racing</name>
<alias>ART</alias>
<velocity>59.3</velocity>
</team>
<team>
<name>Emirates Team New Zealand</name>
<alias>NZL</alias>
<velocity>51.5</velocity>
</team>
<team>
<name>Land Rover BAR</name>
<alias>BAR</alias>
<velocity>29.9</velocity>
</team>
<team>
<name>SoftBank Team Japan</name>
<alias>JAP</alias>
<velocity>99.6</velocity>
</team>
<team>
<name>Groupama Team France</name>
<alias>FRC</alias>
<velocity>45.6</velocity>
</team>
</teams>
@@ -1,53 +0,0 @@
package seng302;
import org.junit.Test;
import seng302.models.OldFileParser;
import java.io.FileNotFoundException;
import static org.junit.Assert.assertEquals;
/**
* Unit test for FileParser class
* Created by Haoming on 5/03/17.
*/
public class OldFileParserTest {
/**
* test if it fails from reading non existed file
*/
@Test(expected = FileNotFoundException.class)
public void readNonExistedFile() throws Exception {
OldFileParser fileParser = new OldFileParser("test/java/seng302/non-existed.json");
}
/**
* test a valid json file with valid content.
*/
@Test
public void readValidFile() throws Exception {
OldFileParser fileParser = new OldFileParser("src/test/java/seng302/valid.json");
assertEquals("AC35", fileParser.getRaceName());
assertEquals("Oracle Team USA", fileParser.getTeams().get(0).get("team-name"));
assertEquals(20.9, fileParser.getTeams().get(0).get("velocity"));
assertEquals(2, fileParser.getRaceSize());
assertEquals(6, fileParser.getTotalNumberOfTeams());
}
/**
* test an invalid json file within wrong type value and misnamed
* variable name.
*/
@Test
public void readInvalidFile() throws Exception {
OldFileParser fileParser = new OldFileParser("src/test/java/seng302/invalid.json");
assertEquals(null, fileParser.getRaceName());
assertEquals(null, fileParser.getTeams());
//assertEquals(-1, fileParser.getTimeScale());
assertEquals(null, fileParser.getTeams());
}
}
-9
View File
@@ -1,9 +0,0 @@
{
"time-scale": "abc",
"race-name": 123,
"teams-with-wrong-name": [
"team1",
"team2",
"team3"
]
}
@@ -14,7 +14,7 @@ public class ConfigParserTest {
@Before @Before
public void initializeParser() throws Exception { public void initializeParser() throws Exception {
cp = new ConfigParser("doc/examples/config.xml"); cp = new ConfigParser("/config.xml");
} }
@Test @Test
@@ -18,7 +18,7 @@ public class CourseParserTest {
@Before @Before
public void initializeParser() throws Exception { public void initializeParser() throws Exception {
cp = new CourseParser("doc/examples/course.xml"); cp = new CourseParser("/course.xml");
} }
@Test @Test
@@ -16,7 +16,7 @@ public class TeamsParserTest {
private TeamsParser tp; private TeamsParser tp;
@Before @Before
public void readFile() { public void readFile() {
tp = new TeamsParser("doc/examples/teams.xml"); tp = new TeamsParser("/teams.xml");
} }
@Test @Test
@@ -26,10 +26,10 @@ public class TeamsParserTest {
assertEquals(6, boats.size(), 1e-10); assertEquals(6, boats.size(), 1e-10);
assertEquals("Oracle Team USA", boats.get(0).getTeamName()); assertEquals("Oracle Team USA", boats.get(0).getTeamName());
assertEquals(10, boats.get(0).getVelocity(), 1e-10); assertEquals(30.9, boats.get(0).getVelocity(), 1e-10);
assertEquals("Groupama Team France", boats.get(5).getTeamName()); assertEquals("Groupama Team France", boats.get(5).getTeamName());
assertEquals(10, boats.get(5).getVelocity(), 1e-10); assertEquals(45.6, boats.get(5).getVelocity(), 1e-10);
} }
} }
-31
View File
@@ -1,31 +0,0 @@
{
"race-name": "AC35",
"time-scale": 1,
"race-size": 2,
"teams": [
{
"team-name": "Oracle Team USA",
"velocity": 20.9
},
{
"team-name": "Artemis Racing",
"velocity": 18.3
},
{
"team-name": "Emirates Team New Zealand",
"velocity": 21.5
},
{
"team-name": "Groupama Team France",
"velocity": 19.9
},
{
"team-name": "Land Rover BAR",
"velocity": 17.6
},
{
"team-name": "SoftBank Team Japan",
"velocity": 16.6
}
]
}