Added RaceStatusEncoder.

Refactored RaceStatusDecoder to be more consistent with other decoders - it now has a getMessage() function.
Added BoatStatus encoder and decoder - the RaceStatus encoder and decoder uses this for BoatStatuses. The BoatStatus encoder doesn't implement the MessageEncoder interface as BoatStatus is not a proper message type (doesn't inherit from AC35Data).
Added remaining cases to EncoderFactory, but commented them out.
BoatStatus now uses BoatStatusEnum instead of a byte.
Added some comments to RaceStatus, and it uses enums instead of bytes.
MockOutput logs a warning if a RaceStatus cannot be encoded.
Added a BoatStatusDecoderTest.
Updated RaceStatusDecoder to use new encoders/decoders.
issue #35 #36
#story[1095]
This commit is contained in:
fjc40
2017-08-06 13:38:27 +12:00
parent e464ee298e
commit b1922fc3fc
17 changed files with 660 additions and 215 deletions
@@ -0,0 +1,90 @@
package network.MessageDecoders;
import network.MessageEncoders.BoatStatusEncoder;
import network.MessageEncoders.RaceVisionByteEncoder;
import network.Messages.BoatStatus;
import network.Messages.Enums.BoatStatusEnum;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Test for the BoatStatus encoder and decoder
*/
public class BoatStatusDecoderTest {
/**
* Creates a BoatStatus message, encodes it, decodes it, and checks that the result matches the starting message.
* @throws Exception if test fails.
*/
@Test
public void boatStatusEncodeDecodeTest() throws Exception {
long time = System.currentTimeMillis();
//Create data to serialize.
int boatSourceID = 5;
BoatStatusEnum boatStatusEnum = BoatStatusEnum.RACING;
byte boatLegNumber = 5;
byte boatPenaltiesAwarded = 4;
byte boatPenaltiesServed = 2;
long boatTimeAtNextMark = time + (1000 * 3);
long boatTimeAtFinish = boatTimeAtNextMark + (1000 * 15);
BoatStatus boatStatus = new BoatStatus(
boatSourceID,
boatStatusEnum,
boatLegNumber,
boatPenaltiesAwarded,
boatPenaltiesServed,
boatTimeAtNextMark,
boatTimeAtFinish );
BoatStatus boatStatusDecoded = encodeDecodeBoatStatus(boatStatus);
compareBoatStatusMessages(boatStatus, boatStatusDecoded);
}
/**
* Encodes and decodes a BoatStatus, and returns it.
* @param boatStatus The BoatStatus to encode and decode.
* @return The decoded BoatStatus.
*/
private static BoatStatus encodeDecodeBoatStatus(BoatStatus boatStatus) {
BoatStatusEncoder boatStatusEncoder = new BoatStatusEncoder();
byte[] boatStatusEncoded = boatStatusEncoder.encode(boatStatus);
BoatStatusDecoder boatStatusDecoder = new BoatStatusDecoder(boatStatusEncoded);
BoatStatus boatStatusDecoded = boatStatusDecoder.getMessage();
return boatStatusDecoded;
}
/**
* Compares two BoatStatus messages to check that they are equal.
* @param original The original BoatStatus message.
* @param decoded The decoded BoatStatus message.
*/
public static void compareBoatStatusMessages(BoatStatus original, BoatStatus decoded) {
Assert.assertEquals(original.getSourceID(), decoded.getSourceID());
Assert.assertEquals(original.getBoatStatus(), decoded.getBoatStatus());
Assert.assertEquals(original.getLegNumber(), decoded.getLegNumber());
Assert.assertEquals(original.getNumPenaltiesAwarded(), decoded.getNumPenaltiesAwarded());
Assert.assertEquals(original.getNumPenaltiesServed(), decoded.getNumPenaltiesServed());
Assert.assertEquals(original.getEstTimeAtNextMark(), decoded.getEstTimeAtNextMark());
Assert.assertEquals(original.getEstTimeAtFinish(), decoded.getEstTimeAtFinish());
}
}
@@ -1,27 +1,39 @@
package network.MessageDecoders;
import network.Exceptions.InvalidMessageException;
import network.MessageEncoders.RaceVisionByteEncoder;
import network.Messages.BoatStatus;
import network.Messages.Enums.BoatStatusEnum;
import network.Messages.Enums.RaceStatusEnum;
import network.Messages.Enums.RaceTypeEnum;
import network.Messages.RaceStatus;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by hba56 on 23/04/17.
* Test for the RaceStatus encoder and decoder
*/
public class RaceStatusDecoderTest {
/**
* Creates a RaceStatus message, encodes it, decodes it, and checks that the result matches the starting message.
* @throws Exception if test fails.
*/
@Test
public void getByteArrayTest(){
public void raceStatusEncodeDecodeTest() throws Exception {
long time = System.currentTimeMillis();
//Create data to serialize.
int boat1SourceID = 5;
int boat2SourceID = 8;
byte boat1Status = 2;
byte boat2Status = 2;
BoatStatusEnum boat1Status = BoatStatusEnum.RACING;
BoatStatusEnum boat2Status = BoatStatusEnum.RACING;
byte boat1LegNumber = 5;
byte boat2LegNumber = 3;
byte boat1PenaltiesAwarded = 4;
@@ -33,44 +45,85 @@ public class RaceStatusDecoderTest {
long boat1TimeAtFinish = boat1TimeAtNextMark + (1000 * 15);
long boat2TimeAtFinish = boat2TimeAtNextMark + (1000 * 7);
BoatStatus boatStatus1 = new BoatStatus(boat1SourceID, boat1Status, boat1LegNumber, boat1PenaltiesAwarded, boat1PenaltiesServed, boat1TimeAtNextMark, boat1TimeAtFinish);
BoatStatus boatStatus2 = new BoatStatus(boat2SourceID, boat2Status, boat2LegNumber, boat2PenaltiesAwarded, boat2PenaltiesServed, boat2TimeAtNextMark, boat2TimeAtFinish);
BoatStatus boatStatus1 = new BoatStatus(
boat1SourceID,
boat1Status,
boat1LegNumber,
boat1PenaltiesAwarded,
boat1PenaltiesServed,
boat1TimeAtNextMark,
boat1TimeAtFinish );
BoatStatus boatStatus2 = new BoatStatus(
boat2SourceID,
boat2Status,
boat2LegNumber,
boat2PenaltiesAwarded,
boat2PenaltiesServed,
boat2TimeAtNextMark,
boat2TimeAtFinish );
int raceID = 585;
byte raceStatus = 3;
RaceStatusEnum raceStatus = RaceStatusEnum.STARTED;
long raceStartTime = time - (1000 * 31);
int windDirection = 2341;
int windSpeed = 10201;
int raceType = 1;
RaceTypeEnum raceType = RaceTypeEnum.MATCH_RACE;
List<BoatStatus> boatStatuses = new ArrayList<>(2);
boatStatuses.add(boatStatus1);
boatStatuses.add(boatStatus2);
RaceStatus raceStatusObject = new RaceStatus(time, raceID, raceStatus, raceStartTime, windDirection, windSpeed, raceType, boatStatuses);
RaceStatus raceStatusOriginal = new RaceStatus(
RaceStatus.currentMessageVersionNumber,
time,
raceID,
raceStatus,
raceStartTime,
windDirection,
windSpeed,
raceType,
boatStatuses );
byte[] encodedRaceStatus = RaceVisionByteEncoder.raceStatus(raceStatusObject);
byte[] encodedRaceStatus = RaceVisionByteEncoder.encode(raceStatusOriginal);
RaceStatusDecoder decoderTest = new RaceStatusDecoder(encodedRaceStatus);
Assert.assertEquals(0b10, decoderTest.getVersionNum());
Assert.assertEquals(time, decoderTest.getTime());
Assert.assertEquals(raceID, decoderTest.getRace());
Assert.assertEquals(raceStatus, decoderTest.getRaceState());
Assert.assertEquals(raceStartTime, decoderTest.getStartTime());
Assert.assertEquals(windDirection, decoderTest.getRaceWindDir());
Assert.assertEquals(windSpeed, decoderTest.getRaceWindSpeed());
RaceStatus decodedMessage = decoderTest.getMessage();
BoatStatus boat1 = decoderTest.getBoats().get(0);
Assert.assertEquals(boat1SourceID, boat1.getSourceID());
Assert.assertEquals(boat1Status, boat1.getBoatStatus());
Assert.assertEquals(boat1LegNumber, boat1.getLegNumber());
Assert.assertEquals(boat1PenaltiesAwarded, boat1.getNumPenaltiesAwarded());
Assert.assertEquals(boat1PenaltiesServed, boat1.getNumPenaltiesServed());
Assert.assertEquals(boat1TimeAtNextMark, boat1.getEstTimeAtNextMark());
Assert.assertEquals(boat1TimeAtFinish, boat1.getEstTimeAtFinish());
compareRaceStatusMessages(raceStatusOriginal, decodedMessage);
}
/**
* Compares two RaceStatus messages to check that they are equal.
* @param original The original RaceStatus message.
* @param decoded The decoded RaceStatus message.
*/
public static void compareRaceStatusMessages(RaceStatus original, RaceStatus decoded) {
//Compare RaceStatus body.
Assert.assertEquals(original.getMessageVersionNumber(), decoded.getMessageVersionNumber());
Assert.assertEquals(original.getCurrentTime(), decoded.getCurrentTime());
Assert.assertEquals(original.getRaceID(), decoded.getRaceID());
Assert.assertEquals(original.getRaceStatus(), decoded.getRaceStatus());
Assert.assertEquals(original.getExpectedStartTime(), decoded.getExpectedStartTime());
Assert.assertEquals(original.getWindDirection(), decoded.getWindDirection());
Assert.assertEquals(original.getWindSpeed(), decoded.getWindSpeed());
//Compare all BoatStatuses
Iterator<BoatStatus> originalIterator = original.getBoatStatuses().iterator();
Iterator<BoatStatus> decodedIterator = decoded.getBoatStatuses().iterator();
while (originalIterator.hasNext() && decodedIterator.hasNext()) {
BoatStatusDecoderTest.compareBoatStatusMessages(originalIterator.next(), decodedIterator.next());
}
}
}