/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.trello.rxlifecycle.components;
import com.trello.rxlifecycle.LifecycleProvider;
import com.trello.rxlifecycle.android.ActivityEvent;
import com.trello.rxlifecycle.components.support.RxFragmentActivity;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
import rx.Observable;
import rx.observers.TestSubscriber;
import rx.subjects.PublishSubject;
import static org.junit.Assert.assertFalse;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class RxActivityLifecycleTest {
private Observable<Object> observable;
@Before
public void setup() {
observable = PublishSubject.create().asObservable();
}
@Test
public void testRxActivity() {
testLifecycle(Robolectric.buildActivity(TestRxActivity.class));
testBindUntilEvent(Robolectric.buildActivity(TestRxActivity.class));
testBindToLifecycle(Robolectric.buildActivity(TestRxActivity.class));
}
@Test
public void testRxFragmentActivity() {
testLifecycle(Robolectric.buildActivity(TestRxFragmentActivity.class));
testBindUntilEvent(Robolectric.buildActivity(TestRxFragmentActivity.class));
testBindToLifecycle(Robolectric.buildActivity(TestRxFragmentActivity.class));
}
@Test
public void testRxAppCompatActivity() {
// TODO: Doesn't work due to https://github.com/robolectric/robolectric/issues/1796
//
// testBindUntilEvent(Robolectric.buildActivity(RxAppCompatActivity.class));
// testBindToLifecycle(Robolectric.buildActivity(RxAppCompatActivity.class));
}
private void testLifecycle(ActivityController<? extends LifecycleProvider<ActivityEvent>> controller) {
LifecycleProvider<ActivityEvent> activity = controller.get();
TestSubscriber<ActivityEvent> testSubscriber = new TestSubscriber<>();
activity.lifecycle().subscribe(testSubscriber);
controller.create();
controller.start();
controller.resume();
controller.pause();
controller.stop();
controller.destroy();
testSubscriber.assertValues(
ActivityEvent.CREATE,
ActivityEvent.START,
ActivityEvent.RESUME,
ActivityEvent.PAUSE,
ActivityEvent.STOP,
ActivityEvent.DESTROY
);
}
// Tests bindUntil for any given RxActivityLifecycle implementation
private void testBindUntilEvent(ActivityController<? extends LifecycleProvider<ActivityEvent>> controller) {
LifecycleProvider<ActivityEvent> activity = controller.get();
TestSubscriber<Object> testSubscriber = new TestSubscriber<>();
observable.compose(activity.bindUntilEvent(ActivityEvent.STOP)).subscribe(testSubscriber);
controller.create();
assertFalse(testSubscriber.isUnsubscribed());
controller.start();
assertFalse(testSubscriber.isUnsubscribed());
controller.resume();
assertFalse(testSubscriber.isUnsubscribed());
controller.pause();
assertFalse(testSubscriber.isUnsubscribed());
controller.stop();
testSubscriber.assertCompleted();
testSubscriber.assertUnsubscribed();
}
// Tests bindToLifecycle for any given RxActivityLifecycle implementation
private void testBindToLifecycle(ActivityController<? extends LifecycleProvider<ActivityEvent>> controller) {
LifecycleProvider<ActivityEvent> activity = controller.get();
controller.create();
TestSubscriber<Object> createTestSub = new TestSubscriber<>();
observable.compose(activity.bindToLifecycle()).subscribe(createTestSub);
controller.start();
assertFalse(createTestSub.isUnsubscribed());
TestSubscriber<Object> startTestSub = new TestSubscriber<>();
observable.compose(activity.bindToLifecycle()).subscribe(startTestSub);
controller.resume();
assertFalse(createTestSub.isUnsubscribed());
assertFalse(startTestSub.isUnsubscribed());
TestSubscriber<Object> resumeTestSub = new TestSubscriber<>();
observable.compose(activity.bindToLifecycle()).subscribe(resumeTestSub);
controller.pause();
assertFalse(createTestSub.isUnsubscribed());
assertFalse(startTestSub.isUnsubscribed());
resumeTestSub.assertCompleted();
resumeTestSub.assertUnsubscribed();
TestSubscriber<Object> pauseTestSub = new TestSubscriber<>();
observable.compose(activity.bindToLifecycle()).subscribe(pauseTestSub);
controller.stop();
assertFalse(createTestSub.isUnsubscribed());
startTestSub.assertCompleted();
startTestSub.assertUnsubscribed();
pauseTestSub.assertCompleted();
pauseTestSub.assertUnsubscribed();
TestSubscriber<Object> stopTestSub = new TestSubscriber<>();
observable.compose(activity.bindToLifecycle()).subscribe(stopTestSub);
controller.destroy();
createTestSub.assertCompleted();
createTestSub.assertUnsubscribed();
stopTestSub.assertCompleted();
stopTestSub.assertUnsubscribed();
}
// These classes are just for testing since components are abstract
public static class TestRxActivity extends RxActivity {
}
public static class TestRxFragmentActivity extends RxFragmentActivity{
}
}