1package com.xtremelabs.robolectric.shadows; 2 3import android.app.Activity; 4import android.app.Dialog; 5import android.os.Bundle; 6import android.support.v4.app.DialogFragment; 7import android.support.v4.app.FragmentActivity; 8import android.support.v4.app.FragmentTransaction; 9import android.view.LayoutInflater; 10import android.view.View; 11import android.view.ViewGroup; 12import com.xtremelabs.robolectric.R; 13import com.xtremelabs.robolectric.WithTestDefaultsRunner; 14import com.xtremelabs.robolectric.tester.android.util.TestFragmentManager; 15import com.xtremelabs.robolectric.util.Transcript; 16import org.junit.Before; 17import org.junit.Test; 18import org.junit.runner.RunWith; 19 20import static com.xtremelabs.robolectric.Robolectric.shadowOf; 21import static org.junit.Assert.*; 22 23@RunWith(WithTestDefaultsRunner.class) 24public class DialogFragmentTest { 25 26 private FragmentActivity activity; 27 private TestDialogFragment dialogFragment; 28 private TestFragmentManager fragmentManager; 29 30 @Before 31 public void setUp() throws Exception { 32 activity = new FragmentActivity(); 33 dialogFragment = new TestDialogFragment(); 34 fragmentManager = new TestFragmentManager(activity); 35 } 36 37 @Test 38 public void show_shouldCallLifecycleMethods() throws Exception { 39 dialogFragment.show(fragmentManager, "this is a tag"); 40 41 dialogFragment.transcript.assertEventsSoFar( 42 "onAttach", 43 "onCreate", 44 "onCreateDialog", 45 "onCreateView", 46 "onViewCreated", 47 "onActivityCreated", 48 "onStart", 49 "onResume" 50 ); 51 52 assertNotNull(dialogFragment.getActivity()); 53 assertSame(activity, dialogFragment.onAttachActivity); 54 } 55 56 @Test 57 public void show_whenPassedATransaction_shouldCallShowWithManager() throws Exception { 58 dialogFragment.show(fragmentManager.beginTransaction(), "this is a tag"); 59 60 dialogFragment.transcript.assertEventsSoFar( 61 "onAttach", 62 "onCreate", 63 "onCreateDialog", 64 "onCreateView", 65 "onViewCreated", 66 "onActivityCreated", 67 "onStart", 68 "onResume" 69 ); 70 71 assertNotNull(dialogFragment.getActivity()); 72 assertSame(activity, dialogFragment.onAttachActivity); 73 } 74 75 @Test 76 public void show_shouldShowDialogThatWasReturnedFromOnCreateDialog_whenOnCreateDialogReturnsADialog() throws Exception { 77 Dialog dialogFromOnCreateDialog = new Dialog(activity); 78 dialogFragment.returnThisDialogFromOnCreateDialog(dialogFromOnCreateDialog); 79 dialogFragment.show(fragmentManager, "this is a tag"); 80 81 Dialog dialog = ShadowDialog.getLatestDialog(); 82 assertSame(dialogFromOnCreateDialog, dialog); 83 assertSame(dialogFromOnCreateDialog, dialogFragment.getDialog()); 84 assertSame(dialogFragment, fragmentManager.findFragmentByTag("this is a tag")); 85 } 86 87 @Test 88 public void show_shouldShowDialogThatWasAutomaticallyCreated_whenOnCreateDialogReturnsNull() throws Exception { 89 dialogFragment.show(fragmentManager, "this is a tag"); 90 91 Dialog dialog = ShadowDialog.getLatestDialog(); 92 assertNotNull(dialog); 93 assertSame(dialog, dialogFragment.getDialog()); 94 assertNotNull(dialog.findViewById(R.id.title)); 95 assertSame(dialogFragment, fragmentManager.findFragmentByTag("this is a tag")); 96 } 97 98 @Test 99 public void dismiss_shouldDismissTheDialog() throws Exception { 100 dialogFragment.show(fragmentManager, "tag"); 101 102 dialogFragment.dismiss(); 103 104 Dialog dialog = ShadowDialog.getLatestDialog(); 105 assertFalse(dialog.isShowing()); 106 assertTrue(shadowOf(dialog).hasBeenDismissed()); 107 } 108 109 @Test 110 public void removeUsingTransaction_shouldDismissTheDialog() throws Exception { 111 dialogFragment.show(fragmentManager, null); 112 113 FragmentTransaction t = fragmentManager.beginTransaction(); 114 t.remove(dialogFragment); 115 t.commit(); 116 117 Dialog dialog = ShadowDialog.getLatestDialog(); 118 assertFalse(dialog.isShowing()); 119 assertTrue(shadowOf(dialog).hasBeenDismissed()); 120 } 121 122 @Test 123 public void shouldDefaultToCancelable() throws Exception { 124 DialogFragment dialogFragment = new DialogFragment(); 125 126 assertTrue(dialogFragment.isCancelable()); 127 } 128 129 @Test 130 public void shouldStoreCancelable() throws Exception { 131 DialogFragment dialogFragment = new DialogFragment(); 132 133 dialogFragment.setCancelable(false); 134 135 assertFalse(dialogFragment.isCancelable()); 136 } 137 138 @Test 139 public void shouldSetCancelableOnDialog() throws Exception { 140 DialogFragment dialogFragment = new DialogFragment(); 141 dialogFragment.show(fragmentManager, "TAG"); 142 143 Dialog dialog = dialogFragment.getDialog(); 144 145 assertTrue(shadowOf(dialog).isCancelable()); 146 } 147 148 @Test 149 public void shouldSetNotCancelableOnDialogBeforeShow() throws Exception { 150 DialogFragment dialogFragment = new DialogFragment(); 151 dialogFragment.setCancelable(false); 152 dialogFragment.show(fragmentManager, "TAG"); 153 154 Dialog dialog = dialogFragment.getDialog(); 155 156 assertFalse(shadowOf(dialog).isCancelable()); 157 } 158 159 @Test 160 public void shouldSetNotCancelableOnDialogAfterShow() throws Exception { 161 DialogFragment dialogFragment = new DialogFragment(); 162 dialogFragment.show(fragmentManager, "TAG"); 163 dialogFragment.setCancelable(false); 164 165 Dialog dialog = dialogFragment.getDialog(); 166 167 assertFalse(shadowOf(dialog).isCancelable()); 168 } 169 170 private class TestDialogFragment extends DialogFragment { 171 final Transcript transcript = new Transcript(); 172 Activity onAttachActivity; 173 private Dialog returnThisDialogFromOnCreateDialog; 174 175 @Override 176 public void onAttach(Activity activity) { 177 transcript.add("onAttach"); 178 onAttachActivity = activity; 179 super.onAttach(activity); 180 } 181 182 @Override 183 public void onCreate(Bundle savedInstanceState) { 184 transcript.add("onCreate"); 185 } 186 187 @Override 188 public Dialog onCreateDialog(Bundle savedInstanceState) { 189 transcript.add("onCreateDialog"); 190 return returnThisDialogFromOnCreateDialog; 191 } 192 193 @Override 194 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 195 transcript.add("onCreateView"); 196 return inflater.inflate(R.layout.main, null); 197 } 198 199 @Override 200 public void onViewCreated(View view, Bundle savedInstanceState) { 201 transcript.add("onViewCreated"); 202 super.onViewCreated(view, savedInstanceState); 203 } 204 205 @Override 206 public void onActivityCreated(Bundle savedInstanceState) { 207 transcript.add("onActivityCreated"); 208 super.onActivityCreated(savedInstanceState); 209 } 210 211 @Override 212 public void onStart() { 213 transcript.add("onStart"); 214 super.onStart(); 215 } 216 217 @Override 218 public void onResume() { 219 transcript.add("onResume"); 220 super.onResume(); 221 } 222 223 public void returnThisDialogFromOnCreateDialog(Dialog dialog) { 224 returnThisDialogFromOnCreateDialog = dialog; 225 } 226 } 227} 228