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