package org.robolectric; import android.app.Application; import android.content.res.Resources; import android.os.Build; import org.assertj.core.api.Assertions; import org.hamcrest.CoreMatchers; import javax.annotation.Nonnull; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.model.InitializationError; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.annotation.Config; import org.robolectric.manifest.AndroidManifest; import org.robolectric.res.builder.RobolectricPackageManager; import org.robolectric.util.ReflectionHelpers; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.robolectric.Shadows.shadowOf; @RunWith(RobolectricTestRunnerSelfTest.RunnerForTesting.class) public class RobolectricTestRunnerSelfTest { @Test public void shouldInitializeAndBindApplicationButNotCallOnCreate() { assertThat(RuntimeEnvironment.application).as("application") .isNotNull() .isInstanceOf(MyTestApplication.class); assertThat(((MyTestApplication) RuntimeEnvironment.application).onCreateWasCalled).as("onCreate called").isTrue(); assertThat(RuntimeEnvironment.getAppResourceTable()).as("Application resource loader").isNotNull(); } @Test public void shouldSetUpSystemResources() { assertThat(Resources.getSystem()).as("system resources").isNotNull(); assertThat(Resources.getSystem().getString(android.R.string.copy)).as("system resource") .isEqualTo(RuntimeEnvironment.application.getResources().getString(android.R.string.copy)); assertThat(RuntimeEnvironment.application.getResources().getString(R.string.howdy)).as("app resource") .isNotNull(); try { Resources.getSystem().getString(R.string.howdy); Assertions.failBecauseExceptionWasNotThrown(Resources.NotFoundException.class); } catch (Resources.NotFoundException e) { } } @Test public void setStaticValue_shouldIgnoreFinalModifier() { ReflectionHelpers.setStaticField(Build.class, "MODEL", "expected value"); assertThat(Build.MODEL).isEqualTo("expected value"); } @Test @Config(qualifiers = "fr") public void internalBeforeTest_testValuesResQualifiers() { assertThat(RuntimeEnvironment.getQualifiers()).contains("fr"); } @Before public void clearOrder() { onTerminateCalledFromMain = null; order.clear(); RobolectricPackageManager mockManager = mock(RobolectricPackageManager.class); doAnswer(new Answer<Void>() { public Void answer(InvocationOnMock invocation) { order.add("reset"); return null; } }).when(mockManager).reset(); RuntimeEnvironment.setRobolectricPackageManager(mockManager); } @Test public void testMethod_shouldBeInvoked_onMainThread() { assertThat(RuntimeEnvironment.isMainThread()).isTrue(); } @Test(timeout = 1000) public void whenTestHarnessUsesDifferentThread_shouldStillReportAsMainThread() { assertThat(RuntimeEnvironment.isMainThread()).isTrue(); } @Test @Config(sdk = Build.VERSION_CODES.KITKAT) public void testVersionConfiguration() { assertThat(Build.VERSION.SDK_INT) .isEqualTo(Build.VERSION_CODES.KITKAT); assertThat(Build.VERSION.RELEASE) .isEqualTo("4.4_r1"); } @Test public void hamcrestMatchersDontBlowUpDuringLinking() throws Exception { org.junit.Assert.assertThat(true, CoreMatchers.is(true)); } @AfterClass public static void resetStaticState_shouldBeCalled_afterAppTearDown() { assertThat(order).containsExactly("onTerminate", "reset"); } @AfterClass public static void resetStaticState_shouldBeCalled_onMainThread() { assertThat(onTerminateCalledFromMain).isTrue(); } public static class RunnerForTesting extends TestRunners.SelfTest { public static RunnerForTesting instance; public RunnerForTesting(Class<?> testClass) throws InitializationError { super(testClass); instance = this; } @Nonnull @Override protected Class<? extends TestLifecycle> getTestLifecycleClass() { return MyTestLifecycle.class; } public static class MyTestLifecycle extends DefaultTestLifecycle { @Override public Application createApplication(Method method, AndroidManifest appManifest, Config config) { return new MyTestApplication(); } } } private static List<String> order = new ArrayList<>(); private static Boolean onTerminateCalledFromMain = null; public static class MyTestApplication extends Application { private boolean onCreateWasCalled; private Boolean onCreateCalledFromMain; @Override public void onCreate() { this.onCreateWasCalled = true; this.onCreateCalledFromMain = Boolean.valueOf(RuntimeEnvironment.isMainThread()); } @Override public void onTerminate() { order.add("onTerminate"); onTerminateCalledFromMain = Boolean.valueOf(RuntimeEnvironment.isMainThread()); } } }