Skip to content

Commit

Permalink
Add getState() API to ActivityScenario
Browse files Browse the repository at this point in the history
getState() API provides a way to check the current state of the activity under testing. This is especially useful when your activity redirects to another activity or finish itself during the launch.

FR: #235
PiperOrigin-RevId: 238095286
  • Loading branch information
yuuki3655 authored and copybara-androidxtest committed Mar 13, 2019
1 parent 5e9e639 commit 49c9e2f
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
12 changes: 12 additions & 0 deletions core/java/androidx/test/core/app/ActivityScenario.java
Original file line number Diff line number Diff line change
Expand Up @@ -558,4 +558,16 @@ public ActivityScenario<A> onActivity(final ActivityAction<A> action) {
public ActivityResult getResult() {
return activityInvoker.getActivityResult();
}

/**
* Returns the current activity state. The possible states are {@link State#CREATED}, {@link
* State#STARTED}, {@link State#RESUMED}, and {@link State#DESTROYED}.
*
* <p>This method cannot be called from the main thread except in Robolectric tests.
*/
public State getState() {
return checkNotNull(
getCurrentActivityState().state,
"Could not get current state due to the transition is incomplete.");
}
}
30 changes: 28 additions & 2 deletions core/javatests/androidx/test/core/app/ActivityScenarioTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public final class ActivityScenarioTest {
public void launchedActivityShouldBeResumed() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
assertThat(scenario.getState()).isEqualTo(State.RESUMED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.RESUMED);
Expand All @@ -54,13 +55,22 @@ public void launchedActivityShouldBeResumed() throws Exception {
@Test
public void finishItselfActivityShouldBeLaunchable() throws Exception {
try (ActivityScenario<FinishItselfActivity> scenario =
ActivityScenario.launch(FinishItselfActivity.class)) {}
ActivityScenario.launch(FinishItselfActivity.class)) {
// FinishItselfActivity calls #finish in its onCreate method. This triggers specialized
// lifecycle transition and onDestroy is invoked immediately after onCreate. (onStart and
// onResume are not invoked at all).
assertThat(scenario.getState()).isEqualTo(State.DESTROYED);
}
}

@Test
public void redirectingActivityShouldBeLaunchable() throws Exception {
try (ActivityScenario<RedirectingActivity> scenario =
ActivityScenario.launch(RedirectingActivity.class)) {}
ActivityScenario.launch(RedirectingActivity.class)) {
// RedirectingActivity starts RecreationRecordingActivity in its onCreate method so the
// state can be one of RESUMED, STARTED, CREATED, or DESTROYED based on the timing.
assertThat(scenario.getState()).isAtMost(State.RESUMED);
}
}

@Test
Expand All @@ -84,6 +94,7 @@ public void fromResumedToDestroyed() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.DESTROYED);
assertThat(scenario.getState()).isEqualTo(State.DESTROYED);
}
}

Expand All @@ -92,6 +103,7 @@ public void fromResumedToCreated() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
assertThat(scenario.getState()).isEqualTo(State.CREATED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.STOPPED);
Expand All @@ -105,6 +117,7 @@ public void fromResumedToStarted() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
assertThat(scenario.getState()).isEqualTo(State.STARTED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.PAUSED);
Expand All @@ -118,6 +131,7 @@ public void fromResumedToResumed() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.RESUMED);
assertThat(scenario.getState()).isEqualTo(State.RESUMED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.RESUMED);
Expand All @@ -132,6 +146,7 @@ public void fromCreatedToDestroyed() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
scenario.moveToState(State.DESTROYED);
assertThat(scenario.getState()).isEqualTo(State.DESTROYED);
}
}

