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