1 package org.robolectric.shadows.support.v4; 2 3 import static com.google.common.truth.Truth.assertThat; 4 import static org.mockito.Mockito.spy; 5 import static org.mockito.Mockito.verify; 6 7 import android.content.Intent; 8 import android.os.Bundle; 9 import android.support.v4.app.Fragment; 10 import android.support.v4.app.FragmentActivity; 11 import android.view.LayoutInflater; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.LinearLayout; 15 import android.widget.TextView; 16 import org.junit.Test; 17 import org.junit.runner.RunWith; 18 import org.robolectric.R; 19 import org.robolectric.util.TestRunnerWithManifest; 20 21 @RunWith(TestRunnerWithManifest.class) 22 public class SupportFragmentControllerTest { 23 24 private static final int VIEW_ID_CUSTOMIZED_LOGIN_ACTIVITY = 123; 25 26 @Test initialNotAttached()27 public void initialNotAttached() { 28 final LoginFragment fragment = new LoginFragment(); 29 SupportFragmentController.of(fragment); 30 31 assertThat(fragment.getView()).isNull(); 32 assertThat(fragment.getActivity()).isNull(); 33 assertThat(fragment.isAdded()).isFalse(); 34 } 35 36 @Test initialNotAttached_customActivity()37 public void initialNotAttached_customActivity() { 38 final LoginFragment fragment = new LoginFragment(); 39 SupportFragmentController.of(fragment, LoginActivity.class); 40 41 assertThat(fragment.getView()).isNull(); 42 assertThat(fragment.getActivity()).isNull(); 43 assertThat(fragment.isAdded()).isFalse(); 44 } 45 46 @Test attachedAfterCreate()47 public void attachedAfterCreate() { 48 final LoginFragment fragment = new LoginFragment(); 49 SupportFragmentController.of(fragment).create(); 50 51 assertThat(fragment.getActivity()).isNotNull(); 52 assertThat(fragment.isAdded()).isTrue(); 53 assertThat(fragment.isResumed()).isFalse(); 54 } 55 56 @Test attachedAfterCreate_customActivity()57 public void attachedAfterCreate_customActivity() { 58 final LoginFragment fragment = new LoginFragment(); 59 SupportFragmentController.of(fragment, LoginActivity.class).create(); 60 61 assertThat(fragment.getActivity()).isNotNull(); 62 assertThat(fragment.getActivity()).isInstanceOf(LoginActivity.class); 63 assertThat(fragment.isAdded()).isTrue(); 64 assertThat(fragment.isResumed()).isFalse(); 65 } 66 67 @Test attachedAfterCreate_customizedViewId()68 public void attachedAfterCreate_customizedViewId() { 69 final LoginFragment fragment = new LoginFragment(); 70 SupportFragmentController.of(fragment, CustomizedViewIdLoginActivity.class).create(VIEW_ID_CUSTOMIZED_LOGIN_ACTIVITY, null).start(); 71 72 assertThat(fragment.getView()).isNotNull(); 73 assertThat(fragment.getActivity()).isNotNull(); 74 assertThat(fragment.isAdded()).isTrue(); 75 assertThat(fragment.isResumed()).isFalse(); 76 assertThat((TextView) fragment.getView().findViewById(R.id.tacos)).isNotNull(); 77 } 78 79 @Test hasViewAfterStart()80 public void hasViewAfterStart() { 81 final LoginFragment fragment = new LoginFragment(); 82 SupportFragmentController.of(fragment).create().start(); 83 84 assertThat(fragment.getView()).isNotNull(); 85 } 86 87 @Test isResumed()88 public void isResumed() { 89 final LoginFragment fragment = new LoginFragment(); 90 SupportFragmentController.of(fragment, LoginActivity.class).create().start().resume(); 91 92 assertThat(fragment.getView()).isNotNull(); 93 assertThat(fragment.getActivity()).isNotNull(); 94 assertThat(fragment.isAdded()).isTrue(); 95 assertThat(fragment.isResumed()).isTrue(); 96 assertThat((TextView) fragment.getView().findViewById(R.id.tacos)).isNotNull(); 97 } 98 99 @Test isPaused()100 public void isPaused() { 101 final LoginFragment fragment = spy(new LoginFragment()); 102 SupportFragmentController.of(fragment, LoginActivity.class).create().start().resume().pause(); 103 104 assertThat(fragment.getView()).isNotNull(); 105 assertThat(fragment.getActivity()).isNotNull(); 106 assertThat(fragment.isAdded()).isTrue(); 107 assertThat(fragment.isResumed()).isFalse(); 108 109 verify(fragment).onResume(); 110 verify(fragment).onPause(); 111 } 112 113 @Test isStopped()114 public void isStopped() { 115 final LoginFragment fragment = spy(new LoginFragment()); 116 SupportFragmentController.of(fragment, LoginActivity.class).create().start().resume().pause().stop(); 117 118 assertThat(fragment.getView()).isNotNull(); 119 assertThat(fragment.getActivity()).isNotNull(); 120 assertThat(fragment.isAdded()).isTrue(); 121 assertThat(fragment.isResumed()).isFalse(); 122 123 verify(fragment).onStart(); 124 verify(fragment).onResume(); 125 verify(fragment).onPause(); 126 verify(fragment).onStop(); 127 } 128 129 @Test withIntent()130 public void withIntent() { 131 final LoginFragment fragment = new LoginFragment(); 132 Intent intent = new Intent("test_action"); 133 intent.putExtra("test_key", "test_value"); 134 SupportFragmentController<LoginFragment> controller = 135 SupportFragmentController.of(fragment, LoginActivity.class, intent).create(); 136 137 Intent intentInFragment = controller.get().getActivity().getIntent(); 138 assertThat(intentInFragment.getAction()).isEqualTo("test_action"); 139 assertThat(intentInFragment.getExtras().getString("test_key")).isEqualTo("test_value"); 140 } 141 142 @Test visible()143 public void visible() { 144 final LoginFragment fragment = new LoginFragment(); 145 final SupportFragmentController<LoginFragment> controller = SupportFragmentController.of(fragment, LoginActivity.class); 146 147 controller.create().start().resume(); 148 assertThat(fragment.isVisible()).isFalse(); 149 150 controller.visible(); 151 assertThat(fragment.isVisible()).isTrue(); 152 } 153 154 @Test savesInstanceState()155 public void savesInstanceState() { 156 final LoginFragment fragment = new LoginFragment(); 157 final SupportFragmentController<LoginFragment> controller = 158 SupportFragmentController.of(fragment, LoginActivity.class); 159 controller.create().start().resume().visible(); 160 LoginActivity activity = (LoginActivity) controller.get().getActivity(); 161 Bundle expectedState = new Bundle(); 162 expectedState.putBoolean("isRestored", true); 163 activity.setState(expectedState); 164 final Bundle savedInstanceState = new Bundle(); 165 166 controller.saveInstanceState(savedInstanceState); 167 168 assertThat(savedInstanceState.getBoolean("isRestored")).isTrue(); 169 } 170 171 public static class LoginFragment extends Fragment { 172 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)173 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 174 return inflater.inflate(R.layout.fragment_contents, container, false); 175 } 176 } 177 178 public static class LoginActivity extends FragmentActivity { 179 private Bundle state = new Bundle(); 180 181 @Override onCreate(Bundle savedInstanceState)182 protected void onCreate(Bundle savedInstanceState) { 183 super.onCreate(savedInstanceState); 184 LinearLayout view = new LinearLayout(this); 185 view.setId(1); 186 187 setContentView(view); 188 } 189 190 @Override onSaveInstanceState(Bundle savedInstanceState)191 protected void onSaveInstanceState(Bundle savedInstanceState) { 192 super.onSaveInstanceState(savedInstanceState); 193 savedInstanceState.putAll(state); 194 } 195 setState(Bundle state)196 public void setState(Bundle state) { 197 this.state = state; 198 } 199 } 200 201 public static class CustomizedViewIdLoginActivity extends FragmentActivity { 202 @Override onCreate(Bundle savedInstanceState)203 protected void onCreate(Bundle savedInstanceState) { 204 super.onCreate(savedInstanceState); 205 LinearLayout view = new LinearLayout(this); 206 view.setId(VIEW_ID_CUSTOMIZED_LOGIN_ACTIVITY); 207 208 setContentView(view); 209 } 210 } 211 } 212