Expand All @@ -141,6 +156,7 @@ public void fromCreatedToCreated() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
scenario.moveToState(State.CREATED);
assertThat(scenario.getState()).isEqualTo(State.CREATED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.STOPPED);
Expand All @@ -155,6 +171,7 @@ public void fromCreatedToStarted() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
scenario.moveToState(State.STARTED);
assertThat(scenario.getState()).isEqualTo(State.STARTED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.PAUSED);
Expand All @@ -169,6 +186,7 @@ public void fromCreatedToResumed() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
scenario.moveToState(State.RESUMED);
assertThat(scenario.getState()).isEqualTo(State.RESUMED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.RESUMED);
Expand All @@ -183,6 +201,7 @@ public void fromStartedToDestroyed() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
scenario.moveToState(State.DESTROYED);
assertThat(scenario.getState()).isEqualTo(State.DESTROYED);
}
}

Expand All @@ -192,6 +211,7 @@ public void fromStartedToCreated() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
scenario.moveToState(State.CREATED);
assertThat(scenario.getState()).isEqualTo(State.CREATED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.STOPPED);
Expand All @@ -206,6 +226,7 @@ public void fromStartedToStarted() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
scenario.moveToState(State.STARTED);
assertThat(scenario.getState()).isEqualTo(State.STARTED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.PAUSED);
Expand All @@ -220,6 +241,7 @@ public void fromStartedToResumed() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
scenario.moveToState(State.RESUMED);
assertThat(scenario.getState()).isEqualTo(State.RESUMED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.RESUMED);
Expand All @@ -234,6 +256,7 @@ public void fromDestroyedToDestroyed() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.DESTROYED);
scenario.moveToState(State.DESTROYED);
assertThat(scenario.getState()).isEqualTo(State.DESTROYED);
}
}

Expand All @@ -243,6 +266,7 @@ public void recreateCreatedActivity() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.CREATED);
scenario.recreate();
assertThat(scenario.getState()).isEqualTo(State.CREATED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.STOPPED);
Expand All @@ -257,6 +281,7 @@ public void recreateStartedActivity() throws Exception {
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.moveToState(State.STARTED);
scenario.recreate();
assertThat(scenario.getState()).isEqualTo(State.STARTED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.PAUSED);
Expand All @@ -270,6 +295,7 @@ public void recreateResumedActivity() throws Exception {
try (ActivityScenario<RecreationRecordingActivity> scenario =
ActivityScenario.launch(RecreationRecordingActivity.class)) {
scenario.recreate();
assertThat(scenario.getState()).isEqualTo(State.RESUMED);
scenario.onActivity(
activity -> {
assertThat(lastLifeCycleTransition(activity)).isEqualTo(Stage.RESUMED);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,30 +43,35 @@ class ActivityScenarioKotlinTest {
fun basicUseCase() {
launchActivity<RecreationRecordingActivity>().use { scenario ->
with(scenario) {
assertThat(state).isEqualTo(State.RESUMED)
onActivity {
assertThat(it.numberOfRecreations).isEqualTo(0)
assertThat(lastLifeCycleTransition(it)).isEqualTo(Stage.RESUMED)
}

recreate()
assertThat(state).isEqualTo(State.RESUMED)
onActivity {
assertThat(it.numberOfRecreations).isEqualTo(1)
assertThat(lastLifeCycleTransition(it)).isEqualTo(Stage.RESUMED)
}

moveToState(State.STARTED)
assertThat(state).isEqualTo(State.STARTED)
onActivity {
assertThat(it.numberOfRecreations).isEqualTo(1)
assertThat(lastLifeCycleTransition(it)).isEqualTo(Stage.PAUSED)
}

moveToState(State.CREATED)
assertThat(state).isEqualTo(State.CREATED)
onActivity {
assertThat(it.numberOfRecreations).isEqualTo(1)
assertThat(lastLifeCycleTransition(it)).isEqualTo(Stage.STOPPED)
}

moveToState(State.RESUMED)
assertThat(state).isEqualTo(State.RESUMED)
onActivity {
it.setResult(RESULT_OK, Intent().setAction(Intent.ACTION_SEND))
it.finish()
Expand Down

0 comments on commit 49c9e2f

Please sign in to comment.