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