ActivityTest.java revision ea74b95565e92521affdc7cc1a773e10fd235a96
1package com.xtremelabs.robolectric.shadows;
2
3import android.app.Activity;
4import android.appwidget.AppWidgetProvider;
5import android.content.Intent;
6import android.content.IntentFilter;
7import android.net.Uri;
8import com.xtremelabs.robolectric.ApplicationResolver;
9import com.xtremelabs.robolectric.Robolectric;
10import com.xtremelabs.robolectric.WithTestDefaultsRunner;
11import com.xtremelabs.robolectric.util.Transcript;
12import org.junit.Test;
13import org.junit.runner.RunWith;
14
15import java.io.File;
16
17import static com.xtremelabs.robolectric.Robolectric.shadowOf;
18import static org.hamcrest.Matchers.startsWith;
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertThat;
21import static org.junit.Assert.fail;
22
23@RunWith(WithTestDefaultsRunner.class)
24public class ActivityTest {
25
26    @Test(expected = IllegalStateException.class)
27    public void shouldComplainIfActivityIsDestroyedWithRegisteredBroadcastReceivers() throws Exception {
28        MyActivity activity = new MyActivity();
29        activity.registerReceiver(new AppWidgetProvider(), new IntentFilter());
30        activity.onDestroy();
31    }
32
33    @Test
34    public void shouldNotComplainIfActivityIsDestroyedWhileAnotherActivityHasRegisteredBroadcastReceivers() throws Exception {
35        MyActivity activity = new MyActivity();
36
37        MyActivity activity2 = new MyActivity();
38        activity2.registerReceiver(new AppWidgetProvider(), new IntentFilter());
39
40        activity.onDestroy(); // should not throw exception
41    }
42
43    @Test
44    public void startActivityForResultAndReceiveResult_shouldSendResponsesBackToActivity() throws Exception {
45        final Transcript transcript = new Transcript();
46        Activity activity = new Activity() {
47            @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
48                transcript.add("onActivityResult called with requestCode " + requestCode + ", resultCode " + resultCode + ", intent data " + data.getData());
49            }
50        };
51        activity.startActivityForResult(new Intent().setType("audio/*"), 123);
52        activity.startActivityForResult(new Intent().setType("image/*"), 456);
53
54        shadowOf(activity).receiveResult(new Intent().setType("image/*"), Activity.RESULT_OK,
55                new Intent().setData(Uri.parse("content:foo")));
56        transcript.assertEventsSoFar("onActivityResult called with requestCode 456, resultCode -1, intent data content:foo");
57    }
58
59    @Test
60    public void startActivityForResultAndReceiveResult_whenNoIntentMatches_shouldThrowException() throws Exception {
61        Activity activity = new Activity() {
62            @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
63                throw new IllegalStateException("should not be called");
64            }
65        };
66        activity.startActivityForResult(new Intent().setType("audio/*"), 123);
67        activity.startActivityForResult(new Intent().setType("image/*"), 456);
68
69        Intent requestIntent = new Intent().setType("video/*");
70        try {
71            shadowOf(activity).receiveResult(requestIntent, Activity.RESULT_OK,
72                    new Intent().setData(Uri.parse("content:foo")));
73            fail();
74        } catch (Exception e) {
75            assertThat(e.getMessage(), startsWith("No intent matches " + requestIntent));
76        }
77    }
78
79    @Test
80    public void shouldRetrievePackageNameFromTheManifest() throws Exception {
81        Robolectric.application = new ApplicationResolver("test" + File.separator + "TestAndroidManifestWithPackageName.xml").resolveApplication();
82        assertEquals("com.wacka.wa", new Activity().getPackageName());
83    }
84
85    private static class MyActivity extends Activity {
86        @Override protected void onDestroy() {
87            super.onDestroy();
88        }
89    }
90}
91