blob: 41e61aca60e42ac0ae521fd2cc19e13edb54f6ac [file] [log] [blame]
package org.robolectric.integrationtests.axt;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
import static com.google.common.truth.Truth.assertThat;
import android.app.Activity;
import android.app.UiAutomation;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import androidx.appcompat.R;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle.State;
import androidx.test.core.app.ActivityScenario;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
/**
* Integration tests for {@link ActivityScenario} that verify it behaves consistently on device and
* Robolectric.
*/
@RunWith(AndroidJUnit4.class)
public class ActivityScenarioTest {
private static final List<String> callbacks = new ArrayList<>();
public static class TranscriptActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callbacks.add("onCreate");
}
@Override
public void onStart() {
super.onStart();
callbacks.add("onStart");
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
callbacks.add("onPostCreate");
}
@Override
public void onResume() {
super.onResume();
callbacks.add("onResume");
}
@Override
public void onPause() {
super.onPause();
callbacks.add("onPause");
}
@Override
public void onStop() {
super.onStop();
callbacks.add("onStop");
}
@Override
public void onRestart() {
super.onRestart();
callbacks.add("onRestart");
}
@Override
public void onDestroy() {
super.onDestroy();
callbacks.add("onDestroy");
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
callbacks.add("onWindowFocusChanged " + hasFocus);
}
}
public static class LifecycleOwnerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle bundle) {
setTheme(R.style.Theme_AppCompat);
super.onCreate(bundle);
}
}
@Before
public void setUp() {
callbacks.clear();
}
@Test
public void launch_callbackSequence() {
ActivityScenario<TranscriptActivity> activityScenario =
ActivityScenario.launch(TranscriptActivity.class);
assertThat(activityScenario).isNotNull();
assertThat(callbacks)
.containsExactly(
"onCreate", "onStart", "onPostCreate", "onResume", "onWindowFocusChanged true");
}
@Test
public void launch_pauseAndResume_callbackSequence() {
ActivityScenario<TranscriptActivity> activityScenario =
ActivityScenario.launch(TranscriptActivity.class);
assertThat(activityScenario).isNotNull();
activityScenario.moveToState(State.STARTED);
activityScenario.moveToState(State.RESUMED);
assertThat(callbacks)
.containsExactly(
"onCreate", "onStart", "onPostCreate", "onResume", "onWindowFocusChanged true",
"onPause", "onResume");
}
@Test
public void launch_stopAndResume_callbackSequence() {
ActivityScenario<TranscriptActivity> activityScenario =
ActivityScenario.launch(TranscriptActivity.class);
assertThat(activityScenario).isNotNull();
activityScenario.moveToState(State.CREATED);
activityScenario.moveToState(State.RESUMED);
assertThat(callbacks)
.containsExactly(
"onCreate", "onStart", "onPostCreate", "onResume", "onWindowFocusChanged true",
"onPause", "onStop", "onRestart", "onStart", "onResume");
}
@Test
public void launchAlias_createTargetAndCallbackSequence() {
Context context = ApplicationProvider.getApplicationContext();
ActivityScenario<Activity> activityScenario =
ActivityScenario.launch(
new Intent()
.setClassName(
context, "org.robolectric.integrationtests.axt.ActivityScenarioTestAlias"));
assertThat(activityScenario).isNotNull();
activityScenario.onActivity(
activity -> assertThat(activity).isInstanceOf(TranscriptActivity.class));
assertThat(callbacks)
.containsExactly(
"onCreate", "onStart", "onPostCreate", "onResume", "onWindowFocusChanged true");
}
@Test
public void launch_lifecycleOwnerActivity() {
ActivityScenario<LifecycleOwnerActivity> activityScenario =
ActivityScenario.launch(LifecycleOwnerActivity.class);
assertThat(activityScenario).isNotNull();
activityScenario.onActivity(
activity -> assertThat(activity.getLifecycle().getCurrentState()).isEqualTo(State.RESUMED));
activityScenario.moveToState(State.STARTED);
activityScenario.onActivity(
activity -> assertThat(activity.getLifecycle().getCurrentState()).isEqualTo(State.STARTED));
activityScenario.moveToState(State.CREATED);
activityScenario.onActivity(
activity -> assertThat(activity.getLifecycle().getCurrentState()).isEqualTo(State.CREATED));
}
@Test
public void recreate_retainFragmentHostingActivity() {
Fragment fragment = new Fragment();
fragment.setRetainInstance(true);
ActivityScenario<LifecycleOwnerActivity> activityScenario =
ActivityScenario.launch(LifecycleOwnerActivity.class);
assertThat(activityScenario).isNotNull();
activityScenario.onActivity(
activity -> {
activity
.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, fragment)
.commitNow();
assertThat(activity.getSupportFragmentManager().findFragmentById(android.R.id.content))
.isSameInstanceAs(fragment);
});
activityScenario.recreate();
activityScenario.onActivity(
activity ->
assertThat(activity.getSupportFragmentManager().findFragmentById(android.R.id.content))
.isSameInstanceAs(fragment));
}
@Test
public void recreate_nonRetainFragmentHostingActivity() {
Fragment fragment = new Fragment();
fragment.setRetainInstance(false);
ActivityScenario<LifecycleOwnerActivity> activityScenario =
ActivityScenario.launch(LifecycleOwnerActivity.class);
assertThat(activityScenario).isNotNull();
activityScenario.onActivity(
activity -> {
activity
.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, fragment)
.commitNow();
assertThat(activity.getSupportFragmentManager().findFragmentById(android.R.id.content))
.isSameInstanceAs(fragment);
});
activityScenario.recreate();
activityScenario.onActivity(
activity ->
assertThat(activity.getSupportFragmentManager().findFragmentById(android.R.id.content))
.isNotSameInstanceAs(fragment));
}
@Config(minSdk = JELLY_BEAN_MR2)
@Test
public void setRotation_recreatesActivity() {
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
try (ActivityScenario<?> scenario = ActivityScenario.launch(TranscriptActivity.class)) {
AtomicReference<Activity> originalActivity = new AtomicReference<>();
scenario.onActivity(originalActivity::set);
uiAutomation.setRotation(UiAutomation.ROTATION_FREEZE_90);
scenario.onActivity(
activity -> {
assertThat(activity.getResources().getConfiguration().orientation)
.isEqualTo(Configuration.ORIENTATION_LANDSCAPE);
assertThat(activity).isNotSameInstanceAs(originalActivity);
});
}
}
}