| package com.xtremelabs.robolectric.shadows; |
| |
| import static com.xtremelabs.robolectric.Robolectric.newInstanceOf; |
| import static com.xtremelabs.robolectric.Robolectric.shadowOf; |
| import static com.xtremelabs.robolectric.util.TestUtil.newConfig; |
| import static org.hamcrest.CoreMatchers.equalTo; |
| import static org.hamcrest.CoreMatchers.notNullValue; |
| import static org.hamcrest.CoreMatchers.nullValue; |
| import static org.hamcrest.CoreMatchers.sameInstance; |
| import static org.hamcrest.core.StringStartsWith.startsWith; |
| import static org.junit.Assert.*; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import android.app.Activity; |
| import android.appwidget.AppWidgetProvider; |
| import android.content.Intent; |
| import android.content.IntentFilter; |
| import android.content.IntentSender; |
| import android.content.pm.ActivityInfo; |
| import android.net.Uri; |
| |
| import com.xtremelabs.robolectric.ApplicationResolver; |
| import com.xtremelabs.robolectric.R; |
| import com.xtremelabs.robolectric.Robolectric; |
| import com.xtremelabs.robolectric.WithTestDefaultsRunner; |
| import com.xtremelabs.robolectric.util.TestRunnable; |
| import com.xtremelabs.robolectric.util.Transcript; |
| |
| @RunWith(WithTestDefaultsRunner.class) |
| public class ActivityTest { |
| |
| @Test(expected = IllegalStateException.class) |
| public void shouldComplainIfActivityIsDestroyedWithRegisteredBroadcastReceivers() throws Exception { |
| MyActivity activity = new MyActivity(); |
| activity.registerReceiver(new AppWidgetProvider(), new IntentFilter()); |
| activity.onDestroy(); |
| } |
| |
| @Test |
| public void shouldNotComplainIfActivityIsDestroyedWhileAnotherActivityHasRegisteredBroadcastReceivers() throws Exception { |
| MyActivity activity = new MyActivity(); |
| |
| MyActivity activity2 = new MyActivity(); |
| activity2.registerReceiver(new AppWidgetProvider(), new IntentFilter()); |
| |
| activity.onDestroy(); // should not throw exception |
| } |
| |
| @Test |
| public void startActivityForResultAndReceiveResult_shouldSendResponsesBackToActivity() throws Exception { |
| final Transcript transcript = new Transcript(); |
| Activity activity = new Activity() { |
| @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| transcript.add("onActivityResult called with requestCode " + requestCode + ", resultCode " + resultCode + ", intent data " + data.getData()); |
| } |
| }; |
| activity.startActivityForResult(new Intent().setType("audio/*"), 123); |
| activity.startActivityForResult(new Intent().setType("image/*"), 456); |
| |
| shadowOf(activity).receiveResult(new Intent().setType("image/*"), Activity.RESULT_OK, |
| new Intent().setData(Uri.parse("content:foo"))); |
| transcript.assertEventsSoFar("onActivityResult called with requestCode 456, resultCode -1, intent data content:foo"); |
| } |
| |
| @Test |
| public void startActivityForResultAndReceiveResult_whenNoIntentMatches_shouldThrowException() throws Exception { |
| Activity activity = new Activity() { |
| @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| throw new IllegalStateException("should not be called"); |
| } |
| }; |
| activity.startActivityForResult(new Intent().setType("audio/*"), 123); |
| activity.startActivityForResult(new Intent().setType("image/*"), 456); |
| |
| Intent requestIntent = new Intent().setType("video/*"); |
| try { |
| shadowOf(activity).receiveResult(requestIntent, Activity.RESULT_OK, |
| new Intent().setData(Uri.parse("content:foo"))); |
| fail(); |
| } catch (Exception e) { |
| assertThat(e.getMessage(), startsWith("No intent matches " + requestIntent)); |
| } |
| } |
| |
| @Test |
| public void shouldSupportStartActivityForResult() throws Exception { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = Robolectric.shadowOf(activity); |
| Intent intent = new Intent().setClass(activity, MyActivity.class); |
| assertThat(shadowActivity.getNextStartedActivity(), nullValue()); |
| |
| activity.startActivityForResult(intent, 142); |
| |
| Intent startedIntent = shadowActivity.getNextStartedActivity(); |
| assertThat(startedIntent, notNullValue()); |
| assertThat(startedIntent, sameInstance(intent)); |
| } |
| |
| @Test |
| public void shouldSupportGetStartedActitivitesForResult() throws Exception { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = Robolectric.shadowOf(activity); |
| Intent intent = new Intent().setClass(activity, MyActivity.class); |
| |
| activity.startActivityForResult(intent, 142); |
| |
| ShadowActivity.IntentForResult intentForResult = shadowActivity.getNextStartedActivityForResult(); |
| assertThat(intentForResult, notNullValue()); |
| assertThat(shadowActivity.getNextStartedActivityForResult(), nullValue()); |
| assertThat(intentForResult.intent, notNullValue()); |
| assertThat(intentForResult.intent, sameInstance(intent)); |
| assertThat(intentForResult.requestCode, equalTo(142)); |
| } |
| |
| @Test |
| public void shouldSupportPeekStartedActitivitesForResult() throws Exception { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = Robolectric.shadowOf(activity); |
| Intent intent = new Intent().setClass(activity, MyActivity.class); |
| |
| activity.startActivityForResult(intent, 142); |
| |
| ShadowActivity.IntentForResult intentForResult = shadowActivity.peekNextStartedActivityForResult(); |
| assertThat(intentForResult, notNullValue()); |
| assertThat(shadowActivity.peekNextStartedActivityForResult(), sameInstance(intentForResult)); |
| assertThat(intentForResult.intent, notNullValue()); |
| assertThat(intentForResult.intent, sameInstance(intent)); |
| assertThat(intentForResult.requestCode, equalTo(142)); |
| } |
| |
| @Test |
| public void onContentChangedShouldBeCalledAfterContentViewIsSet() throws RuntimeException { |
| final Transcript transcript = new Transcript(); |
| Activity customActivity = new Activity() { |
| @Override |
| public void onContentChanged() { |
| transcript.add("onContentChanged was called; title is \"" + shadowOf(findViewById(R.id.title)).innerText() + "\""); |
| } |
| }; |
| customActivity.setContentView(R.layout.main); |
| transcript.assertEventsSoFar("onContentChanged was called; title is \"Main Layout\""); |
| } |
| |
| @Test |
| public void shouldRetrievePackageNameFromTheManifest() throws Exception { |
| Robolectric.application = new ApplicationResolver(newConfig("TestAndroidManifestWithPackageName.xml")).resolveApplication(); |
| assertEquals("com.wacka.wa", new Activity().getPackageName()); |
| } |
| |
| @Test |
| public void shouldRunUiTasksImmediatelyByDefault() throws Exception { |
| TestRunnable runnable = new TestRunnable(); |
| MyActivity activity = new MyActivity(); |
| activity.runOnUiThread(runnable); |
| assertTrue(runnable.wasRun); |
| } |
| |
| @Test |
| public void shouldQueueUiTasksWhenUiThreadIsPaused() throws Exception { |
| Robolectric.pauseMainLooper(); |
| |
| MyActivity activity = new MyActivity(); |
| TestRunnable runnable = new TestRunnable(); |
| activity.runOnUiThread(runnable); |
| assertFalse(runnable.wasRun); |
| |
| Robolectric.unPauseMainLooper(); |
| assertTrue(runnable.wasRun); |
| } |
| |
| @Test |
| public void shouldSaveStartServiceIntent() { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = shadowOf(activity); |
| Intent intent = new Intent(); |
| |
| assertThat( activity.startService(intent), nullValue() ); |
| assertThat( shadowActivity.getStartServiceIntent(), sameInstance(intent)); |
| } |
| |
| @Test |
| public void shouldSaveStartIntentSender() throws Exception { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = shadowOf(activity); |
| IntentSender intentSender = newInstanceOf( IntentSender.class ); |
| Intent intent = new Intent(); |
| int flagsMask = 1; |
| int flagsValues = 2; |
| int extraFlags = 3; |
| |
| activity.startIntentSender(intentSender, intent, flagsMask, flagsValues, extraFlags); |
| assertThat(shadowActivity.getStartIntentSenderIntent(), sameInstance(intentSender)); |
| assertThat(shadowActivity.getStartIntentSenderFillInIntent(), sameInstance(intent)); |
| assertThat(shadowActivity.getStartIntentSenderFlagsMask(), equalTo(flagsMask)); |
| assertThat(shadowActivity.getStartIntentSenderFlagsValues(), equalTo(flagsValues)); |
| assertThat(shadowActivity.getStartIntentSenderExtraFlags(), equalTo(extraFlags)); |
| } |
| |
| @Test (expected=IntentSender.SendIntentException.class) |
| public void startIntentSender_shouldThrowException() throws IntentSender.SendIntentException { |
| MyActivity activity = new MyActivity(); |
| ShadowActivity shadowActivity = shadowOf(activity); |
| |
| shadowActivity.setStartIntentSenderShouldThrowException(true); |
| activity.startIntentSender(null, null, 0, 0, 0); |
| } |
| |
| @Test |
| public void shouldSetOrientation() { |
| MyActivity activity = new MyActivity(); |
| activity.setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); |
| assertThat( activity.getRequestedOrientation(), equalTo( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) ); |
| } |
| |
| private static class MyActivity extends Activity { |
| @Override protected void onDestroy() { |
| super.onDestroy(); |
| } |
| } |
| } |