Compare commits

..

14 Commits

Author SHA1 Message Date
Haoming Yin 9ca5f5e7fd Updated design decision file in doc. 2017-03-09 16:22:40 +13:00
Haoming Yin abc5df7837 Added unit for boat velocity
#fix #story[6]
2017-03-09 15:00:48 +13:00
Haoming Yin debe2c0cca Fixed documentation for FileParserTest and LegTest
#document #fix
2017-03-09 14:52:13 +13:00
Michael Rausch cfa851b968 Added user manual
Tags: #docs
2017-03-09 12:54:37 +13:00
Michael Rausch 37f4b55b04 Merge branch 'read_config_from_args' into 'master'
Added ability to pass the config file as a command line argument

Tags: #implement

See merge request !16
2017-03-09 12:42:53 +13:00
Michael Rausch c1aa38c1b0 Added ability to pass the config file as a command line argument
Tags: #implement
2017-03-09 12:41:44 +13:00
Michael Rausch 260bf06219 Merge branch 'make-tests' into 'master'
Added tests

Tags: #test

See merge request !15
2017-03-09 12:23:23 +13:00
Michael Rausch 8d85557e10 Added tests
Tags: #test
2017-03-09 12:22:38 +13:00
Michael Rausch d33a88d313 Added docstrings to classes
Tags: #docs
2017-03-08 23:02:45 +13:00
Michael Rausch d3b71c21e5 Merge branch 'format-and-doc' 2017-03-08 22:57:59 +13:00
Michael Rausch d10c6a54f5 Added and fixed docstrings
Tags: #docs
2017-03-08 22:53:22 +13:00
Michael Rausch 0a86dde7e4 Fixed docstrings
Tags: #docs
2017-03-08 22:31:05 +13:00
Michael Rausch ae80b434f6 Added and fixed docstrings
Tags #docs
2017-03-08 22:25:52 +13:00
Haoming Yin b0cd7c8c08 Reformatted doctring and import statements 2017-03-08 14:45:06 +13:00
19 changed files with 882 additions and 711 deletions
+14
View File
@@ -1,2 +1,16 @@
# Design Decisions # Design Decisions
- Code structure
App creates a race instance which can:
instantiate a file parser to extract race setting and team information;
creates and passes legs and teams/boats into event generator to create events;
runs a race and iterates all events that returned from the generator;
prints out event details, including time, involved boats and legs.
- Configuration file
We decided to store the team information including team names and boat velocity, as well as race configuration setting in external file.
To read external files, "Json-simple" library has been used to parse information.
By using this library, we did not have to write our json parser and benefited from the flexibility of json files.
+26 -8
View File
@@ -1,13 +1,31 @@
{ {
"race-name": "AC35", "race-name": "AC35",
"time-scale": 1.0, "time-scale": 2.0,
"race-size": 4, "race-size": 6,
"teams": [ "teams": [
{"team-name": "Oracle Team USA", "velocity": 20.9}, {
{"team-name": "Artemis Racing", "velocity": 18.3}, "team-name": "Oracle Team USA",
{"team-name": "Emirates Team New Zealand", "velocity": 21.5}, "velocity": 20.9
{"team-name": "Groupama Team France","velocity": 19.9}, },
{"team-name": "Land Rover BAR", "velocity": 17.6}, {
{"team-name": "SoftBank Team Japan", "velocity": 16.6} "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
}
] ]
} }
+14
View File
@@ -1 +1,15 @@
# User Manual # User Manual
## Running the application
When you execute the application, it will try to load a configuration file called config.json located in doc/examples/.
You can specify a config file using the using the -f flag, for example 'java -jar app.jar -f doc/examples/config1.json'
## The config file
The teams/boats are specified in the config file under 'teams', each team requires a team name, and a velocity (in meters per second).
The 'time-scale' option lets you change how long the race takes to complete. A time-scale of 1.0 is normal speed, 2.0 is 2x etc.
The 'race-size' option lets you specify how many boats will be selected to compete in each race. There must be at least this many teams defined.
+3 -2
View File
@@ -1,4 +1,4 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>seng302</groupId> <groupId>seng302</groupId>
@@ -40,7 +40,8 @@
<version>2.4.3</version> <version>2.4.3</version>
<configuration> <configuration>
<transformers> <transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries> <manifestEntries>
<Main-Class>seng302.App</Main-Class> <Main-Class>seng302.App</Main-Class>
<X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
+38 -14
View File
@@ -1,18 +1,32 @@
package seng302; package seng302;
import java.util.*;
import java.lang.reflect.Array; 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 App {
public class App
{
/** /**
* Builds a race object for the AC35 course * Builds a race object for the AC35 course
*
* @return a Race object for the AC35 course
*/ */
public static Race createRace() throws Exception{ public static Race createRace(String configFile) throws Exception {
Race race = new Race(); Race race = new Race();
FileParser fp;
// Read team names from file // Read team names from file
FileParser fp = new FileParser("doc/examples/config.json"); try{
fp = new FileParser(configFile);
}
catch (FileNotFoundException e){
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<Map<String, Object>> teams = fp.getTeams();
@@ -35,6 +49,7 @@ public class App
return null; return null;
} }
// Add boats to the race
for (int i = 0; i < numberOfBoats; i++) { for (int i = 0; i < numberOfBoats; i++) {
race.addBoat(new Boat(boatNames.get(i), (Double) (teams.get(i).get("velocity")))); race.addBoat(new Boat(boatNames.get(i), (Double) (teams.get(i).get("velocity"))));
} }
@@ -52,15 +67,22 @@ public class App
return race; return race;
} }
public static void main( String[] args ) public static void main(String[] args) {
{
Race race = null; Race race = null;
String raceConfigFile;
if (args.length == 2 && args[0].equals("-f")){
raceConfigFile = args[1];
}
else{
// Use default config
raceConfigFile = "doc/examples/config.json";
}
try { try {
race = createRace(); race = createRace(raceConfigFile);
} } catch (Exception e) {
catch (Exception e){ System.out.println("There was an error creating the race.");
System.out.println(e);
} }
// If race was created // If race was created
@@ -71,17 +93,19 @@ public class App
System.out.println("######################"); System.out.println("######################");
System.out.println("# Live Race Updates "); System.out.println("# Live Race Updates ");
System.out.println("######################"); System.out.println("######################");
race.startRace(); race.startRace();
System.out.println("\n\n"); System.out.println("\n\n");
System.out.println("######################"); System.out.println("######################");
System.out.println("# Race Results "); System.out.println("# Race Results ");
System.out.println("######################"); System.out.println("######################");
race.showRaceMarkerResults(); race.showRaceMarkerResults();
race.displayFinishingOrder(); race.displayFinishingOrder();
}
else{ } else {
System.out.println("There was an error creating the race."); System.out.println("There was an error creating the race. Exiting.");
} }
} }
} }
+19 -13
View File
@@ -2,12 +2,8 @@ package seng302;
/** /**
* Represents a boat in the race. * Represents a boat in the race.
*
* @param teamName The name of the team sailing the boat
* @param boatVelocity The speed of the boat in meters/second
*/ */
public class Boat public class Boat {
{
private String teamName; // The name of the team, this is also the name of the boat private String teamName; // The name of the team, this is also the name of the boat
private double velocity; // In meters/second private double velocity; // In meters/second
@@ -17,6 +13,12 @@ public class Boat
this.velocity = 10; // Default velocity this.velocity = 10; // Default velocity
} }
/**
* Represents a boat in the race.
*
* @param teamName The name of the team sailing the boat
* @param boatVelocity The speed of the boat in meters/second
*/
public Boat(String teamName, double boatVelocity) { public Boat(String teamName, double boatVelocity) {
this.teamName = teamName; this.teamName = teamName;
this.velocity = boatVelocity; this.velocity = boatVelocity;
@@ -24,6 +26,7 @@ public class Boat
/** /**
* Returns the name of the team sailing the boat * Returns the name of the team sailing the boat
*
* @return The name of the team * @return The name of the team
*/ */
public String getTeamName() { public String getTeamName() {
@@ -32,25 +35,28 @@ public class Boat
/** /**
* Sets the name of the team sailing the boat * Sets the name of the team sailing the boat
*
* @param teamName The name of the team * @param teamName The name of the team
*/ */
public void setTeamName(String teamName) { public void setTeamName(String teamName) {
this.teamName = teamName; this.teamName = teamName;
} }
/**
* Sets velocity of the boat
* @param velocity The velocity of boat
*/
public void setVelocity(float velocity) {
this.velocity = velocity;
}
/** /**
* Gets velocity of the boat * Gets velocity of the boat
*
* @return a float number of the boat velocity * @return a float number of the boat velocity
*/ */
public double getVelocity() { public double getVelocity() {
return this.velocity; return this.velocity;
} }
/**
* Sets velocity of the boat
*
* @param velocity The velocity of boat
*/
public void setVelocity(double velocity) {
this.velocity = velocity;
}
} }
+53 -32
View File
@@ -3,6 +3,17 @@ package seng302;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
/**
* Event class containing the time of specific event, related team/boat, and
* event location such as leg.
*/
public class Event {
private long time; // Time the event occurs
private Boat boat;
private Leg leg; // Leg of the race the event occurs on
private boolean isFinishingEvent = false; // This event occurs when a boat finishes the race
/** /**
* Event class containing the time of specific event, related team/boat, and * Event class containing the time of specific event, related team/boat, and
* event location such as leg. * event location such as leg.
@@ -11,19 +22,21 @@ import java.util.Date;
* @param eventBoat, the boat that the event belongs to * @param eventBoat, the boat that the event belongs to
* @param eventLeg, the leg the event happens on * @param eventLeg, the leg the event happens on
*/ */
public class Event {
private long time;
private Boat boat;
private Leg leg;
private boolean isFinishingEvent = false;
public Event(long eventTime, Boat eventBoat, Leg eventLeg) { public Event(long eventTime, Boat eventBoat, Leg eventLeg) {
this.time = eventTime; this.time = eventTime;
this.boat = eventBoat; this.boat = eventBoat;
this.leg = eventLeg; this.leg = eventLeg;
} }
/**
* Event class containing the time of specific event, related team/boat, and
* event location such as leg.
*
* @param eventTime, what time the event happens
* @param eventBoat, the boat that the event belongs to
* @param eventLeg, the leg the event happens on
* @param isFinishingEvent, true if this event is the boat crossing the finishing line
*/
public Event(long eventTime, Boat eventBoat, Leg eventLeg, boolean isFinishingEvent) { public Event(long eventTime, Boat eventBoat, Leg eventLeg, boolean isFinishingEvent) {
this.time = eventTime; this.time = eventTime;
this.boat = eventBoat; this.boat = eventBoat;
@@ -31,40 +44,36 @@ public class Event {
this.isFinishingEvent = isFinishingEvent; this.isFinishingEvent = isFinishingEvent;
} }
/**
* Sets the time for the event
* @param eventTime the time for event in millisecond
*/
public void setTime(long eventTime) {
this.time = eventTime;
}
/** /**
* Gets the time for the event * Gets the time for the event
*
* @return the time for event in millisecond * @return the time for event in millisecond
*/ */
public long getTime() { public long getTime() {
return this.time; return this.time;
} }
/**
* Sets the time for the event
*
* @param eventTime the time for event in millisecond
*/
public void setTime(long eventTime) {
this.time = eventTime;
}
/** /**
* Gets the time in a formatted string * Gets the time in a formatted string
*
* @return the string of time * @return the string of time
*/ */
public String getTimeString() { public String getTimeString() {
return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time)); return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));
} }
/**
* Sets the involved boat
* @param eventBoat the involved boat
*/
public void setBoat(Boat eventBoat) {
this.boat = eventBoat;
}
/** /**
* Gets the involved boat * Gets the involved boat
*
* @return the boat involved in the event * @return the boat involved in the event
*/ */
public Boat getBoat() { public Boat getBoat() {
@@ -72,15 +81,17 @@ public class Event {
} }
/** /**
* Sets the involved location/leg * Sets the involved boat
* @param eventLeg the involved leg *
* @param eventBoat the involved boat
*/ */
public void setLeg(Leg eventLeg) { public void setBoat(Boat eventBoat) {
this.leg = eventLeg; this.boat = eventBoat;
} }
/** /**
* Gets the involved location/leg * Gets the involved location/leg
*
* @return the leg involved in the event * @return the leg involved in the event
*/ */
public Leg getLeg() { public Leg getLeg() {
@@ -88,16 +99,24 @@ public class Event {
} }
/** /**
* Call when the boat reaches the marker, this will tell the marker the order * Sets the involved location/leg
* in which boats pass it *
* @param eventLeg the involved leg
*/ */
public void addBoatToMarker(){ public void setLeg(Leg eventLeg) {
this.leg = eventLeg;
}
/**
* Called when the boat in this event passes
* the marker.
*/
public void boatPassedMarker() {
this.leg.addBoatToMarker(boat); this.leg.addBoatToMarker(boat);
} }
/** /**
* Returns true if this event is the boat finishing the race * Returns true if this event is the boat finishing the race
*
*/ */
public boolean getIsFinishingEvent() { public boolean getIsFinishingEvent() {
return this.isFinishingEvent; return this.isFinishingEvent;
@@ -105,11 +124,13 @@ public class Event {
/** /**
* Get a string that contains the timestamp and course information for this event * Get a string that contains the timestamp and course information for this event
* @return A string that contains the timestamp and course information for this event *
* @return A string that details what happened in this event
*/ */
public String getEventString() { public String getEventString() {
String currentHeading = Integer.toString(this.getLeg().getHeading()); String currentHeading = Integer.toString(this.getLeg().getHeading());
// This event is a boat finishing the race
if (this.isFinishingEvent) { if (this.isFinishingEvent) {
return (this.getTimeString() + ", " + this.getBoat().getTeamName() + " finished the race"); return (this.getTimeString() + ", " + this.getBoat().getTeamName() + " finished the race");
} }
+9 -2
View File
@@ -4,9 +4,9 @@ import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import java.io.FileNotFoundException;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map; import java.util.Map;
@@ -20,7 +20,9 @@ public class FileParser {
private String filePath; private String filePath;
private JSONObject content; private JSONObject content;
/** used to construct an instance of file parser
/**
* used to construct an instance of file parser
* *
* @param filePath a string like path to show location of desired file to * @param filePath a string like path to show location of desired file to
* be parsed * be parsed
@@ -50,6 +52,7 @@ public class FileParser {
/** /**
* Gets time scale setting parameter. * Gets time scale setting parameter.
*
* @return long time scale. -1 if parameter is invalid (eg. scale is * @return long time scale. -1 if parameter is invalid (eg. scale is
* negative number, or containing non numeric character) or cannot be found. * negative number, or containing non numeric character) or cannot be found.
*/ */
@@ -66,6 +69,7 @@ public class FileParser {
/** /**
* Gets race name in the setting file. * Gets race name in the setting file.
*
* @return a string of race name. null if race name is invalid or cannot * @return a string of race name. null if race name is invalid or cannot
* be found. * be found.
*/ */
@@ -80,6 +84,7 @@ public class FileParser {
/** /**
* Gets an array of teams who participate the race. * Gets an array of teams who participate the race.
*
* @return an ArrayList containing strings of team names. null if teams * @return an ArrayList containing strings of team names. null if teams
* setting is invalid or there is no team. * setting is invalid or there is no team.
*/ */
@@ -94,6 +99,7 @@ public class FileParser {
/** /**
* Gets the total number of teams. * Gets the total number of teams.
*
* @return the number of teams. 0 if no teams or anything goes wrong. * @return the number of teams. 0 if no teams or anything goes wrong.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -109,6 +115,7 @@ public class FileParser {
/** /**
* Gets the number of boats that would compete during a race. Returns the * 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. * total number of race size if parameter is invalid or cannot be found.
*
* @return an int of the race size. * @return an int of the race size.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
+47 -43
View File
@@ -1,17 +1,20 @@
package seng302; package seng302;
/**
* Represents the leg of a race.
*/
public class Leg { public class Leg {
private int heading; private int heading;
private int distance; private int distance;
private boolean isFinishingLeg; private boolean isFinishingLeg;
private Marker startingMarker; private Marker startingMarker;
/* /**
Create a new leg * Create a new leg
*
@param heading, the magnetic heading of this leg * @param heading, the magnetic heading of this leg
@param distance, the total distance of this leg in meters * @param distance, the total distance of this leg in meters
@param marker, the marker this leg starts on * @param marker, the marker this leg starts on
*/ */
public Leg(int heading, int distance, Marker marker) { public Leg(int heading, int distance, Marker marker) {
this.heading = heading; this.heading = heading;
@@ -20,12 +23,12 @@ public class Leg {
this.isFinishingLeg = false; this.isFinishingLeg = false;
} }
/* /**
Create a new leg * Create a new leg
*
@param heading, the magnetic heading of this leg * @param heading, the magnetic heading of this leg
@param distance, the total distance of this leg in meters * @param distance, the total distance of this leg in meters
@param markerName, the name of the marker this leg starts on * @param markerName, the name of the marker this leg starts on
*/ */
public Leg(int heading, int distance, String markerName) { public Leg(int heading, int distance, String markerName) {
this.heading = heading; this.heading = heading;
@@ -34,73 +37,74 @@ public class Leg {
this.isFinishingLeg = false; this.isFinishingLeg = false;
} }
/* /**
Set the heading for this leg * Get the heading of this leg
*/
public void setHeading(int heading){
this.heading = heading;
}
/*
Get the heading of this leg
*/ */
public int getHeading() { public int getHeading() {
return this.heading; return this.heading;
} }
/* /**
Set the distance of this leg in meters * Set the heading for this leg
*/ */
public void setDistance(int distance){ public void setHeading(int heading) {
this.distance = distance; this.heading = heading;
} }
/* /**
Get the total distance of this leg in meters * Get the total distance of this leg in meters
*/ */
public int getDistance() { public int getDistance() {
return this.distance; return this.distance;
} }
/* /**
Set the marker this leg starts on * Set the distance of this leg in meters
*/ */
public void setMarker(Marker marker){ public void setDistance(int distance) {
this.startingMarker = marker; this.distance = distance;
} }
/* /**
Returns the marker this leg started on * Returns the marker this leg started on
*/ */
public Marker getMarker() { public Marker getMarker() {
return this.startingMarker; return this.startingMarker;
} }
/* /**
Returns the name of the marker this leg started on * Set the marker this leg starts on
*/
public void setMarker(Marker marker) {
this.startingMarker = marker;
}
/**
* Returns the name of the marker this leg started on
*/ */
public String getMarkerLabel() { public String getMarkerLabel() {
return this.startingMarker.getName(); return this.startingMarker.getName();
} }
/* /**
Tell the marker that the boat has passed it * Tell the marker that the boat has passed it
*/ */
public void addBoatToMarker(Boat boat) { public void addBoatToMarker(Boat boat) {
this.startingMarker.addBoat(boat); this.startingMarker.addBoat(boat);
} }
/* /**
Specify whether or not the race finishes on this leg * Specify whether or not the race finishes on this leg
*
@param isFinishingLeg whether or not the race finishes on this leg * @param isFinishingLeg whether or not the race finishes on this leg
*/ */
public void setFinishingLeg(boolean isFinishingLeg) { public void setFinishingLeg(boolean isFinishingLeg) {
this.isFinishingLeg = isFinishingLeg; this.isFinishingLeg = isFinishingLeg;
} }
/* /**
@returns true if this the race finishes after this leg * Returns whether or not the race finishes after this leg
* @return true if this the race finishes after this leg
*/ */
public boolean getIsFinishingLeg() { public boolean getIsFinishingLeg() {
return this.isFinishingLeg; return this.isFinishingLeg;
+3
View File
@@ -2,6 +2,9 @@ package seng302;
import java.util.ArrayList; import java.util.ArrayList;
/**
* Represents the marker at the beginning of a leg
*/
class Marker{ class Marker{
private String name; private String name;
private ArrayList<Boat> boatOrder; private ArrayList<Boat> boatOrder;
+51 -48
View File
@@ -1,9 +1,11 @@
package seng302; package seng302;
import java.util.*;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.concurrent.TimeUnit; import java.util.*;
/**
* Race class containing the boats and legs in the race
*/
public class Race { public class Race {
private ArrayList<Boat> boats; // The boats in the race private ArrayList<Boat> boats; // The boats in the race
private ArrayList<Leg> legs; // The legs in the race private ArrayList<Leg> legs; // The legs in the race
@@ -13,6 +15,9 @@ public class Race {
private long startTime = 0; private long startTime = 0;
private double timeScale = 1; private double timeScale = 1;
/**
* Race class containing the boats and legs in the race
*/
public Race() { public Race() {
this.boats = new ArrayList<Boat>(); this.boats = new ArrayList<Boat>();
this.legs = new ArrayList<Leg>(); this.legs = new ArrayList<Leg>();
@@ -36,19 +41,20 @@ public class Race {
}); });
} }
/* /**
Add a boat to the race * Add a boat to the race
@param boat, the boat to add *
* @param boat, the boat to add
*/ */
public void addBoat(Boat boat) { public void addBoat(Boat boat) {
boats.add(boat); boats.add(boat);
numberOfBoats += 1; numberOfBoats += 1;
} }
/* /**
Returns a list of boats in a random order * Returns a list of boats in a random order
*
@returns a list of boats * @returns a list of boats
*/ */
public Boat[] getShuffledBoats() { public Boat[] getShuffledBoats() {
// Shuffle the list of boats // Shuffle the list of boats
@@ -58,42 +64,41 @@ public class Race {
return boats.toArray(new Boat[boats.size()]); return boats.toArray(new Boat[boats.size()]);
} }
/* /**
Returns a list of boats in the order that they * Returns a list of boats in the order that they
finished the race (position 0 is first place) * finished the race (position 0 is first place)
*
@returns a list of boats * @returns a list of boats
*/ */
public Boat[] getFinishedBoats() { public Boat[] getFinishedBoats() {
return this.finishingOrder.toArray(new Boat[this.finishingOrder.size()]); return this.finishingOrder.toArray(new Boat[this.finishingOrder.size()]);
} }
/* /**
Returns the number of boats in the race * Returns the number of boats in the race
*
@returns the number of boats in the race * @returns the number of boats in the race
*/ */
public int getNumberOfBoats() { public int getNumberOfBoats() {
return numberOfBoats; return numberOfBoats;
} }
/* /**
Returns a list of boats in the race * Returns a list of boats in the race
*
@returns a list of the boats competing in the race * @return a list of the boats competing in the race
*/ */
public Boat[] getBoats() { public Boat[] getBoats() {
return boats.toArray(new Boat[boats.size()]); return boats.toArray(new Boat[boats.size()]);
} }
/* /**
Prints the order in which the boats finished * Prints the order in which the boats finished the race
*/ */
public void displayFinishingOrder() { public void displayFinishingOrder() {
int numberOfBoats = this.getNumberOfBoats(); int numberOfBoats = this.getNumberOfBoats();
Boat[] boats = this.getFinishedBoats(); Boat[] boats = this.getFinishedBoats();
System.out.println("\n\n");
System.out.println("--- Finishing Order ---"); System.out.println("--- Finishing Order ---");
for (int i = 0; i < Array.getLength(boats); i++) { for (int i = 0; i < Array.getLength(boats); i++) {
@@ -101,8 +106,8 @@ public class Race {
} }
} }
/* /**
Prints the list of boats competing in the race * Prints the list of boats competing in the race
*/ */
public void displayStartingBoats() { public void displayStartingBoats() {
int numberOfBoats = this.getNumberOfBoats(); int numberOfBoats = this.getNumberOfBoats();
@@ -115,14 +120,14 @@ public class Race {
for (int i = 0; i < numberOfBoats; i++) { for (int i = 0; i < numberOfBoats; i++) {
String velocityKnots = String.format("%1.2f", boats[i].getVelocity() * 1.943844492); String velocityKnots = String.format("%1.2f", boats[i].getVelocity() * 1.943844492);
System.out.println(boats[i].getTeamName() + " Velocity: " + velocityKnots + " knots."); System.out.println(boats[i].getTeamName() + " Velocity: " + velocityKnots + " Knots/s");
} }
} }
/* /**
Adds a leg to the race * Adds a leg to the race
*
@param leg, the leg to add to the race * @param leg, the leg to add to the race
*/ */
public void addLeg(Leg leg) { public void addLeg(Leg leg) {
this.legs.add(leg); this.legs.add(leg);
@@ -139,6 +144,7 @@ public class Race {
/** /**
* Sets time scale * Sets time scale
*
* @param timeScale * @param timeScale
*/ */
public void setTimeScale(double timeScale) { public void setTimeScale(double timeScale) {
@@ -146,11 +152,10 @@ public class Race {
} }
/** /**
* Temporary method used to generated all the events. * Generate all events that will happen during the race.
*/ */
private void generateEvents() { private void generateEvents() {
//calculate the time every boat passes each leg, and create an event
//calculate the time for every boat passes each leg, and create an event
for (Boat boat : this.boats) { for (Boat boat : this.boats) {
long totalDistance = 0; long totalDistance = 0;
for (Leg leg : this.legs) { for (Leg leg : this.legs) {
@@ -170,8 +175,7 @@ public class Race {
} }
/** /**
* Note: this function is useless so far * Calculates how far a boat has travelled in meters
* Calculates how far a boat has travelled in meter
* *
* @param velocity the velocity of boat * @param velocity the velocity of boat
* @return a float number of distance the boat has been travelled * @return a float number of distance the boat has been travelled
@@ -193,31 +197,30 @@ public class Race {
long currentTime = (long) ((System.currentTimeMillis() - this.startTime) * this.timeScale); long currentTime = (long) ((System.currentTimeMillis() - this.startTime) * this.timeScale);
if (currentTime > peekEvent.getTime()) { if (currentTime > peekEvent.getTime()) {
// pull out the event
Event nextEvent = events.poll(); Event nextEvent = events.poll();
// I just simply print it out for testing // Display a summary of the event
System.out.println(nextEvent.getEventString()); System.out.println(nextEvent.getEventString());
nextEvent.addBoatToMarker(); nextEvent.boatPassedMarker();
// If event is a boat finishing the race
if (nextEvent.getIsFinishingEvent()) { if (nextEvent.getIsFinishingEvent()) {
this.finishingOrder.add(nextEvent.getBoat()); this.finishingOrder.add(nextEvent.getBoat());
} }
} }
// Wait for 100ms to slow down the while loop // Wait for 100ms to throttle the while loop
try { try {
Thread.sleep(100); Thread.sleep(100);
} } catch (java.lang.InterruptedException e) {
catch(java.lang.InterruptedException e){
continue; continue;
} }
} }
} }
/* /**
Start the race and print each marker with the order * Start the race and print each marker with the order
in which the boats passed that marker * in which the boats passed that marker
*/ */
public void startRace() { public void startRace() {
// record start time. // record start time.
@@ -226,8 +229,8 @@ public class Race {
iterateEvents(); iterateEvents();
} }
/* /**
Print the order in which the boats passed each marker * Print the order in which the boats passed each marker
*/ */
public void showRaceMarkerResults() { public void showRaceMarkerResults() {
for (Leg leg : this.legs) { for (Leg leg : this.legs) {
+3 -4
View File
@@ -1,16 +1,15 @@
package seng302; package seng302;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
/** /**
* Unit test for simple App. * Unit test for simple App.
*/ */
public class AppTest public class AppTest {
{
@Test @Test
public void testApp() public void testApp() {
{
assertTrue(true); assertTrue(true);
} }
} }
+14 -7
View File
@@ -1,27 +1,34 @@
package seng302; package seng302;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
/** /**
* Unit test for the Team class. * Unit test for the Team class.
*/ */
public class BoatTest public class BoatTest {
{
@Test @Test
public void testBoatCreation() public void testBoatCreation() {
{
Boat boat1 = new Boat("Team 1"); Boat boat1 = new Boat("Team 1");
assertEquals(boat1.getTeamName(), "Team 1"); assertEquals(boat1.getTeamName(), "Team 1");
assertEquals(boat1.getVelocity(), (double) 10.0, 1e-15);
} }
@Test @Test
public void testChangeTeamName() public void testChangeTeamName() {
{
Boat boat1 = new Boat("Team 1"); Boat boat1 = new Boat("Team 1");
boat1.setTeamName("Team 2"); boat1.setTeamName("Team 2");
assertEquals(boat1.getTeamName(), "Team 2"); assertEquals(boat1.getTeamName(), "Team 2");
} }
@Test
public void testSetVelocity() {
Boat boat1 = new Boat("Team 1", 29.0);
assertEquals(boat1.getVelocity(), (double) 29.0, 1e-15);
boat1.setVelocity(12.0);
assertEquals(boat1.getVelocity(), (double)12.0, 1e-15);
}
} }
+22 -3
View File
@@ -1,9 +1,8 @@
package seng302; package seng302;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
/** /**
* Test for Event class * Test for Event class
@@ -13,9 +12,29 @@ public class EventTest {
@Test @Test
public void getTimeString() throws Exception { public void getTimeString() throws Exception {
Leg leg = new Leg(035, 100, "Start"); Leg leg = new Leg(35, 100, "Start");
Boat boat = new Boat("testBoat"); Boat boat = new Boat("testBoat");
Event event = new Event(1231242, boat, leg); Event event = new Event(1231242, boat, leg);
assertEquals("20:31:242", event.getTimeString()); assertEquals("20:31:242", event.getTimeString());
} }
/**
* ensure all boats are added as they pass the marker
*/
@Test
public void boatOrderTest() throws Exception {
Leg leg = new Leg(35, 100, "1");
Boat boat1 = new Boat("testBoat");
Boat boat2 = new Boat("testBoat2");
Event event1 = new Event(1231242, boat1, leg);
Event event2 = new Event(1231242, boat2, leg);
event1.boatPassedMarker();
event2.boatPassedMarker();
assertEquals(event1.getLeg().getMarker().getBoats()[0].getTeamName(), "testBoat");
assertEquals(event2.getLeg().getMarker().getBoats()[1].getTeamName(), "testBoat2");
}
} }
+10 -10
View File
@@ -3,25 +3,25 @@ package seng302;
import org.junit.Test; import org.junit.Test;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.ArrayList;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
/** Unit test for FileParser class /**
* Unit test for FileParser class
* Created by Haoming on 5/03/17. * Created by Haoming on 5/03/17.
*/ */
public class FileParserTest { public class FileParserTest {
/* /**
test if it fails from reading non existed file * test if it fails from reading non existed file
*/ */
@Test(expected = FileNotFoundException.class) @Test(expected = FileNotFoundException.class)
public void readNonExistedFile() throws Exception { public void readNonExistedFile() throws Exception {
FileParser fileParser = new FileParser("test/java/seng302/non-existed.json"); FileParser fileParser = new FileParser("test/java/seng302/non-existed.json");
} }
/* /**
test a valid json file with valid content. * test a valid json file with valid content.
*/ */
@Test @Test
public void readValidFile() throws Exception { public void readValidFile() throws Exception {
@@ -35,9 +35,9 @@ public class FileParserTest {
assertEquals(6, fileParser.getTotalNumberOfTeams()); assertEquals(6, fileParser.getTotalNumberOfTeams());
} }
/* /**
test an invalid json file within wrong type value and misnamed * test an invalid json file within wrong type value and misnamed
variable name. * variable name.
*/ */
@Test @Test
public void readInvalidFile() throws Exception { public void readInvalidFile() throws Exception {
+13 -16
View File
@@ -1,7 +1,7 @@
package seng302; package seng302;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
/** /**
@@ -9,13 +9,12 @@ import static org.junit.Assert.assertEquals;
*/ */
public class LegTest { public class LegTest {
/* /**
Test creation of the leg by specifying a string * Test creation of the leg by specifying a string
for the marker label * for the marker label
*/ */
@Test @Test
public void testLegCreationUsingMarkerLabel() public void testLegCreationUsingMarkerLabel() {
{
Leg leg = new Leg(010, 100, "Marker"); Leg leg = new Leg(010, 100, "Marker");
assertEquals(leg.getHeading(), 010); assertEquals(leg.getHeading(), 010);
@@ -24,13 +23,12 @@ public class LegTest{
assertEquals(leg.getIsFinishingLeg(), false); assertEquals(leg.getIsFinishingLeg(), false);
} }
/* /**
Test creation of the leg by providing a * Test creation of the leg by providing a
Marker object * Marker object
*/ */
@Test @Test
public void testLegCreation() public void testLegCreation() {
{
Leg leg = new Leg(010, 100, new Marker("Marker")); Leg leg = new Leg(010, 100, new Marker("Marker"));
assertEquals(leg.getHeading(), 010); assertEquals(leg.getHeading(), 010);
@@ -39,13 +37,12 @@ public class LegTest{
assertEquals(leg.getIsFinishingLeg(), false); assertEquals(leg.getIsFinishingLeg(), false);
} }
/* /**
Test changing whether or not a * Test changing whether or not a
leg is the finishing leg * leg is the finishing leg
*/ */
@Test @Test
public void testSetFinishLeg() public void testSetFinishLeg() {
{
Leg leg = new Leg(010, 100, "Marker"); Leg leg = new Leg(010, 100, "Marker");
leg.setFinishingLeg(true); leg.setFinishingLeg(true);
+18 -6
View File
@@ -1,17 +1,17 @@
package seng302; package seng302;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import static org.junit.Assert.assertEquals;
/** /**
* Unit test for the Race class. * Unit test for the Race class.
*/ */
public class RaceTest public class RaceTest {
{ /**
/* * Test that all boats were added to the race
Test that all boats were added to the race
*/ */
@Test @Test
public void testAddingBoatsToRace() { public void testAddingBoatsToRace() {
@@ -24,4 +24,16 @@ public class RaceTest
assertEquals(Array.getLength(race.getBoats()), 2); assertEquals(Array.getLength(race.getBoats()), 2);
} }
@Test
public void testGetShuffledBoats(){
Boat boat1 = new Boat("Team 1");
Boat boat2 = new Boat("Team 2");
Race race = new Race();
race.addBoat(boat1);
race.addBoat(boat2);
assertEquals(Array.getLength(race.getShuffledBoats()), 2);
}
} }
+5 -1
View File
@@ -1,5 +1,9 @@
{ {
"time-scale": "abc", "time-scale": "abc",
"race-name": 123, "race-name": 123,
"teams-with-wrong-name":["team1","team2","team3"] "teams-with-wrong-name": [
"team1",
"team2",
"team3"
]
} }
+24 -6
View File
@@ -3,11 +3,29 @@
"time-scale": 1, "time-scale": 1,
"race-size": 2, "race-size": 2,
"teams": [ "teams": [
{"team-name": "Oracle Team USA", "velocity": 20.9}, {
{"team-name": "Artemis Racing", "velocity": 18.3}, "team-name": "Oracle Team USA",
{"team-name": "Emirates Team New Zealand", "velocity": 21.5}, "velocity": 20.9
{"team-name": "Groupama Team France","velocity": 19.9}, },
{"team-name": "Land Rover BAR", "velocity": 17.6}, {
{"team-name": "SoftBank Team Japan", "velocity": 16.6} "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
}
] ]
} }