package com.xtremelabs.robolectric.shadows; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.widget.TextView; import com.xtremelabs.robolectric.R; import com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import com.xtremelabs.robolectric.util.Transcript; import org.junit.Test; import org.junit.runner.RunWith; import static com.xtremelabs.robolectric.util.TestUtil.assertInstanceOf; import static junit.framework.Assert.*; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @RunWith(WithTestDefaultsRunner.class) public class DialogTest { @Test public void shouldCallOnDismissListener() throws Exception { final Transcript transcript = new Transcript(); final Dialog dialog = new Dialog(null); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInListener) { assertThat((Dialog) dialogInListener, sameInstance(dialog)); transcript.add("onDismiss called!"); } }); dialog.dismiss(); transcript.assertEventsSoFar("onDismiss called!"); } @Test public void shouldGetLayoutInflater() { Dialog dialog = new Dialog(Robolectric.application); assertNotNull(dialog.getLayoutInflater()); } @Test public void shouldCallOnStartFromShow() { TestDialog dialog = new TestDialog(); dialog.show(); assertTrue(dialog.onStartCalled); } @Test public void shouldSetCancelable() { Dialog dialog = new Dialog(null); ShadowDialog shadow = Robolectric.shadowOf(dialog); dialog.setCancelable(false); assertThat(shadow.isCancelable(), equalTo(false)); } @Test public void shouldDismissTheRealDialogWhenCancelled() throws Exception { TestDialog dialog = new TestDialog(); dialog.cancel(); assertThat(dialog.wasDismissed, equalTo(true)); } @Test public void shouldDefaultCancelableToTrueAsTheSDKDoes() throws Exception { Dialog dialog = new Dialog(null); ShadowDialog shadow = Robolectric.shadowOf(dialog); assertThat(shadow.isCancelable(), equalTo(true)); } @Test public void shouldOnlyCallOnCreateOnce() { final Transcript transcript = new Transcript(); Dialog dialog = new Dialog(Robolectric.application) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); transcript.add("onCreate called"); } }; dialog.show(); transcript.assertEventsSoFar("onCreate called"); dialog.dismiss(); dialog.show(); transcript.assertNoEventsSoFar(); } @Test public void show_setsLatestDialog() { Dialog dialog = new Dialog(Robolectric.application); assertNull(ShadowDialog.getLatestDialog()); dialog.show(); assertEquals(dialog, ShadowDialog.getLatestDialog()); assertNull(ShadowAlertDialog.getLatestAlertDialog()); } @Test public void getLatestDialog_shouldReturnARealDialog() throws Exception { assertThat(ShadowDialog.getLatestDialog(), nullValue()); Dialog dialog = new Dialog(null); dialog.show(); assertThat(ShadowDialog.getLatestDialog(), sameInstance(dialog)); } @Test public void shouldKeepListOfOpenedDialogs() throws Exception { assertEquals(0, ShadowDialog.getShownDialogs().size()); TestDialog dialog = new TestDialog(); dialog.show(); assertEquals(1, ShadowDialog.getShownDialogs().size()); assertEquals(dialog, ShadowDialog.getShownDialogs().get(0)); TestDialog dialog2 = new TestDialog(); dialog2.show(); assertEquals(2, ShadowDialog.getShownDialogs().size()); assertEquals(dialog2, ShadowDialog.getShownDialogs().get(1)); dialog.dismiss(); assertEquals(2, ShadowDialog.getShownDialogs().size()); ShadowDialog.reset(); assertEquals(0, ShadowDialog.getShownDialogs().size()); } @Test public void shouldPopulateListOfRecentDialogsInCorrectOrder() throws Exception { new NestingTestDialog().show(); assertEquals(TestDialog.class, ShadowDialog.getLatestDialog().getClass()); } @Test public void shouldFindViewsWithinAContentViewThatWasPreviouslySet() throws Exception { Dialog dialog = new Dialog(Robolectric.application); dialog.setContentView(dialog.getLayoutInflater().inflate(R.layout.main, null)); assertInstanceOf(TextView.class, dialog.findViewById(R.id.title)); } private static class TestDialog extends Dialog { boolean onStartCalled = false; boolean wasDismissed = false; public TestDialog() { super(null); } @Override protected void onStart() { onStartCalled = true; } @Override public void dismiss() { super.dismiss(); wasDismissed = true; } } private static class NestingTestDialog extends Dialog { public NestingTestDialog() { super(null); }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new TestDialog().show(); } } }