Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
      4 import static junit.framework.Assert.assertFalse;
      5 import static junit.framework.Assert.assertNull;
      6 import static org.hamcrest.CoreMatchers.*;
      7 import static org.junit.Assert.*;
      8 
      9 import java.util.ArrayList;
     10 import java.util.List;
     11 
     12 import org.junit.Test;
     13 import org.junit.runner.RunWith;
     14 
     15 import android.app.Activity;
     16 import android.app.AlertDialog;
     17 import android.content.ContextWrapper;
     18 import android.content.DialogInterface;
     19 import android.view.View;
     20 import android.widget.ArrayAdapter;
     21 import android.widget.Button;
     22 import android.widget.EditText;
     23 
     24 import com.xtremelabs.robolectric.R;
     25 import com.xtremelabs.robolectric.Robolectric;
     26 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
     27 
     28 @RunWith(WithTestDefaultsRunner.class)
     29 public class AlertDialogTest {
     30 
     31     @Test
     32     public void testBuilder() throws Exception {
     33         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(null));
     34         builder.setTitle("title").setMessage("message");
     35         builder.setCancelable(true);
     36         AlertDialog alert = builder.create();
     37         alert.show();
     38 
     39         assertThat(alert.isShowing(), equalTo(true));
     40 
     41         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
     42         assertEquals("title", shadowAlertDialog.getTitle());
     43         assertThat(shadowAlertDialog.getMessage(), equalTo("message"));
     44         assertThat(shadowAlertDialog.isCancelable(), equalTo(true));
     45         assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog()), sameInstance(shadowAlertDialog));
     46         assertThat(ShadowAlertDialog.getLatestAlertDialog(), sameInstance(alert));
     47     }
     48 
     49     @Test
     50     public void getLatestAlertDialog_shouldReturnARealAlertDialog() throws Exception {
     51         assertThat(ShadowAlertDialog.getLatestAlertDialog(), nullValue());
     52 
     53         AlertDialog dialog = new AlertDialog.Builder(new ContextWrapper(null)).show();
     54         assertThat(ShadowAlertDialog.getLatestAlertDialog(), sameInstance(dialog));
     55     }
     56 
     57     @Test
     58     public void shouldOnlyCreateRequestedButtons() throws Exception {
     59         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(null));
     60         builder.setPositiveButton("OK", null);
     61         AlertDialog dialog = builder.create();
     62         dialog.show();
     63         assertThat(shadowOf(dialog).getButton(AlertDialog.BUTTON_POSITIVE), not(nullValue()));
     64         assertThat(shadowOf(dialog).getButton(AlertDialog.BUTTON_NEGATIVE), nullValue());
     65     }
     66 
     67     @Test
     68     public void shouldAllowNullButtonListeners() throws Exception {
     69         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(null));
     70         builder.setPositiveButton("OK", null);
     71         AlertDialog dialog = builder.create();
     72         dialog.show();
     73         Robolectric.clickOn(dialog.getButton(AlertDialog.BUTTON_POSITIVE));
     74     }
     75 
     76     @Test
     77     public void testSetMessageAfterCreation() {
     78         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(null));
     79         builder.setTitle("title").setMessage("message");
     80         AlertDialog alert = builder.create();
     81 
     82         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
     83         assertThat(shadowAlertDialog.getMessage(), equalTo("message"));
     84 
     85         shadowAlertDialog.setMessage("new message");
     86         assertThat(shadowAlertDialog.getMessage(), equalTo("new message"));
     87 
     88         shadowAlertDialog.setMessage(null);
     89         assertThat(shadowAlertDialog.getMessage(), nullValue());
     90     }
     91 
     92     @Test
     93     public void shouldSetMessageFromResourceId() throws Exception {
     94         AlertDialog.Builder builder = new AlertDialog.Builder(new Activity());
     95         builder.setTitle("title").setMessage(R.string.hello);
     96 
     97         AlertDialog alert = builder.create();
     98         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
     99         assertThat(shadowAlertDialog.getMessage(), equalTo("Hello"));
    100     }
    101 
    102     @Test
    103     public void shouldSetView() throws Exception {
    104         ContextWrapper context = new ContextWrapper(null);
    105         AlertDialog.Builder builder = new AlertDialog.Builder(context);
    106         EditText view = new EditText(context);
    107         builder.setView(view);
    108 
    109         AlertDialog alert = builder.create();
    110         assertThat(shadowOf(alert).getView(), equalTo((View) view));
    111     }
    112 
    113     @Test
    114     public void shouldSetCustomTitleView() throws Exception {
    115         ContextWrapper context = new ContextWrapper(null);
    116         AlertDialog.Builder builder = new AlertDialog.Builder(context);
    117         View view = new View(context);
    118         assertThat(builder.setCustomTitle(view), sameInstance(builder));
    119 
    120         AlertDialog alert = builder.create();
    121         assertThat(shadowOf(alert).getCustomTitleView(), equalTo((View) view));
    122     }
    123 
    124     @Test
    125     public void shouldSetThePositiveButtonAfterCreation() throws Exception {
    126         final AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    127             .setPositiveButton("Positive", null).create();
    128 
    129         TestDialogOnClickListener listener = new TestDialogOnClickListener();
    130         alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "More Positive", listener);
    131 
    132         final Button positiveButton = shadowOf(alertDialog).getButton(AlertDialog.BUTTON_POSITIVE);
    133         positiveButton.performClick();
    134 
    135         assertThat(positiveButton.getText().toString(), equalTo("More Positive"));
    136         assertThat(listener.clickedItem, equalTo(AlertDialog.BUTTON_POSITIVE));
    137     }
    138 
    139     @Test
    140     public void shouldSetTheNegativeButtonAfterCreation() throws Exception {
    141         final AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    142             .setNegativeButton("Negative", null).create();
    143 
    144         TestDialogOnClickListener listener = new TestDialogOnClickListener();
    145         alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "More Negative", listener);
    146 
    147         final Button negativeButton = shadowOf(alertDialog).getButton(AlertDialog.BUTTON_NEGATIVE);
    148         negativeButton.performClick();
    149 
    150         assertThat(negativeButton.getText().toString(), equalTo("More Negative"));
    151         assertThat(listener.clickedItem, equalTo(AlertDialog.BUTTON_NEGATIVE));
    152     }
    153 
    154     @Test
    155     public void shouldSetTheNeutralButtonAfterCreation() throws Exception {
    156         final AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    157             .setNegativeButton("Neutral", null).create();
    158 
    159         TestDialogOnClickListener listener = new TestDialogOnClickListener();
    160         alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "Still Neutral", listener);
    161 
    162         final Button neutralButton = shadowOf(alertDialog).getButton(AlertDialog.BUTTON_NEUTRAL);
    163         neutralButton.performClick();
    164 
    165         assertThat(neutralButton.getText().toString(), equalTo("Still Neutral"));
    166         assertThat(listener.clickedItem, equalTo(AlertDialog.BUTTON_NEUTRAL));
    167     }
    168 
    169     @Test
    170     public void clickingPositiveButtonDismissesDialog() throws Exception {
    171         AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    172                 .setPositiveButton("Positive", null).create();
    173         alertDialog.show();
    174 
    175         assertTrue(alertDialog.isShowing());
    176         alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
    177         assertFalse(alertDialog.isShowing());
    178     }
    179 
    180     @Test
    181     public void clickingNeutralButtonDismissesDialog() throws Exception {
    182         AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    183                 .setNeutralButton("Neutral", new DialogInterface.OnClickListener() {
    184                     @Override
    185                     public void onClick(DialogInterface dialog, int which) {
    186                     }
    187                 }).create();
    188         alertDialog.show();
    189 
    190         assertTrue(alertDialog.isShowing());
    191         alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).performClick();
    192         assertFalse(alertDialog.isShowing());
    193     }
    194 
    195     @Test
    196     public void clickingNegativeButtonDismissesDialog() throws Exception {
    197         AlertDialog alertDialog = new AlertDialog.Builder(new ContextWrapper(null))
    198                 .setNegativeButton("Negative", new DialogInterface.OnClickListener() {
    199                     @Override
    200                     public void onClick(DialogInterface dialog, int which) {
    201                     }
    202                 }).create();
    203         alertDialog.show();
    204 
    205         assertTrue(alertDialog.isShowing());
    206         alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick();
    207         assertFalse(alertDialog.isShowing());
    208     }
    209 
    210     @Test
    211     public void testBuilderWithItemArrayViaResourceId() throws Exception {
    212         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(Robolectric.application));
    213 
    214         builder.setTitle("title");
    215         builder.setItems(R.array.alertDialogTestItems, new TestDialogOnClickListener());
    216         AlertDialog alert = builder.create();
    217         alert.show();
    218 
    219         assertThat(alert.isShowing(), equalTo(true));
    220 
    221         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    222         assertThat(shadowAlertDialog.getTitle().toString(), equalTo("title"));
    223         assertThat(shadowAlertDialog.getItems().length, equalTo(2));
    224         assertEquals(shadowAlertDialog.getItems()[0], "Aloha");
    225         assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog()), sameInstance(shadowAlertDialog));
    226         assertThat(ShadowAlertDialog.getLatestAlertDialog(), sameInstance(alert));
    227     }
    228 
    229 
    230 //    @Test
    231 //    public void testBuilderWithItemArrayCanPerformClickOnItem() throws Exception {
    232 //        TestDialogOnClickListener listener = new TestDialogOnClickListener();
    233 //        AlertDialog alert = new AlertDialog.Builder(new ContextWrapper(Robolectric.application))
    234 //                .setItems(R.array.alertDialogTestItems, listener)
    235 //                .create();
    236 //
    237 //        alert.show();
    238 //        ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    239 //        shadowAlertDialog.clickOnItem(1);
    240 //
    241 //
    242 //    }
    243 
    244     @Test
    245     public void testBuilderWithAdapter() throws Exception {
    246         List<Integer> list = new ArrayList<Integer>();
    247         list.add(99);
    248         list.add(88);
    249         list.add(77);
    250         ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(Robolectric.application, R.layout.main, R.id.title, list);
    251 
    252         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(null));
    253         builder.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() {
    254             @Override
    255             public void onClick(DialogInterface dialog, int item) {
    256                 dialog.dismiss();
    257             }
    258         });
    259         AlertDialog alert = builder.create();
    260         alert.show();
    261 
    262         assertTrue(alert.isShowing());
    263         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    264         assertEquals(shadowAlertDialog.getAdapter().getCount(), 3);
    265         assertEquals(shadowAlertDialog.getAdapter().getItem(0), 99);
    266     }
    267 
    268     @Test
    269     public void show_setsLatestAlertDialogAndLatestDialog() {
    270         AlertDialog alertDialog = new AlertDialog.Builder(Robolectric.application).create();
    271         assertNull(ShadowDialog.getLatestDialog());
    272         assertNull(ShadowAlertDialog.getLatestAlertDialog());
    273 
    274         alertDialog.show();
    275 
    276         assertEquals(alertDialog, ShadowDialog.getLatestDialog());
    277         assertEquals(alertDialog, ShadowAlertDialog.getLatestAlertDialog());
    278     }
    279 
    280     @Test
    281     public void shouldReturnTheIndexOfTheCheckedItemInASingleChoiceDialog() throws Exception {
    282         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(Robolectric.application));
    283 
    284         builder.setSingleChoiceItems(new String[]{"foo", "bar"}, 1, new DialogInterface.OnClickListener() {
    285             public void onClick(DialogInterface dialog, int item) {
    286 
    287             }
    288         });
    289         AlertDialog alert = builder.create();
    290         alert.show();
    291 
    292         assertThat(alert.isShowing(), equalTo(true));
    293 
    294         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    295         assertEquals(shadowAlertDialog.getCheckedItemIndex(), 1);
    296         assertEquals(shadowAlertDialog.getItems()[0], "foo");
    297         assertThat(shadowAlertDialog.getItems().length, equalTo(2));
    298         assertThat(ShadowAlertDialog.getLatestAlertDialog(), sameInstance(alert));
    299     }
    300 
    301     @Test
    302     public void shouldCallTheClickListenerOfTheCheckedItemInASingleChoiceDialog() throws Exception {
    303         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(Robolectric.application));
    304 
    305         TestDialogOnClickListener listener = new TestDialogOnClickListener();
    306         builder.setSingleChoiceItems(new String[]{"foo", "bar"}, 1, listener);
    307 
    308         AlertDialog alert = builder.create();
    309         alert.show();
    310 
    311         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    312         shadowAlertDialog.clickOnItem(0);
    313         assertThat(listener.clickedItem, equalTo(0));
    314         assertThat(shadowAlertDialog.getCheckedItemIndex(), equalTo(0));
    315 
    316         shadowAlertDialog.clickOnItem(1);
    317         assertThat(listener.clickedItem, equalTo(1));
    318         assertThat(shadowAlertDialog.getCheckedItemIndex(), equalTo(1));
    319 
    320     }
    321 
    322     @Test
    323     public void shouldCallTheClickListenerOfTheCheckedAdapterInASingleChoiceDialog() throws Exception {
    324         AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(Robolectric.application));
    325 
    326         TestDialogOnClickListener listener = new TestDialogOnClickListener();
    327         List<Integer> list = new ArrayList<Integer>();
    328         list.add(1);
    329         list.add(2);
    330         list.add(3);
    331         ArrayAdapter<Integer> arrayAdapter = new ArrayAdapter<Integer>(Robolectric.application, R.layout.main, R.id.title, list);
    332         builder.setSingleChoiceItems(arrayAdapter, 1, listener);
    333 
    334         AlertDialog alert = builder.create();
    335         alert.show();
    336 
    337         ShadowAlertDialog shadowAlertDialog = shadowOf(alert);
    338         shadowAlertDialog.clickOnItem(0);
    339         assertThat(listener.clickedItem, equalTo(0));
    340         assertThat(shadowAlertDialog.getCheckedItemIndex(), equalTo(0));
    341 
    342         shadowAlertDialog.clickOnItem(1);
    343         assertThat(listener.clickedItem, equalTo(1));
    344         assertThat(shadowAlertDialog.getCheckedItemIndex(), equalTo(1));
    345 
    346     }
    347 
    348     @Test
    349     public void shouldFindViewsByIdIfAViewIsSet() throws Exception {
    350         ContextWrapper context = new ContextWrapper(null);
    351         AlertDialog dialog = new AlertDialog.Builder(context).create();
    352 
    353         assertThat(dialog.findViewById(99), nullValue());
    354 
    355         View view = new View(context);
    356         view.setId(99);
    357         dialog.setView(view);
    358         assertThat(dialog.findViewById(99), sameInstance(view));
    359 
    360         assertThat(dialog.findViewById(66), nullValue());
    361     }
    362 
    363     @Test
    364     public void shouldDelegateToDialogFindViewByIdIfViewIsNull() {
    365         AlertDialog dialog = new AlertDialog(Robolectric.application) {
    366         };
    367 
    368         assertThat(dialog.findViewById(99), nullValue());
    369 
    370         dialog.setContentView(R.layout.main);
    371         assertNotNull(dialog.findViewById(R.id.title));
    372     }
    373 
    374 
    375     private static class TestDialogOnClickListener implements DialogInterface.OnClickListener {
    376         private DialogInterface dialog;
    377         private int clickedItem;
    378 
    379         public void onClick(DialogInterface dialog, int item) {
    380             this.dialog = dialog;
    381             this.clickedItem = item;
    382         }
    383     }
    384 }
    385