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:
@@ -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());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user