1package com.xtremelabs.robolectric.shadows;
2
3import android.app.Dialog;
4import android.content.DialogInterface;
5import android.os.Bundle;
6import android.widget.TextView;
7import com.xtremelabs.robolectric.R;
8import com.xtremelabs.robolectric.Robolectric;
9import com.xtremelabs.robolectric.WithTestDefaultsRunner;
10import com.xtremelabs.robolectric.util.Transcript;
11import org.junit.Test;
12import org.junit.runner.RunWith;
13
14import static com.xtremelabs.robolectric.util.TestUtil.assertInstanceOf;
15import static junit.framework.Assert.*;
16import static org.hamcrest.CoreMatchers.nullValue;
17import static org.hamcrest.CoreMatchers.sameInstance;
18import static org.hamcrest.core.IsEqual.equalTo;
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertThat;
21
22@RunWith(WithTestDefaultsRunner.class)
23public class DialogTest {
24	@Test
25    public void shouldCallOnDismissListener() throws Exception {
26        final Transcript transcript = new Transcript();
27
28        final Dialog dialog = new Dialog(null);
29        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
30            @Override
31            public void onDismiss(DialogInterface dialogInListener) {
32                assertThat((Dialog) dialogInListener, sameInstance(dialog));
33                transcript.add("onDismiss called!");
34            }
35        });
36
37        dialog.dismiss();
38
39        transcript.assertEventsSoFar("onDismiss called!");
40    }
41
42    @Test
43    public void shouldGetLayoutInflater() {
44        Dialog dialog = new Dialog(Robolectric.application);
45        assertNotNull(dialog.getLayoutInflater());
46    }
47
48    @Test
49    public void shouldCallOnStartFromShow() {
50        TestDialog dialog = new TestDialog();
51        dialog.show();
52
53        assertTrue(dialog.onStartCalled);
54    }
55
56    @Test
57    public void shouldSetCancelable() {
58        Dialog dialog = new Dialog(null);
59        ShadowDialog shadow = Robolectric.shadowOf(dialog);
60
61        dialog.setCancelable(false);
62        assertThat(shadow.isCancelable(), equalTo(false));
63    }
64
65    @Test
66    public void shouldDismissTheRealDialogWhenCancelled() throws Exception {
67        TestDialog dialog = new TestDialog();
68        dialog.cancel();
69        assertThat(dialog.wasDismissed, equalTo(true));
70    }
71
72    @Test
73    public void shouldDefaultCancelableToTrueAsTheSDKDoes() throws Exception {
74        Dialog dialog = new Dialog(null);
75        ShadowDialog shadow = Robolectric.shadowOf(dialog);
76
77        assertThat(shadow.isCancelable(), equalTo(true));
78    }
79
80    @Test
81    public void shouldOnlyCallOnCreateOnce() {
82        final Transcript transcript = new Transcript();
83
84        Dialog dialog = new Dialog(Robolectric.application) {
85            @Override
86            protected void onCreate(Bundle savedInstanceState) {
87                super.onCreate(savedInstanceState);
88                transcript.add("onCreate called");
89            }
90        };
91
92        dialog.show();
93        transcript.assertEventsSoFar("onCreate called");
94
95        dialog.dismiss();
96        dialog.show();
97        transcript.assertNoEventsSoFar();
98    }
99
100    @Test
101    public void show_setsLatestDialog() {
102        Dialog dialog = new Dialog(Robolectric.application);
103        assertNull(ShadowDialog.getLatestDialog());
104
105        dialog.show();
106
107        assertEquals(dialog, ShadowDialog.getLatestDialog());
108        assertNull(ShadowAlertDialog.getLatestAlertDialog());
109    }
110
111    @Test
112    public void getLatestDialog_shouldReturnARealDialog() throws Exception {
113        assertThat(ShadowDialog.getLatestDialog(), nullValue());
114
115        Dialog dialog = new Dialog(null);
116        dialog.show();
117        assertThat(ShadowDialog.getLatestDialog(), sameInstance(dialog));
118    }
119
120    @Test
121    public void shouldKeepListOfOpenedDialogs() throws Exception {
122        assertEquals(0, ShadowDialog.getShownDialogs().size());
123
124        TestDialog dialog = new TestDialog();
125        dialog.show();
126
127        assertEquals(1, ShadowDialog.getShownDialogs().size());
128        assertEquals(dialog, ShadowDialog.getShownDialogs().get(0));
129
130        TestDialog dialog2 = new TestDialog();
131        dialog2.show();
132
133        assertEquals(2, ShadowDialog.getShownDialogs().size());
134        assertEquals(dialog2, ShadowDialog.getShownDialogs().get(1));
135
136        dialog.dismiss();
137
138        assertEquals(2, ShadowDialog.getShownDialogs().size());
139
140        ShadowDialog.reset();
141
142        assertEquals(0, ShadowDialog.getShownDialogs().size());
143    }
144
145    @Test
146    public void shouldPopulateListOfRecentDialogsInCorrectOrder() throws Exception {
147        new NestingTestDialog().show();
148
149        assertEquals(TestDialog.class, ShadowDialog.getLatestDialog().getClass());
150    }
151
152    @Test
153    public void shouldFindViewsWithinAContentViewThatWasPreviouslySet() throws Exception {
154        Dialog dialog = new Dialog(Robolectric.application);
155        dialog.setContentView(dialog.getLayoutInflater().inflate(R.layout.main, null));
156        assertInstanceOf(TextView.class, dialog.findViewById(R.id.title));
157    }
158
159    private static class TestDialog extends Dialog {
160        boolean onStartCalled = false;
161        boolean wasDismissed =  false;
162
163        public TestDialog() {
164            super(null);
165        }
166
167        @Override
168        protected void onStart() {
169            onStartCalled = true;
170        }
171
172        @Override public void dismiss() {
173            super.dismiss();
174            wasDismissed = true;
175        }
176    }
177
178    private static class NestingTestDialog extends Dialog {
179        public NestingTestDialog() {
180            super(null);
181        };
182
183        @Override
184        protected void onCreate(Bundle savedInstanceState) {
185            super.onCreate(savedInstanceState);
186            new TestDialog().show();
187        }
188    }
189}
190