Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 import static android.os.Build.VERSION_CODES.KITKAT;
      4 import static org.assertj.core.api.Assertions.assertThat;
      5 import static org.junit.Assert.assertEquals;
      6 import static org.junit.Assert.assertNotNull;
      7 import static org.junit.Assert.assertNull;
      8 import static org.junit.Assert.assertSame;
      9 import static org.junit.Assert.assertTrue;
     10 import static org.robolectric.Shadows.shadowOf;
     11 
     12 import android.app.Dialog;
     13 import android.content.Context;
     14 import android.content.DialogInterface;
     15 import android.os.Bundle;
     16 import android.view.View;
     17 import android.widget.TextView;
     18 import java.util.ArrayList;
     19 import java.util.List;
     20 import org.junit.Test;
     21 import org.junit.runner.RunWith;
     22 import org.robolectric.R;
     23 import org.robolectric.RobolectricTestRunner;
     24 import org.robolectric.RuntimeEnvironment;
     25 import org.robolectric.annotation.Config;
     26 
     27 @RunWith(RobolectricTestRunner.class)
     28 public class ShadowDialogTest {
     29   @Test
     30   public void shouldCallOnDismissListener() throws Exception {
     31     final List<String> transcript = new ArrayList<>();
     32 
     33     final Dialog dialog = new Dialog(RuntimeEnvironment.application);
     34     dialog.show();
     35     dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
     36       @Override
     37       public void onDismiss(DialogInterface dialogInListener) {
     38         assertThat((Dialog) dialogInListener).isSameAs(dialog);
     39         transcript.add("onDismiss called!");
     40       }
     41     });
     42 
     43     dialog.dismiss();
     44 
     45     assertThat(transcript).containsExactly("onDismiss called!");
     46   }
     47 
     48   @Test
     49   public void setContentViewWithViewAllowsFindById() throws Exception {
     50     final int viewId = 1234;
     51     Context context = RuntimeEnvironment.application;
     52     final Dialog dialog = new Dialog(context);
     53     final View view = new View(context);
     54     view.setId(viewId);
     55     dialog.setContentView(view);
     56 
     57     assertSame(view, dialog.findViewById(viewId));
     58   }
     59 
     60   @Test
     61   public void shouldGetLayoutInflater() {
     62     Dialog dialog = new Dialog(RuntimeEnvironment.application);
     63     assertNotNull(dialog.getLayoutInflater());
     64   }
     65 
     66   @Test
     67   public void shouldCallOnStartFromShow() {
     68     TestDialog dialog = new TestDialog(RuntimeEnvironment.application);
     69     dialog.show();
     70 
     71     assertTrue(dialog.onStartCalled);
     72   }
     73 
     74   @Test
     75   public void shouldSetCancelable() {
     76     Dialog dialog = new Dialog(RuntimeEnvironment.application);
     77     ShadowDialog shadow = shadowOf(dialog);
     78 
     79     dialog.setCancelable(false);
     80     assertThat(shadow.isCancelable()).isFalse();
     81   }
     82 
     83   @Test
     84   public void shouldDismissTheRealDialogWhenCancelled() throws Exception {
     85     TestDialog dialog = new TestDialog(RuntimeEnvironment.application);
     86     dialog.cancel();
     87     assertThat(dialog.wasDismissed).isTrue();
     88   }
     89 
     90   @Test
     91   public void shouldDefaultCancelableToTrueAsTheSDKDoes() throws Exception {
     92     Dialog dialog = new Dialog(RuntimeEnvironment.application);
     93     ShadowDialog shadow = shadowOf(dialog);
     94 
     95     assertThat(shadow.isCancelable()).isTrue();
     96   }
     97 
     98   @Test
     99   public void shouldOnlyCallOnCreateOnce() {
    100     final List<String> transcript = new ArrayList<>();
    101 
    102     Dialog dialog = new Dialog(RuntimeEnvironment.application) {
    103       @Override
    104       protected void onCreate(Bundle savedInstanceState) {
    105         super.onCreate(savedInstanceState);
    106         transcript.add("onCreate called");
    107       }
    108     };
    109 
    110     dialog.show();
    111     assertThat(transcript).containsExactly("onCreate called");
    112     transcript.clear();
    113 
    114     dialog.dismiss();
    115     dialog.show();
    116     assertThat(transcript).isEmpty();
    117   }
    118 
    119   @Test
    120   public void show_setsLatestDialog() {
    121     Dialog dialog = new Dialog(RuntimeEnvironment.application);
    122     assertNull(ShadowDialog.getLatestDialog());
    123 
    124     dialog.show();
    125 
    126     assertSame(dialog, ShadowDialog.getLatestDialog());
    127     assertNull(ShadowAlertDialog.getLatestAlertDialog());
    128   }
    129 
    130   @Test
    131   public void getLatestDialog_shouldReturnARealDialog() throws Exception {
    132     assertThat(ShadowDialog.getLatestDialog()).isNull();
    133 
    134     Dialog dialog = new Dialog(RuntimeEnvironment.application);
    135     dialog.show();
    136     assertThat(ShadowDialog.getLatestDialog()).isSameAs(dialog);
    137   }
    138 
    139   @Test
    140   public void shouldKeepListOfOpenedDialogs() throws Exception {
    141     assertEquals(0, ShadowDialog.getShownDialogs().size());
    142 
    143     TestDialog dialog = new TestDialog(RuntimeEnvironment.application);
    144     dialog.show();
    145 
    146     assertEquals(1, ShadowDialog.getShownDialogs().size());
    147     assertEquals(dialog, ShadowDialog.getShownDialogs().get(0));
    148 
    149     TestDialog dialog2 = new TestDialog(RuntimeEnvironment.application);
    150     dialog2.show();
    151 
    152     assertEquals(2, ShadowDialog.getShownDialogs().size());
    153     assertEquals(dialog2, ShadowDialog.getShownDialogs().get(1));
    154 
    155     dialog.dismiss();
    156 
    157     assertEquals(2, ShadowDialog.getShownDialogs().size());
    158 
    159     ShadowDialog.reset();
    160 
    161     assertEquals(0, ShadowDialog.getShownDialogs().size());
    162   }
    163 
    164   @Test
    165   public void shouldPopulateListOfRecentDialogsInCorrectOrder() throws Exception {
    166     new NestingTestDialog().show();
    167 
    168     assertEquals(TestDialog.class, ShadowDialog.getLatestDialog().getClass());
    169   }
    170 
    171   @Test
    172   public void shouldFindViewsWithinAContentViewThatWasPreviouslySet() throws Exception {
    173     Dialog dialog = new Dialog(RuntimeEnvironment.application);
    174     dialog.setContentView(dialog.getLayoutInflater().inflate(R.layout.main, null));
    175     assertThat(dialog.<TextView>findViewById(R.id.title)).isInstanceOf((Class<? extends TextView>) TextView.class);
    176   }
    177 
    178   @Test
    179   @Config(minSdk = KITKAT)
    180   public void show_shouldWorkWithAPI19() {
    181     Dialog dialog = new Dialog(RuntimeEnvironment.application);
    182     dialog.show();
    183   }
    184 
    185   @Test
    186   public void canSetAndGetOnCancelListener() {
    187     Dialog dialog = new Dialog(RuntimeEnvironment.application);
    188     DialogInterface.OnCancelListener onCancelListener = new DialogInterface.OnCancelListener() {
    189       @Override
    190       public void onCancel(DialogInterface dialog) {
    191 
    192       }
    193     };
    194     dialog.setOnCancelListener(onCancelListener);
    195     assertThat(onCancelListener).isSameAs(shadowOf(dialog).getOnCancelListener());
    196   }
    197 
    198   private static class TestDialog extends Dialog {
    199     boolean onStartCalled = false;
    200     boolean wasDismissed = false;
    201 
    202     public TestDialog(Context context) {
    203       super(context);
    204     }
    205 
    206     @Override
    207     protected void onStart() {
    208       onStartCalled = true;
    209     }
    210 
    211     @Override public void dismiss() {
    212       super.dismiss();
    213       wasDismissed = true;
    214     }
    215   }
    216 
    217   private static class NestingTestDialog extends Dialog {
    218     public NestingTestDialog() {
    219       super(RuntimeEnvironment.application);
    220     }
    221 
    222     @Override
    223     protected void onCreate(Bundle savedInstanceState) {
    224       super.onCreate(savedInstanceState);
    225       new TestDialog(getContext()).show();
    226     }
    227   }
    228 }
    229