package com.openxc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import com.openxc.measurements.BaseMeasurement;
import com.openxc.measurements.Measurement;
import com.openxc.measurements.UnrecognizedMeasurementTypeException;
import com.openxc.measurements.VehicleSpeed;
import com.openxc.measurements.EngineSpeed;
import com.openxc.measurements.VehicleDoorStatus;
import com.openxc.messages.VehicleMessage;
import com.openxc.messages.NamedVehicleMessage;
import com.openxc.messages.SimpleVehicleMessage;
import com.openxc.units.Meter;
import com.openxc.util.Range;
@RunWith(RobolectricTestRunner.class)
public class BaseMeasurementTest {
Range<Meter> range;
Double value = Double.valueOf(42);
SimpleVehicleMessage message;
@Before
public void setUp() throws UnrecognizedMeasurementTypeException {
message = new SimpleVehicleMessage(VehicleSpeed.ID, value);
}
@Test
public void buildFromMessage()
throws UnrecognizedMeasurementTypeException, NoValueException {
VehicleSpeed measurement = new VehicleSpeed(value);
Measurement deserializedMeasurement =
BaseMeasurement.getMeasurementFromMessage(message);
assertThat(deserializedMeasurement, instanceOf(VehicleSpeed.class));
VehicleSpeed vehicleSpeed = (VehicleSpeed) deserializedMeasurement;
assertThat(vehicleSpeed, equalTo(measurement));
}
public class NewMeasurement extends BaseMeasurement<Meter> {
public final static String ID = "new_measurement";
public NewMeasurement() {
super(new Meter(42.0));
}
public String getGenericName() {
return ID;
}
}
public class PrivateIdFieldMeasurement extends BaseMeasurement<Meter> {
@SuppressWarnings("unused")
private final static String ID = "new_measurement";
public PrivateIdFieldMeasurement() {
super(new Meter(42.0));
}
public String getGenericName() {
return "foo";
}
}
public class InvalidMeasurementType extends BaseMeasurement<Meter> {
public InvalidMeasurementType() {
super(new Meter(42.0));
}
public String getGenericName() {
return "foo";
}
}
@Test
public void getKeyForUnrecognizedMeasurementWithProperId()
throws UnrecognizedMeasurementTypeException {
assertThat(BaseMeasurement.getKeyForMeasurement(NewMeasurement.class),
equalTo(new NamedVehicleMessage(NewMeasurement.ID).getKey()));
}
@Test(expected=UnrecognizedMeasurementTypeException.class)
public void getKeyForMeasurementMissingIdField()
throws UnrecognizedMeasurementTypeException {
BaseMeasurement.getKeyForMeasurement(InvalidMeasurementType.class);
}
@Test(expected=UnrecognizedMeasurementTypeException.class)
public void getKeyForMeasurementPrivateID()
throws UnrecognizedMeasurementTypeException {
BaseMeasurement.getKeyForMeasurement(PrivateIdFieldMeasurement.class);
}
@Test
public void buildFromMessageWithInteger()
throws UnrecognizedMeasurementTypeException, NoValueException {
message = new SimpleVehicleMessage(VehicleSpeed.ID, Integer.valueOf(42));
VehicleSpeed measurement = new VehicleSpeed(value);
Measurement deserializedMeasurement =
BaseMeasurement.getMeasurementFromMessage(message);
assertThat(deserializedMeasurement, instanceOf(VehicleSpeed.class));
VehicleSpeed vehicleSpeed = (VehicleSpeed) deserializedMeasurement;
assertThat(vehicleSpeed, equalTo(measurement));
}
@Test(expected=NoValueException.class)
public void buildFromNull() throws NoValueException,
UnrecognizedMeasurementTypeException {
BaseMeasurement.getMeasurementFromMessage(VehicleSpeed.class, null);
}
@Test
public void buildEventedFromMessage()
throws UnrecognizedMeasurementTypeException, NoValueException {
VehicleDoorStatus measurement = new VehicleDoorStatus("driver", false);
VehicleMessage eventedMessage = measurement.toVehicleMessage();
Measurement deserializedMeasurement =
BaseMeasurement.getMeasurementFromMessage(
eventedMessage.asSimpleMessage());
assertThat(deserializedMeasurement, instanceOf(VehicleDoorStatus.class));
VehicleDoorStatus doorStatus = (VehicleDoorStatus) deserializedMeasurement;
assertThat(doorStatus, equalTo(measurement));
}
@Test(expected=UnrecognizedMeasurementTypeException.class)
public void buildFromUnrecognizedMessage()
throws NoValueException, UnrecognizedMeasurementTypeException {
message = new SimpleVehicleMessage("foo", value);
BaseMeasurement.getMeasurementFromMessage(message);
}
@Test
public void getBirthtime() {
VehicleSpeed measurement = new VehicleSpeed(value);
assertThat(measurement.getBirthtime(), notNullValue());
}
@Test
public void setAndGetBirthtime() {
VehicleSpeed measurement = new VehicleSpeed(value);
measurement.setTimestamp(1000);
assertEquals(measurement.getBirthtime(), 1000);
}
@Test
public void sameEquals() {
VehicleSpeed measurement = new VehicleSpeed(value);
assertEquals(measurement, measurement);
}
@Test
public void nullNotEqual() {
VehicleSpeed measurement = new VehicleSpeed(value);
assertThat(measurement, not(equalTo(null)));
}
@Test
public void differentClassSameValueNotEqual() {
VehicleSpeed measurement = new VehicleSpeed(value);
EngineSpeed otherMeasurement = new EngineSpeed(value);
assertFalse(measurement.equals(otherMeasurement));
}
@Test
public void toStringNotNull() {
VehicleSpeed measurement = new VehicleSpeed(value);
assertThat(measurement.toString(), notNullValue());
}
}