package org.robolectric.shadows;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.TestRunners;
import android.accounts.Account;
import android.os.Bundle;
import android.os.Parcel;
@RunWith(TestRunners.MultiApiSelfTest.class)
public class ShadowParcelTest {
private Parcel parcel;
@Before
public void setup() {
parcel = Parcel.obtain();
}
@After
public void tearDown() {
parcel.recycle();
}
@Test
public void testObtain() {
assertThat(parcel).isNotNull();
}
@Test
public void testReadIntWhenEmpty() {
assertThat(parcel.readInt()).isEqualTo(0);
}
@Test
public void testReadLongWhenEmpty() {
assertThat(parcel.readLong()).isEqualTo(0l);
}
@Test
public void testReadStringWhenEmpty() {
assertThat(parcel.readString()).isNull();
}
@Test
public void testReadStrongBinderWhenEmpty() {
assertThat(parcel.readStrongBinder()).isNull();
}
@Test
public void testReadWriteSingleString() {
String val = "test";
parcel.writeString(val);
parcel.setDataPosition(0);
assertThat(parcel.readString()).isEqualTo(val);
}
@Test
public void testWriteNullString() {
parcel.writeString(null);
parcel.setDataPosition(0);
assertThat(parcel.readString()).isNull();
}
@Test
public void testWriteEmptyString() {
parcel.writeString("");
parcel.setDataPosition(0);
assertThat(parcel.readString()).isEmpty();
}
@Test
public void testReadWriteMultipleStrings() {
for (int i = 0; i < 10; ++i) {
parcel.writeString(Integer.toString(i));
}
parcel.setDataPosition(0);
for (int i = 0; i < 10; ++i) {
assertThat(parcel.readString()).isEqualTo(Integer.toString(i));
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readString()).isNull();
}
@Test
public void testReadWriteSingleInt() {
int val = 5;
parcel.writeInt(val);
parcel.setDataPosition(0);
assertThat(parcel.readInt()).isEqualTo(val);
}
@Test
public void testReadWriteIntArray() throws Exception {
final int[] ints = { 1, 2 };
parcel.writeIntArray(ints);
parcel.setDataPosition(0);
final int[] ints2 = new int[ints.length];
parcel.readIntArray(ints2);
assertTrue(Arrays.equals(ints, ints2));
}
@Test
public void testWriteAndCreateNullIntArray() throws Exception {
parcel.writeIntArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createIntArray()).isNull();
}
@Test
public void testReadWriteLongArray() throws Exception {
final long[] longs = { 1, 2 };
parcel.writeLongArray(longs);
parcel.setDataPosition(0);
final long[] longs2 = new long[longs.length];
parcel.readLongArray(longs2);
assertTrue(Arrays.equals(longs, longs2));
}
@Test
public void testWriteAndCreateNullLongArray() throws Exception {
parcel.writeLongArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createLongArray()).isNull();
}
@Test
public void testReadWriteSingleFloat() {
float val = 5.2f;
parcel.writeFloat(val);
parcel.setDataPosition(0);
assertThat(parcel.readFloat()).isEqualTo(val);
}
@Test
public void testReadWriteFloatArray() throws Exception {
final float[] floats = { 1.1f, 2.0f };
parcel.writeFloatArray(floats);
parcel.setDataPosition(0);
final float[] floats2 = new float[floats.length];
parcel.readFloatArray(floats2);
assertTrue(Arrays.equals(floats, floats2));
}
@Test
public void testWriteAndCreateNullFloatArray() throws Exception {
parcel.writeFloatArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createFloatArray()).isNull();
}
@Test
public void testReadWriteDoubleArray() throws Exception {
final double[] doubles = { 1.1f, 2.0f };
parcel.writeDoubleArray(doubles);
parcel.setDataPosition(0);
final double[] doubles2 = new double[doubles.length];
parcel.readDoubleArray(doubles2);
assertTrue(Arrays.equals(doubles, doubles2));
}
@Test
public void testWriteAndCreateNullDoubleArray() throws Exception {
parcel.writeDoubleArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createDoubleArray()).isNull();
}
@Test
public void testReadWriteStringArray() throws Exception {
final String[] strings = { "foo", "bar" };
parcel.writeStringArray(strings);
parcel.setDataPosition(0);
final String[] strings2 = new String[strings.length];
parcel.readStringArray(strings2);
assertTrue(Arrays.equals(strings, strings2));
}
@Test
public void testWriteAndCreateNullStringArray() throws Exception {
parcel.writeStringArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createStringArray()).isNull();
}
@Test
public void testWriteAndCreateByteArray() {
byte[] bytes = new byte[] { -1, 2, 3, 127 };
parcel.writeByteArray(bytes);
parcel.setDataPosition(0);
byte[] actualBytes = parcel.createByteArray();
assertTrue(Arrays.equals(bytes, actualBytes));
}
@Test
public void testWriteAndCreateNullByteArray() throws Exception {
parcel.writeByteArray(null);
parcel.setDataPosition(0);
assertThat(parcel.createByteArray()).isNull();
}
@Test
public void testWriteAndCreateByteArray_lengthZero() {
byte[] bytes = new byte[] {};
parcel.writeByteArray(bytes);
parcel.setDataPosition(0);
byte[] actualBytes = parcel.createByteArray();
assertTrue(Arrays.equals(bytes, actualBytes));
}
@Test
public void testReadWriteMultipleInts() {
for (int i = 0; i < 10; ++i) {
parcel.writeInt(i);
}
parcel.setDataPosition(0);
for (int i = 0; i < 10; ++i) {
assertThat(parcel.readInt()).isEqualTo(i);
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readInt()).isEqualTo(0);
}
@Test
public void testReadWriteSingleByte() {
byte val = 1;
parcel.writeByte(val);
parcel.setDataPosition(0);
assertThat(parcel.readByte()).isEqualTo(val);
}
@Test
public void testReadWriteMultipleBytes() {
for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
parcel.writeByte(i);
}
parcel.setDataPosition(0);
for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
assertThat(parcel.readByte()).isEqualTo(i);
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readByte()).isEqualTo((byte) 0);
}
@Test
public void testReadWriteStringInt() {
for (int i = 0; i < 10; ++i) {
parcel.writeString(Integer.toString(i));
parcel.writeInt(i);
}
parcel.setDataPosition(0);
for (int i = 0; i < 10; ++i) {
assertThat(parcel.readString()).isEqualTo(Integer.toString(i));
assertThat(parcel.readInt()).isEqualTo(i);
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readString()).isNull();
assertThat(parcel.readInt()).isEqualTo(0);
}
@Test(expected = ClassCastException.class)
public void testWriteStringReadInt() {
String val = "test";
parcel.writeString(val);
parcel.setDataPosition(0);
parcel.readInt();
}
@Test(expected = ClassCastException.class)
public void testWriteIntReadString() {
int val = 9;
parcel.writeInt(val);
parcel.setDataPosition(0);
parcel.readString();
}
@Test
public void testReadWriteSingleLong() {
long val = 5;
parcel.writeLong(val);
parcel.setDataPosition(0);
assertThat(parcel.readLong()).isEqualTo(val);
}
@Test
public void testReadWriteMultipleLongs() {
for (long i = 0; i < 10; ++i) {
parcel.writeLong(i);
}
parcel.setDataPosition(0);
for (long i = 0; i < 10; ++i) {
assertThat(parcel.readLong()).isEqualTo(i);
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readLong()).isEqualTo(0l);
}
@Test
public void testReadWriteStringLong() {
for (long i = 0; i < 10; ++i) {
parcel.writeString(Long.toString(i));
parcel.writeLong(i);
}
parcel.setDataPosition(0);
for (long i = 0; i < 10; ++i) {
assertThat(parcel.readString()).isEqualTo(Long.toString(i));
assertThat(parcel.readLong()).isEqualTo(i);
}
// now try to read past the number of items written and see what happens
assertThat(parcel.readString()).isNull();
assertThat(parcel.readLong()).isEqualTo(0l);
}
@Test(expected = ClassCastException.class)
public void testWriteStringReadLong() {
String val = "test";
parcel.writeString(val);
parcel.setDataPosition(0);
parcel.readLong();
}
@Test(expected = ClassCastException.class)
public void testWriteLongReadString() {
long val = 9;
parcel.writeLong(val);
parcel.setDataPosition(0);
parcel.readString();
}
@Test
public void testReadWriteParcelable() {
Account a1 = new Account("name", "type");
parcel.writeParcelable(a1, 0);
parcel.setDataPosition(0);
Account a2 = parcel.readParcelable(Account.class.getClassLoader());
assertEquals(a1, a2);
}
@Test
public void testReadWriteBundle() {
Bundle b1 = new Bundle();
b1.putString("hello", "world");
parcel.writeBundle(b1);
parcel.setDataPosition(0);
Bundle b2 = parcel.readBundle();
assertEquals("world", b2.getString("hello"));
parcel.setDataPosition(0);
parcel.writeBundle(b1);
parcel.setDataPosition(0);
b2 = parcel.readBundle(null /* ClassLoader */);
assertEquals("world", b2.getString("hello"));
}
@Test
public void testCreateStringArrayList() throws Exception {
parcel.writeStringList(Arrays.asList("str1", "str2"));
parcel.setDataPosition(0);
List<String> actual = parcel.createStringArrayList();
assertEquals(2, actual.size());
assertEquals("str1", actual.get(0));
assertEquals("str2", actual.get(1));
}
@Test
public void testWriteTypedListAndCreateTypedArrayList() throws Exception {
TestParcelable normal = new TestParcelable(23);
ArrayList<TestParcelable> normals = new ArrayList<>();
normals.add(normal);
parcel.writeTypedList(normals);
parcel.setDataPosition(0);
List<org.robolectric.shadows.TestParcelable> rehydrated = parcel
.createTypedArrayList(TestParcelable.CREATOR);
assertEquals(1, rehydrated.size());
assertEquals(23, rehydrated.get(0).contents);
}
@Test
public void testReadAndWriteStringList() throws Exception {
ArrayList<String> original = new ArrayList<>();
List<String> rehydrated = new ArrayList<>();
original.add("str1");
original.add("str2");
parcel.writeStringList(original);
parcel.setDataPosition(0);
parcel.readStringList(rehydrated);
assertEquals(2, rehydrated.size());
assertEquals("str1", rehydrated.get(0));
assertEquals("str2", rehydrated.get(1));
}
@Test
public void testReadWriteMap() throws Exception {
HashMap<String, String> original = new HashMap<>();
original.put("key", "value");
parcel.writeMap(original);
parcel.setDataPosition(0);
HashMap<String, String> rehydrated = parcel.readHashMap(null);
assertEquals("value", rehydrated.get("key"));
}
@Test
public void testCreateStringArray() {
String[] strs = { "a1", "b2" };
parcel.writeStringArray(strs);
parcel.setDataPosition(0);
String[] newStrs = parcel.createStringArray();
assertTrue(Arrays.equals(strs, newStrs));
}
@Test
public void testDataPositionAfterSomeWrites() {
parcel.writeInt(1);
assertThat(parcel.dataPosition()).isEqualTo(4);
parcel.writeFloat(5);
assertThat(parcel.dataPosition()).isEqualTo(8);
parcel.writeDouble(37);
assertThat(parcel.dataPosition()).isEqualTo(16);
}
@Test
public void testDataPositionAfterSomeReads() {
parcel.writeInt(1);
parcel.writeFloat(5);
parcel.writeDouble(37);
parcel.setDataPosition(0);
parcel.readInt();
assertThat(parcel.dataPosition()).isEqualTo(4);
parcel.readFloat();
assertThat(parcel.dataPosition()).isEqualTo(8);
parcel.readDouble();
assertThat(parcel.dataPosition()).isEqualTo(16);
}
@Test
public void testDataSizeAfterSomeWrites() {
parcel.writeInt(1);
assertThat(parcel.dataSize()).isEqualTo(4);
parcel.writeFloat(5);
assertThat(parcel.dataSize()).isEqualTo(8);
parcel.writeDouble(37);
assertThat(parcel.dataSize()).isEqualTo(16);
}
@Test
public void testDataAvail() {
parcel.writeInt(1);
parcel.writeFloat(5);
parcel.writeDouble(6);
parcel.setDataPosition(4);
assertThat(parcel.dataAvail()).isEqualTo(12);
}
@Test
public void testSetDataPositionIntoMiddleOfParcel() {
parcel.writeInt(1);
parcel.writeFloat(5);
parcel.writeDouble(6);
parcel.setDataPosition(4);
assertThat(parcel.readFloat()).isEqualTo(5);
}
@Test
public void testSetDataPositionToEmptyString() {
parcel.writeString("");
parcel.setDataPosition(parcel.dataPosition());
parcel.writeString("something else");
parcel.setDataPosition(0);
assertThat(parcel.readString()).isEmpty();
}
@Test
public void testAppendFrom() {
parcel.writeInt(1);
parcel.writeInt(2);
parcel.writeInt(3);
parcel.writeInt(4);
Parcel parcel2 = Parcel.obtain();
parcel2.appendFrom(parcel, 4, 8);
parcel2.setDataPosition(0);
assertThat(parcel2.readInt()).isEqualTo(2);
assertThat(parcel2.readInt()).isEqualTo(3);
assertThat(parcel2.dataSize()).isEqualTo(8);
}
@Test
public void testMarshallAndUnmarshall() {
parcel.writeInt(1);
parcel.writeString("hello");
parcel.writeDouble(25);
parcel.writeFloat(1.25f);
parcel.writeByte((byte) 0xAF);
byte[] rawBytes = parcel.marshall();
Parcel parcel2 = Parcel.obtain();
parcel2.unmarshall(rawBytes, 0, rawBytes.length);
assertThat(parcel2.readInt()).isEqualTo(1);
assertThat(parcel2.readString()).isEqualTo("hello");
assertThat(parcel2.readDouble()).isEqualTo(25.0);
assertThat(parcel2.readFloat()).isEqualTo(1.25f);
assertThat(parcel2.readByte()).isEqualTo((byte) 0xAF);
}
@Test @Ignore("Needs implementation in ShadowParcel.ByteBuffer")
public void testSetDataSize() {
parcel.setDataSize(8);
assertThat(parcel.dataSize()).isEqualTo(8);
}
@Test @Ignore("Needs implementation in ShadowParcel.ByteBuffer")
public void testSetDataCapacity() {
parcel.setDataCapacity(8);
assertThat(parcel.dataCapacity()).isEqualTo(8);
}
@Test
public void testWriteAndEnforceCompatibleInterface() {
parcel.writeInterfaceToken("com.example.IMyInterface");
parcel.setDataPosition(0);
parcel.enforceInterface("com.example.IMyInterface");
// Nothing explodes
}
@Test
public void testWriteAndEnforceIncompatibleInterface() {
parcel.writeInterfaceToken("com.example.Derp");
parcel.setDataPosition(0);
try {
parcel.enforceInterface("com.example.IMyInterface");
fail("Expected SecurityException");
} catch (SecurityException e) {
// Expected
}
}
}