package org.robolectric.shadows.support.v4; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; 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 org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.R; import org.robolectric.Robolectric; import org.robolectric.internal.ShadowExtractor; import org.robolectric.shadows.ShadowDialog; import org.robolectric.util.TestRunnerWithManifest; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @RunWith(TestRunnerWithManifest.class) public class ShadowDialogFragmentTest { private FragmentActivity activity; private TestDialogFragment dialogFragment; private FragmentManager fragmentManager; @Before public void setUp() throws Exception { activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get(); fragmentManager = activity.getSupportFragmentManager(); dialogFragment = new TestDialogFragment(); } @Test public void show_shouldCallLifecycleMethods() throws Exception { dialogFragment.show(fragmentManager, "this is a tag"); assertThat(dialogFragment.transcript).containsExactly( "onAttach", "onCreate", "onCreateDialog", "onCreateView", "onViewCreated", "onActivityCreated", "onStart", "onResume" ); assertNotNull(dialogFragment.getActivity()); assertSame(activity, dialogFragment.onAttachActivity); } @Test public void show_whenPassedATransaction_shouldCallShowWithManager() throws Exception { dialogFragment.show(fragmentManager.beginTransaction(), "this is a tag"); assertThat(dialogFragment.transcript).containsExactly( "onAttach", "onCreate", "onCreateDialog", "onCreateView", "onViewCreated", "onActivityCreated", "onStart", "onResume" ); assertNotNull(dialogFragment.getActivity()); assertSame(activity, dialogFragment.onAttachActivity); } @Test public void show_shouldShowDialogThatWasReturnedFromOnCreateDialog_whenOnCreateDialogReturnsADialog() throws Exception { Dialog dialogFromOnCreateDialog = new Dialog(activity); dialogFragment.returnThisDialogFromOnCreateDialog(dialogFromOnCreateDialog); dialogFragment.show(fragmentManager, "this is a tag"); Dialog dialog = ShadowDialog.getLatestDialog(); assertSame(dialogFromOnCreateDialog, dialog); assertSame(dialogFromOnCreateDialog, dialogFragment.getDialog()); assertSame(dialogFragment, fragmentManager.findFragmentByTag("this is a tag")); } @Test public void show_shouldShowDialogThatWasAutomaticallyCreated_whenOnCreateDialogReturnsNull() throws Exception { dialogFragment.show(fragmentManager, "this is a tag"); Dialog dialog = ShadowDialog.getLatestDialog(); assertNotNull(dialog); assertSame(dialog, dialogFragment.getDialog()); assertNotNull(dialog.findViewById(R.id.title)); assertSame(dialogFragment, fragmentManager.findFragmentByTag("this is a tag")); } @Test public void removeUsingTransaction_shouldDismissTheDialog() throws Exception { dialogFragment.show(fragmentManager, null); FragmentTransaction t = fragmentManager.beginTransaction(); t.remove(dialogFragment); t.commit(); Dialog dialog = ShadowDialog.getLatestDialog(); assertFalse(dialog.isShowing()); assertTrue(shadowOf(dialog).hasBeenDismissed()); } public static class TestDialogFragment extends DialogFragment { final List<String> transcript = new ArrayList<>(); Activity onAttachActivity; private Dialog returnThisDialogFromOnCreateDialog; @Override public void onAttach(Activity activity) { transcript.add("onAttach"); onAttachActivity = activity; super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { transcript.add("onCreate"); super.onCreate(savedInstanceState); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { transcript.add("onCreateDialog"); return returnThisDialogFromOnCreateDialog == null ? super.onCreateDialog(savedInstanceState) : returnThisDialogFromOnCreateDialog; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { transcript.add("onCreateView"); return inflater.inflate(R.layout.dialog_fragment, null); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { transcript.add("onViewCreated"); super.onViewCreated(view, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { transcript.add("onActivityCreated"); super.onActivityCreated(savedInstanceState); } @Override public void onStart() { transcript.add("onStart"); super.onStart(); } @Override public void onResume() { transcript.add("onResume"); super.onResume(); } public void returnThisDialogFromOnCreateDialog(Dialog dialog) { returnThisDialogFromOnCreateDialog = dialog; } } private static ShadowDialog shadowOf(Dialog dialog) { return (ShadowDialog) ShadowExtractor.extract(dialog); } }