package org.robolectric;
import android.app.Application;
import android.content.Intent;
import android.content.pm.PackageManager;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.Fs;
import org.robolectric.shadows.ShadowApplication;
import java.io.File;
import java.io.IOException;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf;
import static org.robolectric.util.TestUtil.newConfig;
@RunWith(RobolectricTestRunner.class)
public class DefaultTestLifecycleTest {
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
private DefaultTestLifecycle defaultTestLifecycle = new DefaultTestLifecycle();
@Test(expected = RuntimeException.class)
public void shouldThrowWhenManifestContainsBadApplicationClassName() throws Exception {
defaultTestLifecycle.createApplication(null,
newConfigWith("<application android:name=\"org.robolectric.BogusTestApplication\"/>)"), null);
}
@Test
public void shouldReturnDefaultAndroidApplicationWhenManifestDeclaresNoAppName() throws Exception {
assertThat(defaultTestLifecycle.createApplication(null, newConfigWith(""), null))
.isExactlyInstanceOf(Application.class);
}
@Test
public void shouldReturnSpecifiedApplicationWhenManifestDeclaresAppName() throws Exception {
assertThat(defaultTestLifecycle.createApplication(null,
newConfigWith("<application android:name=\"org.robolectric.TestApplication\"/>"), null))
.isExactlyInstanceOf(TestApplication.class);
}
@Config(manifest = "src/test/resources/TestAndroidManifestWithReceiversCustomPackage.xml")
@Test public void shouldAssignThePackageNameFromTheManifest() throws Exception {
Application application = RuntimeEnvironment.application;
assertThat(application.getPackageName()).isEqualTo("org.robolectric.mypackage");
assertThat(application).isExactlyInstanceOf(Application.class);
}
@Test
public void shouldRegisterReceiversFromTheManifest() throws Exception {
AndroidManifest appManifest = newConfig("TestAndroidManifestWithReceivers.xml");
Application application = defaultTestLifecycle.createApplication(null, appManifest, null);
shadowOf(application).bind(appManifest);
List<ShadowApplication.Wrapper> receivers = shadowOf(application).getRegisteredReceivers();
assertThat(receivers.size()).isEqualTo(5);
assertTrue(receivers.get(0).intentFilter.matchAction("org.robolectric.ACTION1"));
}
@Config(manifest = "src/test/resources/TestAndroidManifestForActivities.xml")
@Test public void shouldRegisterActivitiesFromManifestInPackageManager() throws Exception {
Application application = RuntimeEnvironment.application;
PackageManager packageManager = application.getPackageManager();
assertThat(packageManager.resolveActivity(new Intent("org.robolectric.shadows.TestActivity"), -1)).isNotNull();
assertThat(packageManager.resolveActivity(new Intent("org.robolectric.shadows.TestActivity2"), -1)).isNotNull();
}
@Test public void shouldDoTestApplicationNameTransform() throws Exception {
assertThat(defaultTestLifecycle.getTestApplicationName(".Applicationz")).isEqualTo(".TestApplicationz");
assertThat(defaultTestLifecycle.getTestApplicationName("Applicationz")).isEqualTo("TestApplicationz");
assertThat(defaultTestLifecycle.getTestApplicationName("com.foo.Applicationz")).isEqualTo("com.foo.TestApplicationz");
}
@Test public void shouldLoadConfigApplicationIfSpecified() throws Exception {
Application application = defaultTestLifecycle.createApplication(null,
newConfigWith("<application android:name=\"" + "ClassNameToIgnore" + "\"/>"), new Config.Builder().setApplication(TestFakeApp.class).build());
assertThat(application).isExactlyInstanceOf(TestFakeApp.class);
}
@Test public void shouldLoadConfigInnerClassApplication() throws Exception {
Application application = defaultTestLifecycle.createApplication(null,
newConfigWith("<application android:name=\"" + "ClassNameToIgnore" + "\"/>"), new Config.Builder().setApplication(TestFakeAppInner.class).build());
assertThat(application).isExactlyInstanceOf(TestFakeAppInner.class);
}
@Test public void shouldLoadTestApplicationIfClassIsPresent() throws Exception {
Application application = defaultTestLifecycle.createApplication(null,
newConfigWith("<application android:name=\"" + FakeApp.class.getName() + "\"/>"), null);
assertThat(application).isExactlyInstanceOf(TestFakeApp.class);
}
@Test public void whenNoAppManifestPresent_shouldCreateGenericApplication() throws Exception {
assertThat(defaultTestLifecycle.createApplication(null, null, null)).isExactlyInstanceOf(Application.class);
}
/////////////////////////////
public AndroidManifest newConfigWith(String contents) throws IOException {
return newConfigWith("org.robolectric", contents);
}
private AndroidManifest newConfigWith(String packageName, String contents) throws IOException {
String fileContents = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
" package=\"" + packageName + "\">\n" +
" " + contents + "\n" +
"</manifest>\n";
File f = temporaryFolder.newFile("whatever.xml");
Files.write(fileContents, f, Charsets.UTF_8);
return new AndroidManifest(Fs.newFile(f), null, null);
}
public static class TestFakeAppInner extends Application { }
}