package roboguice.fragment;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ActivityController;
import roboguice.RoboGuice;
import roboguice.activity.RoboFragmentActivity;
import roboguice.inject.InjectView;
import com.google.inject.Inject;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@RunWith(RobolectricTestRunner.class)
public class FragmentInjectionTest {
// http://stackoverflow.com/questions/11333354/how-can-i-test-fragments-with-robolectric
protected static void startFragment( FragmentActivity activity, Fragment fragment ) {
final FragmentManager fragmentManager = activity.getSupportFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(fragment, null);
fragmentTransaction.commit();
}
@Test
public void shouldInjectPojosAndViewsIntoFragments() {
final ActivityA activityA = Robolectric.buildActivity(ActivityA.class).create().start().resume().get();
assertNotNull(activityA.fragmentRef.ref);
assertThat(activityA.fragmentRef.v, equalTo(activityA.fragmentRef.ref));
assertThat(activityA.fragmentRef.context,equalTo((Context)activityA));
}
@Test
public void shouldBeAbleToInjectViewsIntoActivityAndFragment() {
final ActivityB activityB = Robolectric.buildActivity(ActivityB.class).create().start().resume().get();
assertNotNull(activityB.fragmentRef.viewRef);
assertNotNull(activityB.viewRef);
assertThat(activityB.fragmentRef.v, equalTo(activityB.fragmentRef.viewRef));
assertThat(activityB.v, equalTo(activityB.viewRef));
}
@Test(expected = NullPointerException.class)
public void shouldNotBeAbleToInjectFragmentViewsIntoActivity() {
Robolectric.buildActivity(ActivityC.class).create().start().resume().get();
}
@Test
public void shouldNotCrashWhenRotatingScreen() {
final ActivityController<ActivityD> activityD1Controller = Robolectric.buildActivity(ActivityD.class).create().resume();
final ActivityD activityD1 = activityD1Controller.get();
final ActivityController<ActivityD> activityD2Controller = Robolectric.buildActivity(ActivityD.class);
final ActivityD activityD2 = activityD2Controller.get();
assertNotNull(activityD1.fragmentRef.ref);
assertThat(activityD1.fragmentRef.v, equalTo(activityD1.fragmentRef.ref));
activityD1Controller.pause();
activityD2Controller.create().resume();
assertNotNull(activityD2.fragmentRef.ref);
assertThat(activityD2.fragmentRef.v, equalTo(activityD2.fragmentRef.ref));
}
public static class ActivityA extends RoboFragmentActivity {
FragmentA fragmentRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// fragmentRef = new FragmentA();
// fragmentRef.onAttach(this);
// fragmentRef.onCreate(null);
fragmentRef = new FragmentA();
startFragment(this, fragmentRef);
}
public static class FragmentA extends RoboFragment {
@InjectView(101) View v;
@Inject Context context;
View ref;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ref = new View(getActivity());
ref.setId(101);
return ref;
}
}
}
public static class ActivityB extends RoboFragmentActivity {
@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();
startFragment(this, fragmentRef);
}
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 RoboFragmentActivity {
@InjectView(101) View v;
View viewRef;
FragmentC fragmentRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( new View(this) );
fragmentRef = new FragmentC();
startFragment(this, fragmentRef);
}
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 RoboFragmentActivity {
FragmentD fragmentRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentRef = new FragmentD();
startFragment(this,fragmentRef);
setContentView(new FrameLayout(this));
}
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;
}
}
}
}