package nucleus.example.main;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
import nucleus.example.TestActivity;
public class FragmentStackTest extends ActivityInstrumentationTestCase2<TestActivity> {
private static final int CONTAINER_ID = android.R.id.content;
private TestActivity activity;
public FragmentStackTest() {
super(TestActivity.class);
}
@Override
public void setUp() throws Exception {
activity = getActivity();
}
public static class TestFragment1 extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
}
}
public static class TestFragment2 extends Fragment {
}
public interface TestCallback {
}
public static class TestFragmentC extends Fragment implements TestCallback {
}
@UiThreadTest
public void testPushPop() throws Exception {
FragmentManager manager = activity.getSupportFragmentManager();
FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID);
TestFragment1 fragment = new TestFragment1();
stack.push(fragment);
assertTopFragment(manager, stack, fragment, 0);
TestFragment2 fragment2 = new TestFragment2();
stack.push(fragment2);
assertFragment(manager, fragment, 0);
assertTopFragment(manager, stack, fragment2, 1);
assertFalse(fragment.isAdded());
assertTrue(fragment2.isAdded());
assertTrue(stack.pop());
assertTopFragment(manager, stack, fragment, 0);
assertNull(manager.findFragmentByTag("1"));
assertFalse(stack.pop());
assertTopFragment(manager, stack, fragment, 0);
}
@UiThreadTest
public void testReplace() throws Exception {
FragmentManager manager = activity.getSupportFragmentManager();
FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID);
TestFragment1 fragment = new TestFragment1();
stack.replace(fragment);
assertTopFragment(manager, stack, fragment, 0);
TestFragment2 fragment2 = new TestFragment2();
stack.replace(fragment2);
assertTopFragment(manager, stack, fragment2, 0);
}
@UiThreadTest
public void testPushReplace() throws Exception {
FragmentManager manager = activity.getSupportFragmentManager();
FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID);
TestFragment1 fragment = new TestFragment1();
stack.push(fragment);
TestFragment2 fragment2 = new TestFragment2();
stack.push(fragment2);
TestFragment1 fragment3 = new TestFragment1();
stack.replace(fragment3);
assertTopFragment(manager, stack, fragment3, 0);
assertNull(manager.findFragmentByTag("1"));
}
@UiThreadTest
public void testFindCallback() throws Exception {
FragmentManager manager = activity.getSupportFragmentManager();
FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID);
TestFragmentC fragment = new TestFragmentC();
stack.push(fragment);
TestFragment2 fragment2 = new TestFragment2();
stack.push(fragment2);
assertEquals(fragment, stack.findCallback(fragment2, TestCallback.class));
assertEquals(activity, stack.findCallback(fragment2, Activity.class));
assertNull(stack.findCallback(fragment2, String.class));
}
@UiThreadTest
public void testBack() throws Exception {
FragmentManager manager = activity.getSupportFragmentManager();
FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID);
assertFalse(stack.back());
stack.push(new TestFragment1());
assertEquals(1, stack.size());
assertFalse(stack.back());
stack.push(new TestFragment1());
assertEquals(2, stack.size());
assertTrue(stack.back());
assertEquals(1, stack.size());
}
private void assertTopFragment(FragmentManager manager, FragmentStack stack, Fragment fragment, int index) {
assertFragment(manager, fragment, index);
assertEquals(fragment, manager.findFragmentById(CONTAINER_ID));
assertEquals(fragment, stack.peek());
assertEquals(index, manager.getBackStackEntryCount());
}
private void assertFragment(FragmentManager manager, Fragment fragment, int index) {
assertEquals(fragment, manager.findFragmentByTag(Integer.toString(index)));
}
}