18524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets/*
28524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * Copyright (C) 2017 The Android Open Source Project
38524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets *
48524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
58524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * you may not use this file except in compliance with the License.
68524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * You may obtain a copy of the License at
78524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets *
88524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
98524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets *
108524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * Unless required by applicable law or agreed to in writing, software
118524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
128524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * See the License for the specific language governing permissions and
148524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets * limitations under the License.
158524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets */
168524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
178524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetspackage com.android.support.lifecycle;
188524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
198524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport static android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks;
208524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
218524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport static com.android.support.lifecycle.testapp.LiveDataTestActivity.LIVE_DATA_VALUE;
228524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
238524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport static org.hamcrest.MatcherAssert.assertThat;
248524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport static org.hamcrest.Matchers.is;
258524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
268524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport android.os.Bundle;
278524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport android.support.test.filters.SmallTest;
288524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport android.support.test.rule.ActivityTestRule;
298524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport android.support.v4.app.Fragment;
308524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport android.support.v4.app.FragmentManager;
318524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
328524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport com.android.support.lifecycle.testapp.LiveDataTestActivity;
338524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
348524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport org.junit.Assert;
358524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport org.junit.Rule;
368524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetsimport org.junit.Test;
378524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
388524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets@SmallTest
398524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinetspublic class LiveDataTransactionTest {
408524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
418524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    @Rule
428524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    public ActivityTestRule<LiveDataTestActivity> mActivityTestRule =
438524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            new ActivityTestRule<>(LiveDataTestActivity.class);
448524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
458524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    private boolean mVisited;
468524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
478524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    @Test
488524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    public void transactionInOnStateChanged() throws Throwable {
498524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        LiveDataTestActivity activity = mActivityTestRule.getActivity();
508524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
518524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        activity.getSupportFragmentManager().registerFragmentLifecycleCallbacks(
528524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                new FragmentLifecycleCallbacks() {
538524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    @Override
548524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    public void onFragmentCreated(FragmentManager fm, Fragment f,
558524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                            Bundle savedInstanceState) {
568524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    }
578524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                }, true);
588524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        mActivityTestRule.runOnUiThread(() -> {
598524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            assertThat(activity.fragmentsNumber,  /** 2^MAX_DEPTH - 1 */ is(31));
608524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            activity.viewModel.liveData.observe(activity,
618524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    s -> Assert.fail("savedInstance state triggered an update"));
628524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        });
638524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        LiveDataTestActivity newActivity = TestUtils.recreateActivity(activity,
648524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                mActivityTestRule);
658524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        TestUtils.waitTillResumed(newActivity, mActivityTestRule);
668524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        mActivityTestRule.runOnUiThread(() -> {
678524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            newActivity.viewModel.liveData.observe(newActivity,
688524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    s -> {
698524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                        assertThat(s, is(LIVE_DATA_VALUE));
708524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                        mVisited = true;
718524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets                    });
728524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            assertThat(newActivity.fragmentsNumber, /** 2 * (2^MAX_DEPTH - 1) + 1 */is(63));
738524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets            assertThat(mVisited, is(true));
748524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets        });
758524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets    }
768524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets
778524c13c97e2c80d270b03f97f8eac5fbd585c5aSergey Vasilinets}
78