1package com.xtremelabs.robolectric.shadows;
2
3import android.app.Activity;
4import android.app.ProgressDialog;
5import android.content.Context;
6import android.content.DialogInterface;
7import com.xtremelabs.robolectric.Robolectric;
8import com.xtremelabs.robolectric.WithTestDefaultsRunner;
9import org.junit.Before;
10import org.junit.Test;
11import org.junit.runner.RunWith;
12
13import java.util.concurrent.Callable;
14
15import static com.xtremelabs.robolectric.Robolectric.shadowOf;
16import static junit.framework.Assert.assertNull;
17import static org.hamcrest.CoreMatchers.instanceOf;
18import static org.hamcrest.CoreMatchers.nullValue;
19import static org.hamcrest.core.Is.is;
20import static org.hamcrest.core.IsEqual.equalTo;
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertNotNull;
23import static org.junit.Assert.assertThat;
24import static org.junit.Assert.assertTrue;
25
26@RunWith(WithTestDefaultsRunner.class)
27public class ProgressDialogTest {
28
29    private ProgressDialog dialog;
30    private ShadowProgressDialog shadow;
31
32    @Before
33    public void setUp() {
34        dialog = new ProgressDialog(null);
35        shadow = Robolectric.shadowOf(dialog);
36    }
37
38    @Test
39    public void shouldExtendAlertDialog() {
40        assertThat(shadow, instanceOf(ShadowAlertDialog.class));
41    }
42
43    @Test
44    public void shouldSetMessage() {
45        CharSequence message = "This is only a test";
46
47        assertThat(shadow.getMessage(), nullValue());
48        dialog.setMessage(message);
49        assertThat((CharSequence) shadow.getMessage(), equalTo(message));
50    }
51
52    @Test
53    public void shouldSetIndeterminate() {
54        assertThat(dialog.isIndeterminate(), equalTo(false));
55
56        dialog.setIndeterminate(true);
57        assertThat(dialog.isIndeterminate(), equalTo(true));
58
59        dialog.setIndeterminate(false);
60        assertThat(dialog.isIndeterminate(), equalTo(false));
61    }
62
63    @Test
64    public void show_shouldCreateAProgressDialog() {
65        Context context = new Activity();
66        TestOnCancelListener cancelListener = new TestOnCancelListener();
67        ProgressDialog progressDialog = ProgressDialog.show(context, "Title", "Message", true, true, cancelListener);
68        ShadowProgressDialog shadowProgressDialog = shadowOf(progressDialog);
69        assertThat(shadowProgressDialog.getContext(), is(context));
70        assertThat(shadowProgressDialog.getMessage(), equalTo("Message"));
71        assertTrue(shadowProgressDialog.isIndeterminate());
72        assertTrue(shadowProgressDialog.isCancelable());
73
74        progressDialog.cancel();
75        assertThat(cancelListener.onCancelDialogInterface, is((DialogInterface) progressDialog));
76    }
77
78    @Test
79    public void show_setsLatestAlertDialogAndLatestDialog_3args() throws Exception{
80        assertLatestDialogsSet("Title", "Message", false, false, null, new Callable<ProgressDialog>() {
81            @Override
82            public ProgressDialog call() throws Exception {
83                return ProgressDialog.show(Robolectric.application, "Title", "Message");
84            }
85        }
86        );
87    }
88
89    @Test
90    public void show_setsLatestAlertDialogAndLatestDialog_4args() throws Exception{
91        assertLatestDialogsSet("Title", "Message", true, false, null, new Callable<ProgressDialog>() {
92            @Override
93            public ProgressDialog call() throws Exception {
94                return ProgressDialog.show(Robolectric.application, "Title", "Message", true);
95            }
96        });
97    }
98
99    @Test
100    public void show_setsLatestAlertDialogAndLatestDialog_5args() throws Exception{
101        assertLatestDialogsSet("Title", "Message", true, true, null, new Callable<ProgressDialog>() {
102            @Override
103            public ProgressDialog call() throws Exception {
104                return ProgressDialog.show(Robolectric.application, "Title", "Message", true, true);
105            }
106        });
107    }
108
109    @Test
110    public void show_setsLatestAlertDialogAndLatestDialog_6args() throws Exception{
111        final DialogInterface.OnCancelListener cancelListener = new DialogInterface.OnCancelListener() {
112            @Override
113            public void onCancel(DialogInterface dialog) {
114            }
115        };
116
117        assertLatestDialogsSet("Title", "Message", true, true, cancelListener, new Callable<ProgressDialog>() {
118            @Override
119            public ProgressDialog call() throws Exception {
120                return ProgressDialog.show(Robolectric.application, "Title", "Message", true, true, cancelListener);
121            }
122        });
123    }
124
125    private void assertLatestDialogsSet(CharSequence expectedTitle, CharSequence expectedMessage, boolean expectedIndeterminate,
126            boolean expectedCancelable, DialogInterface.OnCancelListener expectedCancelListener,
127            Callable<ProgressDialog> callable) throws Exception {
128        assertNull(ShadowDialog.getLatestDialog());
129        assertNull(ShadowAlertDialog.getLatestAlertDialog());
130
131        dialog = callable.call();
132
133        assertNotNull(dialog);
134        assertEquals(dialog, ShadowDialog.getLatestDialog());
135        assertEquals(dialog, ShadowAlertDialog.getLatestAlertDialog());
136
137        assertEquals(expectedIndeterminate, dialog.isIndeterminate());
138        assertEquals(expectedMessage, shadowOf(dialog).getMessage());
139        assertEquals(expectedTitle, shadowOf(dialog).getTitle());
140        assertEquals(expectedCancelable, shadowOf(dialog).isCancelable());
141        assertEquals(expectedCancelListener, shadowOf(dialog).getOnCancelListener());
142    }
143
144    private static class TestOnCancelListener implements DialogInterface.OnCancelListener {
145        public DialogInterface onCancelDialogInterface;
146
147        @Override
148        public void onCancel(DialogInterface dialogInterface) {
149            onCancelDialogInterface = dialogInterface;
150
151        }
152    }
153}
154