package com.openxc.messages;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.Calendar;
import java.util.HashMap;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import android.os.Parcel;
@RunWith(RobolectricTestRunner.class)
public class VehicleMessageTest {
VehicleMessage message;
HashMap<String, Object> extras;
String key = "foo";
@Before
public void setup() {
extras = new HashMap<String, Object>();
extras.put(key, Integer.valueOf(42));
message = new VehicleMessage(extras);
}
@Test
public void hasExtraValue() {
assertEquals(42, message.getExtras().get(key));
}
@Test
public void emptyMessageHasNoTimestamp() {
message = new VehicleMessage();
assertTrue(!message.isTimestamped());
}
@Test
public void emptyMessage() {
message = new VehicleMessage(new HashMap<String, Object>());
assertFalse(message.hasExtras());
assertThat(message.getExtras(), nullValue());
}
@Test
public void cantRetimestamp() {
message.timestamp();
Long timestamp = message.getTimestamp();
message.timestamp();
assertEquals(timestamp, message.getTimestamp());
}
@Test
public void invalidExtras() {
message = new VehicleMessage();
message.setExtras(null);
assertFalse(message.hasExtras());
assertThat(message.getExtras(), nullValue());
}
@Test
public void emptyExtras() {
message = new VehicleMessage();
message.setExtras(new HashMap<String, Object>());
assertFalse(message.hasExtras());
assertThat(message.getExtras(), nullValue());
}
@Test
public void setManualTimestamp() {
message = new VehicleMessage(Long.valueOf(10000), extras);
assertTrue(message.isTimestamped());
assertEquals(Long.valueOf(10000), message.getTimestamp());
}
@Test
public void setAutomaticTriggeredTimestamp() {
message = new VehicleMessage();
message.timestamp();
assertTrue(message.isTimestamped());
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(message.getTimestamp());
// Catch a regression where we didn't divide by 1000 before storing
// timestamp as a double.
assertThat(calendar.get(Calendar.YEAR),
equalTo(Calendar.getInstance().get(Calendar.YEAR)));
}
@Test
public void untimestamp() {
message = new VehicleMessage(Long.valueOf(10000), extras);
message.untimestamp();
assertFalse(message.isTimestamped());
}
@Test
public void doesntEqualNull() {
assertThat(message, not(equalTo(null)));
}
@Test
public void sameEquals() {
assertEquals(message, message);
}
@Test
public void sameValuesEquals() {
VehicleMessage anotherMessage = new VehicleMessage(
message.getTimestamp(), extras);
assertEquals(message, anotherMessage);
}
@Test
public void differentTimestampNotEqual() {
VehicleMessage anotherMessage = new VehicleMessage(
Long.valueOf(10000), extras);
assertFalse(message.equals(anotherMessage));
}
@Test
public void differentValuesNotEqual() {
extras.put("another", "foo");
// This also tests that the values map is copied and we don't have the
// same reference from outside the class
VehicleMessage anotherMessage = new VehicleMessage(
message.getTimestamp(), extras);
assertFalse(message.equals(anotherMessage));
}
@Test
public void toStringNotNull() {
assertThat(message.toString(), notNullValue());
}
@Test
public void writeAndReadFromParcel() {
Parcel parcel = Parcel.obtain();
message.writeToParcel(parcel, 0);
// Reset parcel for reading
parcel.setDataPosition(0);
VehicleMessage createdFromParcel =
VehicleMessage.CREATOR.createFromParcel(parcel);
assertEquals(message, createdFromParcel);
}
}