package roboguice.fragment.provided; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; 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 roboguice.activity.RoboActivity; import roboguice.inject.InjectView; import com.google.inject.Inject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @RunWith(RobolectricTestRunner.class) @Config(shadows= {roboguice.fragment.provided.shadow.ShadowNativeFragment.class, roboguice.fragment.provided.shadow.ShadowNativeFragmentActivity.class}) public class FragmentInjectionTest { @Test public void shadowActivityGetApplicationContextShouldNotReturnNull() { assertNotNull(new Activity().getApplicationContext()); } @Test public void shouldInjectPojosAndViewsIntoFragments() { final ActivityA activity = Robolectric.buildActivity(ActivityA.class).create().start().resume().get(); activity.fragmentRef.onViewCreated(activity.fragmentRef.onCreateView(null,null,null), null); assertNotNull(activity.fragmentRef.ref); assertThat(activity.fragmentRef.v, equalTo(activity.fragmentRef.ref)); assertThat(activity.fragmentRef.context,equalTo((Context)activity)); } @Test public void shouldBeAbleToInjectViewsIntoActivityAndFragment() { final ActivityB activity = Robolectric.buildActivity(ActivityB.class).create().get(); activity.fragmentRef.onViewCreated(activity.fragmentRef.onCreateView(null,null,null), null); assertNotNull(activity.fragmentRef.viewRef); assertNotNull(activity.viewRef); assertThat(activity.fragmentRef.v, equalTo(activity.fragmentRef.viewRef)); assertThat(activity.v, equalTo(activity.viewRef)); } @Test(expected = NullPointerException.class) public void shouldNotBeAbleToInjectFragmentViewsIntoActivity() { final ActivityC activity = new ActivityC(); activity.onCreate(null); activity.fragmentRef.onViewCreated(activity.fragmentRef.onCreateView(null,null,null), null); } @Test public void shouldNotCrashWhenRotatingScreen() { final ActivityController<ActivityD> activityD1Controller = Robolectric.buildActivity(ActivityD.class).create().resume(); final ActivityD activity1 = activityD1Controller.get(); final ActivityController<ActivityD> activityD2Controller = Robolectric.buildActivity(ActivityD.class); final ActivityD activity2 = activityD2Controller.get(); activity1.fragmentRef.onViewCreated(activity1.fragmentRef.onCreateView(null,null,null), null); assertNotNull(activity1.fragmentRef.ref); assertThat(activity1.fragmentRef.v, equalTo(activity1.fragmentRef.ref)); activityD1Controller.pause(); activityD2Controller.create().resume(); activity2.fragmentRef.onViewCreated(activity2.fragmentRef.onCreateView(null,null,null), null); assertNotNull(activity2.fragmentRef.ref); assertThat(activity2.fragmentRef.v, equalTo(activity2.fragmentRef.ref)); } public static class ActivityA extends RoboActivity { FragmentA fragmentRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fragmentRef = new FragmentA(); fragmentRef.onAttach(this); fragmentRef.onCreate(null); } public static class FragmentA extends RoboFragment { @InjectView(101) View v; @Inject Context context; View ref; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ref = new View(getActivity()); ref.setId(101); return ref; } } } public static class ActivityB extends RoboActivity { @InjectView(100) View v; View viewRef; FragmentB fragmentRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewRef = new View(this); viewRef.setId(100); setContentView(viewRef); fragmentRef = new FragmentB(); fragmentRef.onAttach(this); fragmentRef.onCreate(null); } public static class FragmentB extends RoboFragment { @InjectView(101) View v; View viewRef; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewRef = new View(getActivity()); viewRef.setId(101); return viewRef; } } } public static class ActivityC extends RoboActivity { @InjectView(101) View v; View viewRef; FragmentC fragmentRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( new View(this) ); fragmentRef = new FragmentC(); fragmentRef.onAttach(this); fragmentRef.onCreate(null); } public static class FragmentC extends RoboFragment { @InjectView(101) View v; View viewRef; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewRef = new View(getActivity()); viewRef.setId(101); return viewRef; } } } public static class ActivityD extends RoboActivity { FragmentD fragmentRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fragmentRef = new FragmentD(); fragmentRef.onAttach(this); fragmentRef.onCreate(null); setContentView(new FrameLayout(this)); } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { super.onResume(); } public static class FragmentD extends RoboFragment { @InjectView(101) View v; View ref; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ref = new View(getActivity()); ref.setId(101); return ref; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } } }