Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import android.os.Bundle;
      4 import android.support.v4.app.Fragment;
      5 import android.support.v4.app.FragmentActivity;
      6 import android.view.View;
      7 import android.view.ViewGroup;
      8 import android.widget.Button;
      9 
     10 import com.xtremelabs.robolectric.R;
     11 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
     12 import com.xtremelabs.robolectric.tester.android.util.TestFragmentManager;
     13 import org.junit.Before;
     14 import org.junit.Ignore;
     15 import org.junit.Test;
     16 import org.junit.runner.RunWith;
     17 
     18 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
     19 import static junit.framework.Assert.assertNull;
     20 import static junit.framework.Assert.assertTrue;
     21 import static org.junit.Assert.*;
     22 
     23 @RunWith(WithTestDefaultsRunner.class)
     24 public class FragmentActivityTest {
     25 
     26     private TestFragmentActivity activity;
     27     private TestFragment fragment;
     28 
     29     @Before
     30     public void setUp() throws Exception {
     31         activity = new TestFragmentActivity();
     32         activity.onCreate(null);
     33         fragment = (TestFragment) activity.getSupportFragmentManager().findFragmentByTag("fragment_tag");
     34     }
     35 
     36     @Test
     37     public void shouldHaveAFragmentManager() throws Exception {
     38         assertNotNull(activity.getSupportFragmentManager());
     39     }
     40 
     41     @Test
     42     public void viewLoader_shouldInflateFragment() throws Exception {
     43         assertEquals(TestFragment.class, fragment.getClass());
     44     }
     45 
     46     @Test
     47     public void viewLoader_shouldSetFragmentId() throws Exception {
     48         Fragment fragmentById = activity.getSupportFragmentManager().findFragmentById(R.id.fragment);
     49         assertSame(fragment, fragmentById);
     50     }
     51 
     52     @Test
     53     public void viewLoader_shouldInsertFragmentViewIntoLayout() throws Exception {
     54         assertSame(fragment.onCreateViewReturnValue, activity.findViewById(TestFragment.FRAGMENT_VIEW_ID));
     55     }
     56 
     57     @Test
     58     public void viewLoader_shouldSetFragmentsActivity() throws Exception {
     59         assertSame(activity, fragment.getActivity());
     60     }
     61 
     62     @Test
     63     public void viewLoader_shouldCreateContainerView() throws Exception {
     64         ViewGroup container = (ViewGroup) activity.findViewById(R.id.fragment);
     65         assertNotNull(container);
     66     }
     67 
     68     @Test
     69     public void viewLoader_shouldInsertFragmentViewIntoContainer() throws Exception {
     70         ViewGroup container = (ViewGroup) activity.findViewById(R.id.fragment);
     71         View fragmentView = container.findViewById(TestFragment.FRAGMENT_VIEW_ID);
     72         assertSame(fragment.onCreateViewReturnValue, fragmentView);
     73     }
     74 
     75     @Test
     76     @Ignore("Seems to be broken by 'Android Support' rev 8")
     77     public void onSaveInstanceState_shouldStoreListOfFragments() throws Exception {
     78         Fragment fragment = new TestFragment();
     79         int fragment_container = R.id.dynamic_fragment_container;
     80         activity.getSupportFragmentManager().beginTransaction().add(fragment_container, fragment).commit();
     81         Bundle outState = new Bundle();
     82         activity.onSaveInstanceState(outState);
     83 
     84         assertTrue(outState.containsKey(ShadowFragmentActivity.FRAGMENTS_TAG));
     85 
     86         Object[] states = (Object[]) outState.getSerializable(ShadowFragmentActivity.FRAGMENTS_TAG);
     87         SerializedFragmentState fragmentState = (SerializedFragmentState) states[1];
     88 
     89         assertEquals(fragmentState.id, fragment.getId());
     90         assertEquals(fragmentState.tag, fragment.getTag());
     91         assertEquals(fragmentState.fragmentClass, fragment.getClass());
     92         assertEquals(fragmentState.containerId, fragment_container);
     93     }
     94 
     95     @Test
     96     public void onSaveInstanceState_shouldCallOnSaveInstanceStateOnFragments() throws Exception {
     97         TestFragment fragment = new TestFragment();
     98         int fragment_container = R.id.dynamic_fragment_container;
     99         activity.getSupportFragmentManager().beginTransaction().add(fragment_container, fragment).commit();
    100         Bundle outState = new Bundle();
    101         activity.onSaveInstanceState(outState);
    102 
    103         assertTrue(fragment.onSaveInstanceStateWasCalled);
    104     }
    105 
    106     @Test
    107     public void onCreate_shouldRecreateFragments() throws Exception {
    108         Bundle bundle = new Bundle();
    109         TestFragment dynamicFrag = new TestFragment();
    110         int containerId = 123;
    111         SerializedFragmentState fragmentState = new SerializedFragmentState(containerId, dynamicFrag);
    112         bundle.putSerializable(ShadowFragmentActivity.FRAGMENTS_TAG, new Object[]{fragmentState});
    113 
    114         activity = new TestFragmentActivity();
    115         activity.onCreate(bundle);
    116         TestFragmentManager fragmentManager = (TestFragmentManager) activity.getSupportFragmentManager();
    117         assertEquals(2, fragmentManager.getFragments().size());
    118 
    119         TestFragment restoredFrag = (TestFragment) fragmentManager.getFragmentsById().get(containerId);
    120         assertEquals(restoredFrag.getId(), dynamicFrag.getId());
    121         assertEquals(restoredFrag.getTag(), dynamicFrag.getTag());
    122         assertEquals(bundle, shadowOf(restoredFrag).getSavedInstanceState());
    123         assertSame(activity, restoredFrag.onAttachActivity);
    124         assertSame(activity, restoredFrag.getActivity());
    125         assertNull(restoredFrag.getView());
    126     }
    127 
    128     @Test
    129     public void onStart_shouldStartFragments() throws Exception {
    130         Bundle bundle = new Bundle();
    131         TestFragment dynamicFrag = new TestFragment();
    132         int containerId = 123;
    133         SerializedFragmentState fragmentState = new SerializedFragmentState(containerId, dynamicFrag);
    134         bundle.putSerializable(ShadowFragmentActivity.FRAGMENTS_TAG, new Object[]{fragmentState});
    135 
    136         activity = new TestFragmentActivity();
    137         activity.onCreate(bundle);
    138         shadowOf(activity).onStart();
    139         TestFragmentManager fragmentManager = (TestFragmentManager) activity.getSupportFragmentManager();
    140         assertEquals(2, fragmentManager.getFragments().size());
    141         TestFragment restoredFrag = (TestFragment) fragmentManager.getFragmentsById().get(containerId);
    142 
    143         assertEquals(restoredFrag.onCreateViewInflater, activity.getLayoutInflater());
    144         assertNotNull(restoredFrag.getView());
    145     }
    146 
    147     @Test
    148     public void onPause_shouldPauseTheFragment() throws Exception {
    149         activity.onPause();
    150         assertTrue(fragment.onPauseWasCalled);
    151     }
    152 
    153     @Test
    154     public void getCurrentFocus_shouldGetFocusFromFragment() {
    155         activity = new TestFragmentActivity();
    156         activity.onCreate(null);
    157         shadowOf(activity).onStart();
    158 
    159         Fragment fragment = activity.getSupportFragmentManager().findFragmentById(
    160                 TestFragment.FRAGMENT_VIEW_ID);
    161         View button = activity.findViewById(R.id.button);
    162         button.requestFocus();
    163 
    164         View focusedView = activity.getCurrentFocus();
    165         assertSame(button, focusedView);
    166     }
    167 
    168     private static class TestFragmentActivity extends FragmentActivity {
    169         @Override
    170         public void onCreate(Bundle savedInstanceState) {
    171             super.onCreate(savedInstanceState);
    172             setContentView(R.layout.fragment_activity);
    173         }
    174 
    175         @Override
    176         public void onSaveInstanceState(Bundle outState) {
    177             super.onSaveInstanceState(outState);
    178         }
    179 
    180         @Override
    181         public void onPause() {
    182             super.onPause();
    183         }
    184     }
    185 }
    186