1package com.xtremelabs.robolectric.shadows;
2
3import static org.hamcrest.CoreMatchers.equalTo;
4import static org.hamcrest.CoreMatchers.notNullValue;
5import static org.hamcrest.CoreMatchers.nullValue;
6import static org.junit.Assert.assertEquals;
7import static org.junit.Assert.assertThat;
8import static org.junit.Assert.assertTrue;
9
10import android.accounts.Account;
11import android.content.Intent;
12import android.os.Bundle;
13import android.os.Parcel;
14
15import com.xtremelabs.robolectric.Robolectric;
16import com.xtremelabs.robolectric.WithTestDefaultsRunner;
17
18import org.junit.Before;
19import org.junit.Test;
20import org.junit.runner.RunWith;
21
22import java.util.ArrayList;
23import java.util.Arrays;
24import java.util.List;
25
26@RunWith(WithTestDefaultsRunner.class)
27public class ParcelTest {
28
29    private Parcel parcel;
30    private ShadowParcel shadowParcel;
31
32    @Before
33    public void setup() {
34        parcel = Parcel.obtain();
35        shadowParcel = Robolectric.shadowOf(parcel);
36    }
37
38    @Test
39    public void testObtain() {
40        assertThat(parcel, notNullValue());
41        assertThat(shadowParcel.getIndex(), equalTo(0));
42        assertThat(shadowParcel.getParcelData().size(), equalTo(0));
43    }
44
45    @Test
46    public void testReadIntWhenEmpty() {
47        assertThat(parcel.readInt(), equalTo(0));
48    }
49
50    @Test
51    public void testReadLongWhenEmpty() {
52        assertThat(parcel.readLong(), equalTo(0l));
53    }
54
55    @Test
56    public void testReadStringWhenEmpty() {
57        assertThat(parcel.readString(), nullValue());
58    }
59
60    @Test
61    public void testReadWriteSingleString() {
62        String val = "test";
63        parcel.writeString(val);
64        parcel.setDataPosition(0);
65        assertThat(parcel.readString(), equalTo(val));
66    }
67
68	@Test
69	public void testWriteNullString() {
70		parcel.writeString( null );
71		parcel.setDataPosition(0);
72		assertThat( parcel.readString(), nullValue() );
73		assertThat( shadowParcel.getIndex(), equalTo( 1 ) );
74		assertThat( shadowParcel.getParcelData().size(), equalTo( 1 ) );
75	}
76
77    @Test
78    public void testReadWriteMultipleStrings() {
79        for (int i = 0; i < 10; ++i) {
80            parcel.writeString(Integer.toString(i));
81        }
82        parcel.setDataPosition(0);
83        for (int i = 0; i < 10; ++i) {
84            assertThat(parcel.readString(), equalTo(Integer.toString(i)));
85        }
86        // now try to read past the number of items written and see what happens
87        assertThat(parcel.readString(), nullValue());
88    }
89
90    @Test
91    public void testReadWriteSingleInt() {
92        int val = 5;
93        parcel.writeInt(val);
94        parcel.setDataPosition(0);
95        assertThat(parcel.readInt(), equalTo(val));
96    }
97
98    @Test
99    public void testReadWriteIntArray() throws Exception {
100        final int[] ints = {1, 2};
101        parcel.writeIntArray(ints);
102        parcel.setDataPosition(0);
103        final int[] ints2 = new int[ints.length];
104        parcel.readIntArray(ints2);
105        assertTrue(Arrays.equals(ints, ints2));
106    }
107
108    @Test
109    public void testReadWriteLongArray() throws Exception {
110        final long[] longs = {1, 2};
111        parcel.writeLongArray(longs);
112        parcel.setDataPosition(0);
113        final long[] longs2 = new long[longs.length];
114        parcel.readLongArray(longs2);
115        assertTrue(Arrays.equals(longs, longs2));
116    }
117
118    @Test
119    public void testReadWriteSingleFloat() {
120        float val = 5.2f;
121        parcel.writeFloat(val);
122        parcel.setDataPosition(0);
123        assertThat(parcel.readFloat(), equalTo(val));
124    }
125
126    @Test
127    public void testReadWriteFloatArray() throws Exception {
128        final float[] floats = {1.1f, 2.0f};
129        parcel.writeFloatArray(floats);
130        parcel.setDataPosition(0);
131        final float[] floats2 = new float[floats.length];
132        parcel.readFloatArray(floats2);
133        assertTrue(Arrays.equals(floats, floats2));
134    }
135
136    @Test
137    public void testReadWriteDoubleArray() throws Exception {
138        final double[] doubles = {1.1f, 2.0f};
139        parcel.writeDoubleArray(doubles);
140        parcel.setDataPosition(0);
141        final double[] doubles2 = new double[doubles.length];
142        parcel.readDoubleArray(doubles2);
143        assertTrue(Arrays.equals(doubles, doubles2));
144    }
145
146    @Test
147    public void testReadWriteStringArray() throws Exception {
148        final String[] strings = {"foo", "bar"};
149        parcel.writeStringArray(strings);
150        parcel.setDataPosition(0);
151        final String[] strings2 = new String[strings.length];
152        parcel.readStringArray(strings2);
153        assertTrue(Arrays.equals(strings, strings2));
154    }
155
156    @Test
157    public void testReadWriteMultipleInts() {
158        for (int i = 0; i < 10; ++i) {
159            parcel.writeInt(i);
160        }
161        parcel.setDataPosition(0);
162        for (int i = 0; i < 10; ++i) {
163            assertThat(parcel.readInt(), equalTo(i));
164        }
165        // now try to read past the number of items written and see what happens
166        assertThat(parcel.readInt(), equalTo(0));
167    }
168
169    @Test
170    public void testReadWriteSingleByte() {
171        byte val = 1;
172        parcel.writeByte(val);
173        parcel.setDataPosition(0);
174        assertThat(parcel.readByte(), equalTo(val));
175    }
176
177    @Test
178    public void testReadWriteMultipleBytes() {
179        for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
180            parcel.writeByte(i);
181        }
182        parcel.setDataPosition(0);
183        for (byte i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; ++i) {
184            assertThat(parcel.readByte(), equalTo(i));
185        }
186        // now try to read past the number of items written and see what happens
187        assertThat(parcel.readByte(), equalTo((byte) 0));
188    }
189
190
191    @Test
192    public void testReadWriteStringInt() {
193        for (int i = 0; i < 10; ++i) {
194            parcel.writeString(Integer.toString(i));
195            parcel.writeInt(i);
196        }
197        parcel.setDataPosition(0);
198        for (int i = 0; i < 10; ++i) {
199            assertThat(parcel.readString(), equalTo(Integer.toString(i)));
200            assertThat(parcel.readInt(), equalTo(i));
201        }
202        // now try to read past the number of items written and see what happens
203        assertThat(parcel.readString(), nullValue());
204        assertThat(parcel.readInt(), equalTo(0));
205    }
206
207    @Test
208    public void testReadWriteSingleLong() {
209        long val = 5;
210        parcel.writeLong(val);
211        parcel.setDataPosition(0);
212        assertThat(parcel.readLong(), equalTo(val));
213    }
214
215    @Test
216    public void testReadWriteMultipleLongs() {
217        for (long i = 0; i < 10; ++i) {
218            parcel.writeLong(i);
219        }
220        parcel.setDataPosition(0);
221        for (long i = 0; i < 10; ++i) {
222            assertThat(parcel.readLong(), equalTo(i));
223        }
224        // now try to read past the number of items written and see what happens
225        assertThat(parcel.readLong(), equalTo(0l));
226    }
227
228    @Test
229    public void testReadWriteStringLong() {
230        for (long i = 0; i < 10; ++i) {
231            parcel.writeString(Long.toString(i));
232            parcel.writeLong(i);
233        }
234        parcel.setDataPosition(0);
235        for (long i = 0; i < 10; ++i) {
236            assertThat(parcel.readString(), equalTo(Long.toString(i)));
237            assertThat(parcel.readLong(), equalTo(i));
238        }
239        // now try to read past the number of items written and see what happens
240        assertThat(parcel.readString(), nullValue());
241        assertThat(parcel.readLong(), equalTo(0l));
242    }
243
244    @Test
245    public void testReadWriteParcelable() {
246        Intent i1 = new Intent("anAction");
247        parcel.writeParcelable(i1, 0);
248
249        parcel.setDataPosition(0);
250
251        Intent i2 = parcel.readParcelable(Intent.class.getClassLoader());
252        assertEquals(i1, i2);
253    }
254
255    @Test
256    public void testReadWriteSimpleBundle() {
257        Bundle b1 = new Bundle();
258        b1.putString("hello", "world");
259        parcel.writeBundle(b1);
260        parcel.setDataPosition(0);
261        Bundle b2 = parcel.readBundle();
262
263        assertEquals(b1, b2);
264        assertEquals("world", b2.getString("hello"));
265
266        parcel.setDataPosition(0);
267        parcel.writeBundle(b1);
268        parcel.setDataPosition(0);
269        b2 = parcel.readBundle(null /* ClassLoader */);
270        assertEquals(b1, b2);
271        assertEquals("world", b2.getString("hello"));
272    }
273
274    @Test
275    public void testReadWriteNestedBundles() {
276        Account account = new Account("accountName", "accountType");
277        Bundle innerBundle = new Bundle();
278        innerBundle.putString("hello", "world");
279        innerBundle.putParcelable("account", account);
280        Bundle b1 = new Bundle();
281        b1.putBundle("bundle", innerBundle);
282        b1.putInt("int", 23);
283        parcel.writeBundle(b1);
284        parcel.setDataPosition(0);
285        Bundle b2 = parcel.readBundle();
286
287        assertEquals(b1, b2);
288        assertEquals(innerBundle, b2.getBundle("bundle"));
289        assertEquals(23, b2.getInt("int"));
290        assertEquals("world", b2.getBundle("bundle").getString("hello"));
291
292        parcel.setDataPosition(0);
293        parcel.writeBundle(b1);
294        parcel.setDataPosition(0);
295        b2 = parcel.readBundle(null /* ClassLoader */);
296        assertEquals(b1, b2);
297        assertEquals(innerBundle, b2.getBundle("bundle"));
298        assertEquals(23, b2.getInt("int"));
299        assertEquals("world", b2.getBundle("bundle").getString("hello"));
300    }
301
302    @Test
303    public void testReadWriteBundleWithDifferentValueTypes() {
304        Bundle b1 = new Bundle();
305        b1.putString("hello", "world");
306        b1.putBoolean("boolean", true);
307        b1.putByte("byte", (byte) 0xAA);
308        b1.putShort("short", (short)0xBABE);
309        b1.putInt("int", 1);
310        b1.putFloat("float", 0.5f);
311        b1.putDouble("double", 1.25);
312        parcel.writeBundle(b1);
313        parcel.setDataPosition(0);
314
315        Bundle b2 = parcel.readBundle();
316
317        assertEquals(b1, b2);
318        assertEquals("world", b2.getString("hello"));
319        assertEquals(true, b2.getBoolean("boolean"));
320        assertEquals((byte) 0xAA, b2.getByte("byte"));
321        assertEquals((short) 0xBABE, b2.getShort("short"));
322        assertEquals(1, b2.getInt("int"));
323        assertEquals(0.5f, b2.getFloat("float"), 0.05);
324        assertEquals(1.25, b2.getDouble("double"), 0.05);
325
326        parcel.setDataPosition(0);
327        parcel.writeBundle(b1);
328        parcel.setDataPosition(0);
329        b2 = parcel.readBundle(null /* ClassLoader */);
330        assertEquals(b1, b2);
331        assertEquals("world", b2.getString("hello"));
332        assertEquals(true, b2.getBoolean("boolean"));
333        assertEquals((byte) 0xAA, b2.getByte("byte"));
334        assertEquals((short) 0xBABE, b2.getShort("short"));
335        assertEquals(1, b2.getInt("int"));
336        assertEquals(0.5f, b2.getFloat("float"), 0.05);
337        assertEquals(1.25, b2.getDouble("double"), 0.05);
338    }
339
340    @Test
341    public void testWriteCreateStringArray() {
342      final String[] strings = { "foo", "bar" };
343      parcel.writeStringArray(strings);
344      parcel.setDataPosition(0);
345      final String[] strings2 = parcel.createStringArray();
346      assertTrue(Arrays.equals(strings, strings2));
347    }
348
349    @Test
350    public void testReadWriteStringList() {
351        final List<String> strings = Arrays.asList( "foo", "bar" );
352        parcel.writeStringList(strings);
353        parcel.setDataPosition(0);
354        List<String> extractedStrings = new ArrayList<String>();
355        parcel.readStringList(extractedStrings);
356        assertEquals(strings, extractedStrings);
357    }
358
359    @Test
360    public void testWriteCreateStringArrayList() {
361        final List<String> strings = Arrays.asList( "foo", "bar" );
362        parcel.writeStringList(strings);
363        parcel.setDataPosition(0);
364        List<String> extractedStrings = parcel.createStringArrayList();
365        assertEquals(strings, extractedStrings);
366    }
367
368    @Test
369    public void testReadWriteByteArray() throws Exception {
370        final byte[] bytes = {1, 2};
371        parcel.writeByteArray(bytes);
372        parcel.setDataPosition(0);
373        final byte[] bytes2 = new byte[bytes.length];
374        parcel.readByteArray(bytes2);
375        assertTrue(Arrays.equals(bytes, bytes2));
376    }
377
378    @Test
379    public void testReadWriteBooleanArray() {
380        final boolean[] booleans = {false, true, true};
381        parcel.writeBooleanArray(booleans);
382        parcel.setDataPosition(0);
383        final boolean[] booleans2 = new boolean[booleans.length];
384        parcel.readBooleanArray(booleans2);
385        assertTrue(Arrays.equals(booleans, booleans2));
386    }
387
388    @Test
389    public void testReadWriteCharArray() {
390        final char[] chars = {'a', 'b', 'c'};
391        parcel.writeCharArray(chars);
392        parcel.setDataPosition(0);
393        final char[] chars2 = new char[chars.length];
394        parcel.readCharArray(chars2);
395        assertTrue(Arrays.equals(chars, chars2));
396    }
397
398    @Test
399    public void testWriteCreateBooleanArray() {
400        final boolean[] booleans = {false, true, true};
401        parcel.writeBooleanArray(booleans);
402        parcel.setDataPosition(0);
403        final boolean[] booleans2 = parcel.createBooleanArray();
404        assertTrue(Arrays.equals(booleans, booleans2));
405    }
406
407    @Test
408    public void testWriteCreateByteArray() {
409        final byte[] bytes = {1, 2};
410        parcel.writeByteArray(bytes);
411        parcel.setDataPosition(0);
412        final byte[] bytes2 = parcel.createByteArray();
413        assertTrue(Arrays.equals(bytes, bytes2));
414    }
415
416    @Test
417    public void testWriteCreateCharArray() {
418        final char[] chars = {'a', 'b', 'c'};
419        parcel.writeCharArray(chars);
420        parcel.setDataPosition(0);
421        final char[] chars2 = parcel.createCharArray();
422        assertTrue(Arrays.equals(chars, chars2));
423    }
424
425    @Test
426    public void testWriteCreateIntArray() {
427        final int[] ints = {1, 2};
428        parcel.writeIntArray(ints);
429        parcel.setDataPosition(0);
430        final int[] ints2 = parcel.createIntArray();
431        assertTrue(Arrays.equals(ints, ints2));
432    }
433
434    @Test
435    public void testWriteCreateLongArray() {
436        final long[] longs = {1, 2};
437        parcel.writeLongArray(longs);
438        parcel.setDataPosition(0);
439        final long[] longs2 = parcel.createLongArray();
440        assertTrue(Arrays.equals(longs, longs2));
441    }
442
443    @Test
444    public void testWriteCreateFloatArray() {
445        final float[] floats = {1.5f, 2.25f};
446        parcel.writeFloatArray(floats);
447        parcel.setDataPosition(0);
448        final float[] floats2 = parcel.createFloatArray();
449        assertTrue(Arrays.equals(floats, floats2));
450    }
451
452    @Test
453    public void testWriteCreateDoubleArray() {
454        final double[] doubles = {1.2, 2.2};
455        parcel.writeDoubleArray(doubles);
456        parcel.setDataPosition(0);
457        final double[] doubles2 = parcel.createDoubleArray();
458        assertTrue(Arrays.equals(doubles, doubles2));
459    }
460
461    @Test
462    public void testDataPositionAfterStringWrite() {
463      parcel.writeString("string");
464      assertEquals(10, parcel.dataPosition());
465    }
466
467    @Test
468    public void testDataPositionAfterByteWrite() {
469      parcel.writeByte((byte) 0);
470      assertEquals(1, parcel.dataPosition());
471    }
472
473    @Test
474    public void testDataPositionAfterIntWrite() {
475      parcel.writeInt(1);
476      assertEquals(4, parcel.dataPosition());
477    }
478
479    @Test
480    public void testDataPositionAfterLongWrite() {
481      parcel.writeLong(23);
482      assertEquals(8, parcel.dataPosition());
483    }
484
485    @Test
486    public void testDataPositionAfterFloatWrite() {
487      parcel.writeFloat(0.5f);
488      assertEquals(4, parcel.dataPosition());
489    }
490
491    @Test
492    public void testDataPositionAfterDoubleWrite() {
493      parcel.writeDouble(8.8);
494      assertEquals(8, parcel.dataPosition());
495    }
496
497    @Test
498    public void testResetDataPositionAfterWrite() {
499      parcel.writeInt(4);
500      parcel.setDataPosition(0);
501      assertEquals(0, parcel.dataPosition());
502    }
503
504    @Test
505    public void testOverwritePreviousValue() {
506      parcel.writeInt(4);
507      parcel.setDataPosition(0);
508      parcel.writeInt(34);
509      parcel.setDataPosition(0);
510      assertEquals(34, parcel.readInt());
511      assertEquals(4, parcel.dataSize());
512    }
513}
514