package com.example.pocketknife; import android.os.Bundle; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.util.ActivityController; import java.util.ArrayList; import java.util.Random; import java.util.UUID; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @RunWith(RobolectricTestRunner.class) @Config(manifest = "src/main/AndroidManifest.xml") public class SaveStateActivityTest extends BaseTest { @Test public void verifySaveRestoreState() { Random random = new Random(42); ActivityController<SaveStateActivity> initialController = Robolectric.buildActivity(SaveStateActivity.class).create(); SaveStateActivity original = initialController.start().restart().visible().get(); original.aBoolean = random.nextBoolean(); original.booleans = new boolean[]{random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean()}; Bundle bundle = new Bundle(); bundle.putInt(BUNDLE_INT_ARG, random.nextInt()); bundle.putSerializable(BUNDLE_SERIALIZABLE_ARG, UUID.randomUUID().toString()); original.aByte = (byte)random.nextInt(); original.bytes = new byte[random.nextInt(10)]; random.nextBytes(original.bytes); original.aChar = (char)random.nextInt(); original.chars = new char[]{(char)random.nextInt(), (char)random.nextInt()}; original.charSequence = UUID.randomUUID().toString(); original.charSequences = new CharSequence[]{UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()}; original.charSequenceArrayList = new ArrayList<CharSequence>(); original.charSequenceArrayList.add(UUID.randomUUID().toString()); original.aDouble = random.nextDouble(); original.doubles = new double[]{random.nextDouble()}; original.aFloat = random.nextFloat(); original.floats = new float[]{random.nextFloat()}; original.anInt = random.nextInt(); original.ints = new int[]{random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt()}; original.integerArrayList = new ArrayList<Integer>(); original.integerArrayList.add(random.nextInt()); original.aLong = random.nextLong(); original.longs = new long[]{random.nextLong(), random.nextLong(), random.nextLong(), random.nextLong()}; original.parcelable = new MyParcelable(random.nextInt()); original.parcelables = new MyParcelable[]{new MyParcelable(random.nextInt()), new MyParcelable(random.nextInt()), new MyParcelable(random.nextInt())}; original.parcelableArrayList = new ArrayList<MyParcelable>(); original.parcelableArrayList.add(new MyParcelable(random.nextInt())); original.serializable = UUID.randomUUID().toString(); original.aShort = (short)random.nextInt(); original.shorts = new short[]{(short)random.nextInt(), (short)random.nextInt(), (short)random.nextInt(), (short)random.nextInt()}; original.string = UUID.randomUUID().toString(); original.strings = new String[]{UUID.randomUUID().toString()}; original.stringArrayList = new ArrayList<String>(); original.stringArrayList.add(UUID.randomUUID().toString()); Bundle saveState = new Bundle(); initialController.saveInstanceState(saveState); ActivityController<SaveStateActivity> secondaryController = Robolectric.buildActivity(SaveStateActivity.class).create(saveState); SaveStateActivity activity = secondaryController.start().restart().visible().get(); // Boolean assertEquals(original.aBoolean, activity.aBoolean); // Array assertBooleanArrayEquals(original.booleans, activity.booleans); // Bundle assertBundleEquals(original.bundle, activity.bundle); // Byte assertEquals(original.aByte, activity.aByte); // Array assertArrayEquals(original.bytes, activity.bytes); // Char assertEquals(original.aChar, activity.aChar); // Array assertArrayEquals(original.chars, activity.chars); // CharSequence assertEquals(original.charSequence, activity.charSequence); // Array assertArrayEquals(original.charSequences, activity.charSequences); // ArrayList assertArrayListEquals(original.charSequenceArrayList, activity.charSequenceArrayList); // Double assertEquals(original.aDouble, activity.aDouble, 0); // Array assertArrayEquals(original.doubles, activity.doubles, 0); // Float assertEquals(original.aFloat, activity.aFloat, 0); // Array assertArrayEquals(original.floats, activity.floats, 0); // Int assertEquals(original.anInt, activity.anInt); // Array assertArrayEquals(original.ints, activity.ints); // ArrayList assertArrayListEquals(original.integerArrayList, activity.integerArrayList); // Long assertEquals(original.aLong, activity.aLong); // Array assertArrayEquals(original.longs, activity.longs); //Parcelable assertEquals(original.parcelable, activity.parcelable); // Array assertArrayEquals(original.parcelables, activity.parcelables); // ArrayList assertArrayListEquals(original.parcelableArrayList, activity.parcelableArrayList); // Serializable String s1 = (String)original.serializable; String s2 = (String)activity.serializable; assertEquals(s1, s2); // Shorts assertEquals(original.aShort, activity.aShort); // Array assertArrayEquals(original.shorts, activity.shorts); // String assertEquals(original.string, activity.string); // Array assertArrayEquals(original.strings, activity.strings); // ArrayList assertArrayListEquals(original.stringArrayList, activity.stringArrayList); } @Test (expected = IllegalStateException.class) public void verifySaveRestoreExceptionThrown() { Robolectric.buildActivity(SaveStateActivity.class).create(new Bundle()); } @Test public void verifyNotRequiredSaveRestoreState() { Robolectric.buildActivity(NotRequiredSaveStateActivity.class).create(new Bundle()).get(); } }