package com.openxc.messages;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.Set;
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.messages.DiagnosticRequest;
import com.openxc.messages.formatters.JsonFormatter;
import android.os.Parcel;
@RunWith(RobolectricTestRunner.class)
public class DiagnosticRequestTest {
DiagnosticRequest request;
int id = 42;
int bus = 1;
int mode = 2;
int pid = 4;
byte[] payload = new byte[]{1, 2, 3, 4, 5, 6, 7};
@Before
public void setup() {
request = new DiagnosticRequest(bus, id, mode, pid);
request.setPayload(payload);
}
@Test
public void checkRequiredFields() {
Set<String> fields = new HashSet<>();
fields.add(DiagnosticMessage.ID_KEY);
fields.add(DiagnosticMessage.BUS_KEY);
fields.add(DiagnosticMessage.MODE_KEY);
assertTrue(DiagnosticRequest.containsRequiredFields(fields));
}
@Test
public void getIdReturnsId() {
assertEquals(id, request.getId());
}
@Test
public void getBusReturnsBus() {
assertEquals(bus, request.getBusId());
}
@Test
public void getModeReturnsMode() {
assertEquals(mode, request.getMode());
}
@Test
public void getPidWithNoPidReturnsNull() {
DiagnosticRequest noPidRequest = new DiagnosticRequest(1, 2, 3);
assertFalse(noPidRequest.hasPid());
assertThat(noPidRequest.getPid(), nullValue());
}
@Test
public void setPid() {
request = new DiagnosticRequest(1, 2, 3);
request.setPid(42);
assertTrue(request.hasPid());
assertEquals(request.getPid(), Integer.valueOf(42));
}
@Test
public void getNoNameReturnsNull() {
assertThat(request.getName(), nullValue());
}
@Test
public void getPayloadReturnsPayload() {
assertArrayEquals(payload, request.getPayload());
}
@Test
public void getMultipleReturnsFalseIfNotSetOrFalse() {
assertFalse(request.getMultipleResponses());
request.setMultipleResponses(false);
assertFalse(request.getMultipleResponses());
}
@Test
public void getMultipleWhenTrue() {
request.setMultipleResponses(true);
assertTrue(request.getMultipleResponses());
}
@Test
public void sameEquals() {
assertEquals(request, request);
}
@Test
public void differentIdNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id + 1, mode);
anotherRequest.setPayload(payload);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentNameNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id, mode);
anotherRequest.setName("foo");
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentFrequencyNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id, mode);
anotherRequest.setFrequency(2.0);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentMultipleResponsesNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id, mode);
anotherRequest.setMultipleResponses(true);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentBusNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus + 1, id, mode);
anotherRequest.setPayload(payload);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentModeNotEqual() {
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id, mode + 1);
anotherRequest.setPayload(payload);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void differentPayloadNotEqual() {
payload[1] = (byte) (payload[1] + 1);
DiagnosticRequest anotherRequest = new DiagnosticRequest(
bus, id, mode);
anotherRequest.setPayload(payload);
assertThat(request, not(equalTo(anotherRequest)));
}
@Test
public void genericAsDiagnostic() {
VehicleMessage generic = request;
assertEquals(generic.asDiagnosticRequest(), request);
}
@Test
public void toStringNotNull() {
assertThat(request.toString(), notNullValue());
}
@Test
public void writeAndReadFromParcelRetainsNulls() {
Parcel parcel = Parcel.obtain();
request.writeToParcel(parcel, 0);
// Reset parcel for reading
parcel.setDataPosition(0);
VehicleMessage createdFromParcel =
VehicleMessage.CREATOR.createFromParcel(parcel);
assertThat(createdFromParcel, instanceOf(DiagnosticRequest.class));
assertEquals(request, createdFromParcel);
String serialized = JsonFormatter.serialize(createdFromParcel);
assertThat(serialized, not(containsString("multiple_responses")));
}
@Test
public void writeAndReadFromParcelWithPayloadAndPid() {
request.setMultipleResponses(true);
Parcel parcel = Parcel.obtain();
request.writeToParcel(parcel, 0);
// Reset parcel for reading
parcel.setDataPosition(0);
VehicleMessage createdFromParcel =
VehicleMessage.CREATOR.createFromParcel(parcel);
assertThat(createdFromParcel, instanceOf(DiagnosticRequest.class));
assertEquals(request, createdFromParcel);
}
@Test
public void writeAndReadFromParcelNoOptionalFields() {
request = new DiagnosticRequest(1, 2, 3);
Parcel parcel = Parcel.obtain();
request.writeToParcel(parcel, 0);
// Reset parcel for reading
parcel.setDataPosition(0);
VehicleMessage createdFromParcel =
VehicleMessage.CREATOR.createFromParcel(parcel);
assertThat(createdFromParcel, instanceOf(DiagnosticRequest.class));
assertEquals(request, createdFromParcel);
}
@Test
public void keyNotNull() {
assertThat(request.getKey(), notNullValue());
}
}