LifecycleTest.java revision ece840b115d531454d8f59533c7340ea05a4ba54
15efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang/*
25efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Copyright (C) 2016 The Android Open Source Project
35efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
45efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Licensed under the Apache License, Version 2.0 (the "License");
55efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * you may not use this file except in compliance with the License.
65efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * You may obtain a copy of the License at
75efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
85efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *      http://www.apache.org/licenses/LICENSE-2.0
95efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Unless required by applicable law or agreed to in writing, software
115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * distributed under the License is distributed on an "AS IS" BASIS,
125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * See the License for the specific language governing permissions and
145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * limitations under the License.
155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang */
165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpackage com.android.settingslib.core.lifecycle;
175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
18ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport static android.arch.lifecycle.Lifecycle.Event.ON_START;
19ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
20ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport static com.google.common.truth.Truth.assertThat;
21ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.content.Context;
235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.Menu;
245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.MenuInflater;
255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.view.MenuItem;
265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
274ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantlerimport com.android.settingslib.SettingsLibRobolectricTestRunner;
285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.TestConfig;
295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnAttach;
305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnDestroy;
325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPause;
345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnResume;
365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStart;
375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.events.OnStop;
385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
39ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantlerimport org.junit.Before;
405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.Test;
415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.runner.RunWith;
425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.Robolectric;
43f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.ActivityController;
44f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantlerimport org.robolectric.android.controller.FragmentController;
455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.annotation.Config;
465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
474ca9ebd5d355b72eb6076b5cce68968ea9d794c3Tony Mantler@RunWith(SettingsLibRobolectricTestRunner.class)
485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpublic class LifecycleTest {
505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
51ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    private Lifecycle mLifecycle;
52ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestDialogFragment extends ObservableDialogFragment {
545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mFragObserver;
565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestDialogFragment() {
585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mFragObserver = new TestObserver();
595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mLifecycle.addObserver(mFragObserver);
605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestFragment extends ObservableFragment {
645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mFragObserver;
665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestFragment() {
685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mFragObserver = new TestObserver();
695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            getLifecycle().addObserver(mFragObserver);
705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestActivity extends ObservableActivity {
745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final TestObserver mActObserver;
765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public TestActivity() {
785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mActObserver = new TestObserver();
795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            getLifecycle().addObserver(mActObserver);
805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
815efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public static class TestObserver implements LifecycleObserver, OnAttach, OnStart, OnResume,
855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            OnPause, OnStop, OnDestroy, OnCreateOptionsMenu, OnPrepareOptionsMenu,
865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            OnOptionsItemSelected {
875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnAttachObserved;
895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnAttachHasContext;
905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnStartObserved;
915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnResumeObserved;
925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnPauseObserved;
935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnStopObserved;
945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnDestroyObserved;
955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnCreateOptionsMenuObserved;
965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnPrepareOptionsMenuObserved;
975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        boolean mOnOptionsItemSelectedObserved;
985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onAttach(Context context) {
1015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnAttachObserved = true;
1025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnAttachHasContext = context != null;
1035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1045efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1055efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onStart() {
1075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnStartObserved = true;
1085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onPause() {
1125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnPauseObserved = true;
1135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onResume() {
1175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnResumeObserved = true;
1185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onStop() {
1225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnStopObserved = true;
1235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onDestroy() {
1275efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnDestroyObserved = true;
1285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnCreateOptionsMenuObserved = true;
1335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean onOptionsItemSelected(MenuItem menuItem) {
1375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnOptionsItemSelectedObserved = true;
1385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            return true;
1395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
1425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public void onPrepareOptionsMenu(Menu menu) {
1435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            mOnPrepareOptionsMenuObserved = true;
1445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
1455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
147ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    @Before
148ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    public void setUp() {
149ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler        mLifecycle = new Lifecycle(() -> mLifecycle);
150ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler    }
151ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler
1525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
1535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughActivityLifecycles_shouldObserveEverything() {
1545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
1555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestActivity activity = ac.get();
1565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.start();
1585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnStartObserved).isTrue();
1595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.resume();
1605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnResumeObserved).isTrue();
1615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onCreateOptionsMenu(null);
1625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnCreateOptionsMenuObserved).isTrue();
1635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onPrepareOptionsMenu(null);
1645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnPrepareOptionsMenuObserved).isTrue();
1655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        activity.onOptionsItemSelected(null);
1665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnOptionsItemSelectedObserved).isTrue();
1675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.pause();
1685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnPauseObserved).isTrue();
1695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.stop();
1705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnStopObserved).isTrue();
1715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        ac.destroy();
1725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(activity.mActObserver.mOnDestroyObserved).isTrue();
1735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
1765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughDialogFragmentLifecycles_shouldObserveEverything() {
1775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestDialogFragment> fragmentController =
1785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestDialogFragment.class);
1795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestDialogFragment fragment = fragmentController.get();
1805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
181f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
1825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
1835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
1845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
1855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
1865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
1885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
1895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
1905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
1915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
1925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
1935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
1945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
1955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
1965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
1975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
1985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
2005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void runThroughFragmentLifecycles_shouldObserveEverything() {
2015efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestFragment> fragmentController =
2025efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestFragment.class);
2035efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestFragment fragment = fragmentController.get();
2045efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
205f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
2065efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
2075efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
2085efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
2095efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
2105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
2125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
2135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
2145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
2155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
2165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
2175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
2185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
2195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
2205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
2215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
2225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
22389cff1ab753290860444da2bd40bf1a9734471daFan Zhang    @Test
22489cff1ab753290860444da2bd40bf1a9734471daFan Zhang    public void addObserverDuringObserve_shoudNotCrash() {
225ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler        mLifecycle.addObserver(new OnStartObserver(mLifecycle));
226ece840b115d531454d8f59533c7340ea05a4ba54Tony Mantler        mLifecycle.handleLifecycleEvent(ON_START);
22789cff1ab753290860444da2bd40bf1a9734471daFan Zhang    }
22889cff1ab753290860444da2bd40bf1a9734471daFan Zhang
2295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private static class OptionItemAccepter implements LifecycleObserver, OnOptionsItemSelected {
2305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean wasCalled = false;
2315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        @Override
2335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        public boolean onOptionsItemSelected(MenuItem menuItem) {
2345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            wasCalled = true;
2355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang            return false;
2365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        }
2375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
2385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
2405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() {
2415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        FragmentController<TestFragment> fragmentController =
2425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                Robolectric.buildFragment(TestFragment.class);
2435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        TestFragment fragment = fragmentController.get();
2445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        OptionItemAccepter accepter = new OptionItemAccepter();
2455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.getLifecycle().addObserver(accepter);
2465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
247f6631bf618477372bca3d4accae96553af2ae1d3Tony Mantler        fragmentController.create().start().resume();
2485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onCreateOptionsMenu(null, null);
2495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onPrepareOptionsMenu(null);
2505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragment.onOptionsItemSelected(null);
2515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        fragmentController.pause().stop().destroy();
2525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
2535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(accepter.wasCalled).isFalse();
2545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
25589cff1ab753290860444da2bd40bf1a9734471daFan Zhang
25689cff1ab753290860444da2bd40bf1a9734471daFan Zhang    private class OnStartObserver implements LifecycleObserver, OnStart {
25789cff1ab753290860444da2bd40bf1a9734471daFan Zhang
25889cff1ab753290860444da2bd40bf1a9734471daFan Zhang        private final Lifecycle mLifecycle;
25989cff1ab753290860444da2bd40bf1a9734471daFan Zhang
26089cff1ab753290860444da2bd40bf1a9734471daFan Zhang        public OnStartObserver(Lifecycle lifecycle) {
26189cff1ab753290860444da2bd40bf1a9734471daFan Zhang            mLifecycle = lifecycle;
26289cff1ab753290860444da2bd40bf1a9734471daFan Zhang        }
26389cff1ab753290860444da2bd40bf1a9734471daFan Zhang
26489cff1ab753290860444da2bd40bf1a9734471daFan Zhang        @Override
26589cff1ab753290860444da2bd40bf1a9734471daFan Zhang        public void onStart() {
26689cff1ab753290860444da2bd40bf1a9734471daFan Zhang            mLifecycle.addObserver(new LifecycleObserver() {
26789cff1ab753290860444da2bd40bf1a9734471daFan Zhang            });
26889cff1ab753290860444da2bd40bf1a9734471daFan Zhang        }
26989cff1ab753290860444da2bd40bf1a9734471daFan Zhang    }
2705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang}
271