package org.robolectric;
import android.app.Application;
import org.robolectric.annotation.Config;
import org.robolectric.android.internal.ClassNameResolver;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.android.ApplicationTestUtil;
import java.lang.reflect.Method;
public class DefaultTestLifecycle implements TestLifecycle {
/**
* Override this method if you want to provide your own implementation of Application.
*
* This method attempts to instantiate an application instance as follows:-
*
* 1. If specified loads the application specified in the Config annotation
* 1. Attempt to load a test application as documented <a href="http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html">here</a>
* 1. Use the application as specified in the AndroidManifest.xml
* 1. Instantiate a standard {@link android.app.Application}
*
* @param method The currently-running test method.
* @param appManifest The application manifest.
* @param config The configuration annotation from the test if present.
* @return An instance of the Application class specified by the ApplicationManifest.xml or an instance of
* Application if not specified.
*/
public Application createApplication(Method method, AndroidManifest appManifest, Config config) {
Application application = null;
if (config != null && !Config.Builder.isDefaultApplication(config.application())) {
if (config.application().getCanonicalName() != null) {
Class<? extends Application> applicationClass;
try {
applicationClass = new ClassNameResolver<Application>(null, config.application().getName()).resolve();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
application = ApplicationTestUtil.newApplication(applicationClass);
}
} else if (appManifest != null && appManifest.getApplicationName() != null) {
Class<? extends Application> applicationClass = null;
try {
applicationClass = new ClassNameResolver<Application>(appManifest.getPackageName(), getTestApplicationName(appManifest.getApplicationName())).resolve();
} catch (ClassNotFoundException e) {
// no problem
}
if (applicationClass == null) {
try {
applicationClass = new ClassNameResolver<Application>(appManifest.getPackageName(), appManifest.getApplicationName()).resolve();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
application = ApplicationTestUtil.newApplication(applicationClass);
} else {
application = new Application();
}
return application;
}
/**
* Called before each test method is run.
*
* @param method the test method about to be run
*/
public void beforeTest(final Method method) {
if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
((TestLifecycleApplication) RuntimeEnvironment.application).beforeTest(method);
}
}
public void prepareTest(final Object test) {
if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
((TestLifecycleApplication) RuntimeEnvironment.application).prepareTest(test);
}
}
/**
* Called after each test method is run.
*
* @param method the test method that just ran.
*/
public void afterTest(final Method method) {
if (RuntimeEnvironment.application instanceof TestLifecycleApplication) {
((TestLifecycleApplication) RuntimeEnvironment.application).afterTest(method);
}
}
public String getTestApplicationName(String applicationName) {
int lastDot = applicationName.lastIndexOf('.');
if (lastDot > -1) {
return applicationName.substring(0, lastDot) + ".Test" + applicationName.substring(lastDot + 1);
} else {
return "Test" + applicationName;
}
}
}