LiveDataTest.java revision 0b5883440daa7d68a80c08625866952c86071028
1c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar/*
264db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar * Copyright (C) 2017 The Android Open Source Project
3c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar *
4c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * you may not use this file except in compliance with the License.
6c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * You may obtain a copy of the License at
7c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar *
8c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar *
10c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * Unless required by applicable law or agreed to in writing, software
11c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * See the License for the specific language governing permissions and
14c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * limitations under the License.
15c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar */
16c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage android.arch.lifecycle;
18c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
19b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
20b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
21b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
22b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
23b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_START;
24b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
25c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
26c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.CoreMatchers.instanceOf;
27c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.CoreMatchers.is;
28c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.MatcherAssert.assertThat;
29c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyBoolean;
30c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyString;
31c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.mock;
32c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.never;
33c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.reset;
344d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyarimport static org.mockito.Mockito.spy;
35c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.verify;
36c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.verifyNoMoreInteractions;
37c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.when;
38c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
39ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyarimport android.arch.core.executor.ArchTaskExecutor;
4064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.util.InstantTaskExecutor;
41b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.annotation.Nullable;
4234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
4334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.After;
44c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Before;
45c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Test;
46d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.junit.runner.RunWith;
47d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.junit.runners.JUnit4;
480b5883440daa7d68a80c08625866952c86071028shepshapardimport org.mockito.ArgumentCaptor;
49d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.mockito.InOrder;
50c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinetsimport org.mockito.Mockito;
51c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
52c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar@SuppressWarnings({"unchecked"})
53d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets@RunWith(JUnit4.class)
54c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarpublic class LiveDataTest {
55c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    private PublicLiveData<String> mLiveData;
560b5883440daa7d68a80c08625866952c86071028shepshapard    private MethodExec mActiveObserversChanged;
570b5883440daa7d68a80c08625866952c86071028shepshapard
58e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    private LifecycleOwner mOwner;
59c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    private LifecycleRegistry mRegistry;
600b5883440daa7d68a80c08625866952c86071028shepshapard
610b5883440daa7d68a80c08625866952c86071028shepshapard    private LifecycleOwner mOwner2;
625cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    private LifecycleRegistry mRegistry2;
630b5883440daa7d68a80c08625866952c86071028shepshapard
640b5883440daa7d68a80c08625866952c86071028shepshapard    private LifecycleOwner mOwner3;
650b5883440daa7d68a80c08625866952c86071028shepshapard    private Lifecycle mLifecycle3;
660b5883440daa7d68a80c08625866952c86071028shepshapard    private Observer<String> mObserver3;
670b5883440daa7d68a80c08625866952c86071028shepshapard
680b5883440daa7d68a80c08625866952c86071028shepshapard    private LifecycleOwner mOwner4;
690b5883440daa7d68a80c08625866952c86071028shepshapard    private Lifecycle mLifecycle4;
700b5883440daa7d68a80c08625866952c86071028shepshapard    private Observer<String> mObserver4;
710b5883440daa7d68a80c08625866952c86071028shepshapard
72c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    private boolean mInObserver;
73c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
74c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Before
75c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void init() {
76c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData = new PublicLiveData<>();
775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
785cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mActiveObserversChanged = mock(MethodExec.class);
795cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.activeObserversChanged = mActiveObserversChanged;
805cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
81e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mOwner = mock(LifecycleOwner.class);
82e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mRegistry = new LifecycleRegistry(mOwner);
83e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        when(mOwner.getLifecycle()).thenReturn(mRegistry);
845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
855cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mOwner2 = mock(LifecycleOwner.class);
865cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry2 = new LifecycleRegistry(mOwner2);
875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        when(mOwner2.getLifecycle()).thenReturn(mRegistry2);
885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
89c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        mInObserver = false;
90c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
91c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
9234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Before
930b5883440daa7d68a80c08625866952c86071028shepshapard    public void initNonLifecycleRegistry() {
940b5883440daa7d68a80c08625866952c86071028shepshapard        mOwner3 = mock(LifecycleOwner.class);
950b5883440daa7d68a80c08625866952c86071028shepshapard        mLifecycle3 = mock(Lifecycle.class);
960b5883440daa7d68a80c08625866952c86071028shepshapard        mObserver3 = (Observer<String>) mock(Observer.class);
970b5883440daa7d68a80c08625866952c86071028shepshapard        when(mOwner3.getLifecycle()).thenReturn(mLifecycle3);
980b5883440daa7d68a80c08625866952c86071028shepshapard
990b5883440daa7d68a80c08625866952c86071028shepshapard        mOwner4 = mock(LifecycleOwner.class);
1000b5883440daa7d68a80c08625866952c86071028shepshapard        mLifecycle4 = mock(Lifecycle.class);
1010b5883440daa7d68a80c08625866952c86071028shepshapard        mObserver4 = (Observer<String>) mock(Observer.class);
1020b5883440daa7d68a80c08625866952c86071028shepshapard        when(mOwner4.getLifecycle()).thenReturn(mLifecycle4);
1030b5883440daa7d68a80c08625866952c86071028shepshapard    }
1040b5883440daa7d68a80c08625866952c86071028shepshapard
1050b5883440daa7d68a80c08625866952c86071028shepshapard    @Before
10634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void swapExecutorDelegate() {
107ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar        ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
10834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
10934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
11034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @After
11134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void removeExecutorDelegate() {
112ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar        ArchTaskExecutor.getInstance().setDelegate(null);
11334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
11434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
115c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
116c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testObserverToggle() {
117c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
118e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
119c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
120c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
121abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
122abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
123c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
124c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.removeObserver(observer);
125c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
126abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
127abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
128c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
129c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
130c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
131c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testActiveObserverToggle() {
132c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
133e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
134c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
135c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
136abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
137abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
138c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
139c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
140c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(true);
141abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(true));
1424d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        reset(mActiveObserversChanged);
143c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
144c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_STOP);
145c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(false);
146abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
147abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
148c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
1494d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        reset(mActiveObserversChanged);
150c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
151c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(true);
152abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(true));
153abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
154c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
1554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        reset(mActiveObserversChanged);
156c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.removeObserver(observer);
157c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(false);
158abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
159abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
160c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
1614d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        verifyNoMoreInteractions(mActiveObserversChanged);
162c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
163c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
164c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
165c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testReAddSameObserverTuple() {
166c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
167e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
168e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
169abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
170c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
171c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
172c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
173e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    public void testAdd2ObserversWithSameOwnerAndRemove() {
174c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> o1 = (Observer<String>) mock(Observer.class);
175c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> o2 = (Observer<String>) mock(Observer.class);
176e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, o1);
177e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, o2);
178abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
179c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
180c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
181c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
182c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(true);
183c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.setValue("a");
184c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(o1).onChanged("a");
185c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(o2).onChanged("a");
186c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
187e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.removeObservers(mOwner);
188c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
189abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
19080f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets        assertThat(mRegistry.getObserverCount(), is(0));
191c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
192c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
193c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
194e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    public void testAddSameObserverIn2LifecycleOwners() {
195c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
196c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
197e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
198c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Throwable throwable = null;
199c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        try {
2005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard            mLiveData.observe(mOwner2, observer);
201c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        } catch (Throwable t) {
202c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar            throwable = t;
203c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        }
204c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        assertThat(throwable, instanceOf(IllegalArgumentException.class));
205c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        //noinspection ConstantConditions
206c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        assertThat(throwable.getMessage(),
207c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                is("Cannot add the same observer with different lifecycles"));
208c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
209c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
210c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
211c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testRemoveDestroyedObserver() {
212c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
213e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
214c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
215c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(true);
216abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
217abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(true));
2184d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar
2194d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        reset(mActiveObserversChanged);
220c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
221c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_DESTROY);
222abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
223abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
224c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(mActiveObserversChanged).onCall(false);
225c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
226c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
227c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
228c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testInactiveRegistry() {
229c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
230c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_DESTROY);
231e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
232abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
233c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
234c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
235c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
236c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    public void testNotifyActiveInactive() {
237c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
238c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_CREATE);
239e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
240c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.setValue("a");
241c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer, never()).onChanged(anyString());
242c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
243c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer).onChanged("a");
244c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
245c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.setValue("b");
246c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer).onChanged("b");
247c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
248c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_STOP);
249c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.setValue("c");
250c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer, never()).onChanged("c");
251c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
252c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
253c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer).onChanged("c");
254c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
255c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        reset(observer);
256c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_STOP);
257c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
258c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        verify(observer, never()).onChanged(anyString());
259c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
260c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
261c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
262e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    public void testStopObservingOwner_onDestroy() {
263c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
264c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_CREATE);
265e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
26680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets        assertThat(mRegistry.getObserverCount(), is(1));
267c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_DESTROY);
26880f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets        assertThat(mRegistry.getObserverCount(), is(0));
269c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
270c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
271c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @Test
272e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    public void testStopObservingOwner_onStopObserving() {
273c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
274c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mRegistry.handleLifecycleEvent(ON_CREATE);
275e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
27680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets        assertThat(mRegistry.getObserverCount(), is(1));
277c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
278c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        mLiveData.removeObserver(observer);
27980f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets        assertThat(mRegistry.getObserverCount(), is(0));
280c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
281c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
2824d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    @Test
2834d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    public void testActiveChangeInCallback() {
2844d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
285c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        Observer<String> observer1 = spy(new Observer<String>() {
2864d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            @Override
2874d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            public void onChanged(@Nullable String s) {
2884d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar                mRegistry.handleLifecycleEvent(ON_STOP);
289abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasObservers(), is(true));
290abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasActiveObservers(), is(false));
2914d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            }
2924d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        });
293c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        final Observer observer2 = mock(Observer.class);
294e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer1);
295e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer2);
2964d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mLiveData.setValue("bla");
297c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer1).onChanged(anyString());
298c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer2, Mockito.never()).onChanged(anyString());
299abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
300abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
3014d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    }
3024d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar
3034d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    @Test
304c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    public void testActiveChangeInCallback2() {
305c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        Observer<String> observer1 = spy(new Observer<String>() {
306c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            @Override
307c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            public void onChanged(@Nullable String s) {
308c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                assertThat(mInObserver, is(false));
309c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = true;
310c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mRegistry.handleLifecycleEvent(ON_START);
311abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasActiveObservers(), is(true));
312c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = false;
313c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            }
314c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        });
315c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        final Observer observer2 = spy(new FailReentranceObserver());
316d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets        mLiveData.observeForever(observer1);
317e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer2);
318c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        mLiveData.setValue("bla");
319c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer1).onChanged(anyString());
320c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer2).onChanged(anyString());
321abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
322abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(true));
323c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    }
324c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets
325c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    @Test
3264d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    public void testObserverRemovalInCallback() {
3274d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
3284d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        Observer<String> observer = spy(new Observer<String>() {
3294d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            @Override
3304d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            public void onChanged(@Nullable String s) {
331abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasObservers(), is(true));
332c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mLiveData.removeObserver(this);
333abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasObservers(), is(false));
3344d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            }
3354d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        });
336e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
3374d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mLiveData.setValue("bla");
3384d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        verify(observer).onChanged(anyString());
339abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(false));
3404d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    }
3414d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar
3424d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    @Test
3434d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    public void testObserverAdditionInCallback() {
3444d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
345c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        final Observer observer2 = spy(new FailReentranceObserver());
346c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        Observer<String> observer1 = spy(new Observer<String>() {
3474d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            @Override
3484d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            public void onChanged(@Nullable String s) {
349c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                assertThat(mInObserver, is(false));
350c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = true;
351e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets                mLiveData.observe(mOwner, observer2);
352abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasObservers(), is(true));
353abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets                assertThat(mLiveData.hasActiveObservers(), is(true));
354c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = false;
3554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            }
3564d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        });
357e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer1);
3584d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        mLiveData.setValue("bla");
359c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer1).onChanged(anyString());
360c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer2).onChanged(anyString());
361abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasObservers(), is(true));
362abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(true));
3634d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar    }
3644d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar
3657c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets    @Test
366e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets    public void testObserverWithoutLifecycleOwner() {
3677c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        Observer<String> observer = (Observer<String>) mock(Observer.class);
3687c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        mLiveData.setValue("boring");
369d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets        mLiveData.observeForever(observer);
3707c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        verify(mActiveObserversChanged).onCall(true);
3717c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        verify(observer).onChanged("boring");
3727c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        mLiveData.setValue("tihs");
3737c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        verify(observer).onChanged("tihs");
3747c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        mLiveData.removeObserver(observer);
3757c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        verify(mActiveObserversChanged).onCall(false);
3767c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        mLiveData.setValue("boring");
3777c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        reset(observer);
3787c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
3797c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets    }
3807c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets
381c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    @Test
382c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    public void testSetValueDuringSetValue() {
383c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        mRegistry.handleLifecycleEvent(ON_START);
384c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        final Observer observer1 = spy(new Observer<String>() {
385c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            @Override
386c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            public void onChanged(String o) {
387c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                assertThat(mInObserver, is(false));
388c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = true;
389c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                if (o.equals(("bla"))) {
390c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                    mLiveData.setValue("gt");
391c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                }
392c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets                mInObserver = false;
393c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            }
394c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        });
395c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        final Observer observer2 = spy(new FailReentranceObserver());
396e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer1);
397e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer2);
398c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        mLiveData.setValue("bla");
399c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer1, Mockito.atMost(2)).onChanged("gt");
400c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        verify(observer2, Mockito.atMost(2)).onChanged("gt");
401c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    }
402c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets
4035dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar    @Test
4043facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets    public void testRemoveDuringSetValue() {
4053facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        mRegistry.handleLifecycleEvent(ON_START);
4063facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        final Observer observer1 = spy(new Observer<String>() {
4073facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets            @Override
4083facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets            public void onChanged(String o) {
4093facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets                mLiveData.removeObserver(this);
4103facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets            }
4113facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        });
4123facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        Observer<String> observer2 = (Observer<String>) mock(Observer.class);
4133facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        mLiveData.observeForever(observer1);
4143facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        mLiveData.observe(mOwner, observer2);
4153facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        mLiveData.setValue("gt");
4163facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets        verify(observer2).onChanged("gt");
4173facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets    }
4183facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets
4193facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets    @Test
4205dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar    public void testDataChangeDuringStateChange() {
4215dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mRegistry.handleLifecycleEvent(ON_START);
4225dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mRegistry.addObserver(new LifecycleObserver() {
4235dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar            @OnLifecycleEvent(ON_STOP)
4245dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar            public void onStop() {
4255dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar                // change data in onStop, observer should not be called!
4265dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar                mLiveData.setValue("b");
4275dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar            }
4285dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        });
4295dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        Observer<String> observer = (Observer<String>) mock(Observer.class);
4305dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mLiveData.setValue("a");
431e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets        mLiveData.observe(mOwner, observer);
4325dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        verify(observer).onChanged("a");
4335dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mRegistry.handleLifecycleEvent(ON_PAUSE);
4345dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mRegistry.handleLifecycleEvent(ON_STOP);
4355dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        verify(observer, never()).onChanged("b");
4365dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar
4375dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        mRegistry.handleLifecycleEvent(ON_RESUME);
4385dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar        verify(observer).onChanged("b");
4395dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar    }
4405dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar
4410da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets    @Test
4420da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets    public void testNotCallInactiveWithObserveForever() {
4430da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        mRegistry.handleLifecycleEvent(ON_START);
4440da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        Observer<String> observer = (Observer<String>) mock(Observer.class);
4450da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        Observer<String> observer2 = (Observer<String>) mock(Observer.class);
4460da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        mLiveData.observe(mOwner, observer);
4470da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        mLiveData.observeForever(observer2);
4480da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        verify(mActiveObserversChanged).onCall(true);
4490da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        reset(mActiveObserversChanged);
4500da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        mRegistry.handleLifecycleEvent(ON_STOP);
4510da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
4520da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        mRegistry.handleLifecycleEvent(ON_START);
4530da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
4540da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets    }
4550da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets
456d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    @Test
457d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    public void testRemoveDuringAddition() {
458d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mRegistry.handleLifecycleEvent(ON_START);
459d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mLiveData.setValue("bla");
460d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mLiveData.observeForever(new Observer<String>() {
461d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            @Override
462d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            public void onChanged(@Nullable String s) {
463d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets                mLiveData.removeObserver(this);
464d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            }
465d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        });
466d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
467d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        InOrder inOrder = Mockito.inOrder(mActiveObserversChanged);
468d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verify(mActiveObserversChanged).onCall(true);
469d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verify(mActiveObserversChanged).onCall(false);
470d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verifyNoMoreInteractions();
471d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    }
472d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets
473d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    @Test
474d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    public void testRemoveDuringBringingUpToState() {
475d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mLiveData.setValue("bla");
476d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mLiveData.observeForever(new Observer<String>() {
477d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            @Override
478d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            public void onChanged(@Nullable String s) {
479d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets                mLiveData.removeObserver(this);
480d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets            }
481d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        });
482d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        mRegistry.handleLifecycleEvent(ON_RESUME);
483d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        assertThat(mLiveData.hasActiveObservers(), is(false));
484d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        InOrder inOrder = Mockito.inOrder(mActiveObserversChanged);
485d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verify(mActiveObserversChanged).onCall(true);
486d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verify(mActiveObserversChanged).onCall(false);
487d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets        inOrder.verifyNoMoreInteractions();
488d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets    }
489d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets
4905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
4915cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_neverActive_observerOnChangedNotCalled() {
4925cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer = (Observer<String>) mock(Observer.class);
4935cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer);
4945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
4955cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
4965cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
4975cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer, never()).onChanged(anyString());
4985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
4995cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5015cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversTwoStartedOwners_onChangedCalledOnBoth() {
5025cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5035cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5045cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5055cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5065cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5075cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5085cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5095cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
5105cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5115cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
5125cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5135cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer1).onChanged("1");
5145cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer2).onChanged("1");
5155cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5165cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5175cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5185cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversOneStartedOwner_onChangedCalledOnOneCorrectObserver() {
5195cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5205cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5215cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5225cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5235cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5245cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5255cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5265cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5275cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
5285cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5295cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer1).onChanged("1");
5305cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer2, never()).onChanged(anyString());
5315cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5325cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5335cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5345cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversBothStartedAfterSetValue_onChangedCalledOnBoth() {
5355cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5365cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5375cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5385cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5395cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5405cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5415cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
5425cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5435cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5445cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
5455cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5465cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer1).onChanged("1");
5475cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer1).onChanged("1");
5485cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5495cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5505cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5515cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversOneStartedAfterSetValue_onChangedCalledOnCorrectObserver() {
5525cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5535cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5545cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5555cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5565cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5575cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5585cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
5595cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5605cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5615cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5625cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer1).onChanged("1");
5635cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(observer2, never()).onChanged(anyString());
5645cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5665cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5675cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversOneStarted_liveDataBecomesActive() {
5685cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5695cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5705cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5715cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5725cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5735cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5745cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5755cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5765cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged).onCall(true);
5775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5785cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5795cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5805cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    public void setValue_twoObserversOneStopped_liveDataStaysActive() {
5815cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer1 = mock(Observer.class);
5825cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        Observer<String> observer2 = mock(Observer.class);
5835cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner, observer1);
5855cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.observe(mOwner2, observer2);
5865cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
5895cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged).onCall(true);
5915cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5925cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        reset(mActiveObserversChanged);
5935cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
5945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5955cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
5965cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
5975cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
5985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
5990b5883440daa7d68a80c08625866952c86071028shepshapard    public void setValue_lifecycleIsCreatedNoEvent_liveDataBecomesInactiveAndObserverNotCalled() {
6005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6010b5883440daa7d68a80c08625866952c86071028shepshapard        // Arrange.
6020b5883440daa7d68a80c08625866952c86071028shepshapard
6030b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner3, mObserver3);
6040b5883440daa7d68a80c08625866952c86071028shepshapard
6050b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver = getGenericLifecycleObserver(mLifecycle3);
6060b5883440daa7d68a80c08625866952c86071028shepshapard
6070b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
6080b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
6090b5883440daa7d68a80c08625866952c86071028shepshapard
6100b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
6115cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
612a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar        reset(mActiveObserversChanged);
6130b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver3);
6140b5883440daa7d68a80c08625866952c86071028shepshapard
6150b5883440daa7d68a80c08625866952c86071028shepshapard        // Act.
6165cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6175cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
618a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar
6190b5883440daa7d68a80c08625866952c86071028shepshapard        // Assert.
6200b5883440daa7d68a80c08625866952c86071028shepshapard
6210b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mActiveObserversChanged).onCall(false);
6220b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3, never()).onChanged(anyString());
6230b5883440daa7d68a80c08625866952c86071028shepshapard    }
6240b5883440daa7d68a80c08625866952c86071028shepshapard
6250b5883440daa7d68a80c08625866952c86071028shepshapard    /*
6260b5883440daa7d68a80c08625866952c86071028shepshapard     * Arrange: LiveData was made inactive via SetValue (because the Lifecycle it was
6270b5883440daa7d68a80c08625866952c86071028shepshapard     * observing was in the CREATED state and no event was dispatched).
6280b5883440daa7d68a80c08625866952c86071028shepshapard     * Act: Lifecycle enters Started state and dispatches event.
6290b5883440daa7d68a80c08625866952c86071028shepshapard     * Assert: LiveData becomes active and dispatches new value to observer.
6300b5883440daa7d68a80c08625866952c86071028shepshapard     */
6310b5883440daa7d68a80c08625866952c86071028shepshapard    @Test
6320b5883440daa7d68a80c08625866952c86071028shepshapard    public void test_liveDataInactiveViaSetValueThenLifecycleResumes() {
6330b5883440daa7d68a80c08625866952c86071028shepshapard
6340b5883440daa7d68a80c08625866952c86071028shepshapard        // Arrange.
6350b5883440daa7d68a80c08625866952c86071028shepshapard
6360b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner3, mObserver3);
6370b5883440daa7d68a80c08625866952c86071028shepshapard
6380b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver = getGenericLifecycleObserver(mLifecycle3);
6390b5883440daa7d68a80c08625866952c86071028shepshapard
6400b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
6410b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
6420b5883440daa7d68a80c08625866952c86071028shepshapard
6430b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
6440b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.setValue("1");
6455cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6465cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        reset(mActiveObserversChanged);
6470b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver3);
6480b5883440daa7d68a80c08625866952c86071028shepshapard
6490b5883440daa7d68a80c08625866952c86071028shepshapard        // Act.
6500b5883440daa7d68a80c08625866952c86071028shepshapard
6510b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
6520b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
6530b5883440daa7d68a80c08625866952c86071028shepshapard
6540b5883440daa7d68a80c08625866952c86071028shepshapard        // Assert.
6550b5883440daa7d68a80c08625866952c86071028shepshapard
6565cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged).onCall(true);
6570b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3).onChanged("1");
6585cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
6595cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6600b5883440daa7d68a80c08625866952c86071028shepshapard    /*
6610b5883440daa7d68a80c08625866952c86071028shepshapard     * Arrange: One of two Lifecycles enter the CREATED state without sending an event.
6620b5883440daa7d68a80c08625866952c86071028shepshapard     * Act: Lifecycle's setValue method is called with new value.
6630b5883440daa7d68a80c08625866952c86071028shepshapard     * Assert: LiveData stays active and new value is dispatched to Lifecycle that is still at least
6640b5883440daa7d68a80c08625866952c86071028shepshapard     * STARTED.
6655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard     */
6665cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    @Test
6670b5883440daa7d68a80c08625866952c86071028shepshapard    public void setValue_oneOfTwoLifecyclesAreCreatedNoEvent() {
6685cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6690b5883440daa7d68a80c08625866952c86071028shepshapard        // Arrange.
6705cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6710b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner3, mObserver3);
6720b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner4, mObserver4);
6730b5883440daa7d68a80c08625866952c86071028shepshapard
6740b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3);
6750b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4);
6760b5883440daa7d68a80c08625866952c86071028shepshapard
6770b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
6780b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
6790b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
6800b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START);
6810b5883440daa7d68a80c08625866952c86071028shepshapard
6820b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
6835cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        reset(mActiveObserversChanged);
6850b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver3);
6860b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver4);
6870b5883440daa7d68a80c08625866952c86071028shepshapard
6880b5883440daa7d68a80c08625866952c86071028shepshapard        // Act.
6895cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        mLiveData.setValue("1");
6910b5883440daa7d68a80c08625866952c86071028shepshapard
6920b5883440daa7d68a80c08625866952c86071028shepshapard        // Assert.
6930b5883440daa7d68a80c08625866952c86071028shepshapard
6945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
6950b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3, never()).onChanged(anyString());
6960b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver4).onChanged("1");
6970b5883440daa7d68a80c08625866952c86071028shepshapard    }
6985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
6990b5883440daa7d68a80c08625866952c86071028shepshapard    /*
7000b5883440daa7d68a80c08625866952c86071028shepshapard     * Arrange: Two observed Lifecycles enter the CREATED state without sending an event.
7010b5883440daa7d68a80c08625866952c86071028shepshapard     * Act: Lifecycle's setValue method is called with new value.
7020b5883440daa7d68a80c08625866952c86071028shepshapard     * Assert: LiveData becomes inactive and nothing is dispatched to either observer.
7030b5883440daa7d68a80c08625866952c86071028shepshapard     */
7040b5883440daa7d68a80c08625866952c86071028shepshapard    @Test
7050b5883440daa7d68a80c08625866952c86071028shepshapard    public void setValue_twoLifecyclesAreCreatedNoEvent() {
7060b5883440daa7d68a80c08625866952c86071028shepshapard
7070b5883440daa7d68a80c08625866952c86071028shepshapard        // Arrange.
7080b5883440daa7d68a80c08625866952c86071028shepshapard
7090b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner3, mObserver3);
7100b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner4, mObserver4);
7110b5883440daa7d68a80c08625866952c86071028shepshapard
7120b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3);
7130b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4);
7140b5883440daa7d68a80c08625866952c86071028shepshapard
7150b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
7160b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
7170b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
7180b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START);
7190b5883440daa7d68a80c08625866952c86071028shepshapard
7200b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
7210b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
7225cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
723a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar        reset(mActiveObserversChanged);
7240b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver3);
7250b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver4);
7260b5883440daa7d68a80c08625866952c86071028shepshapard
7270b5883440daa7d68a80c08625866952c86071028shepshapard        // Act.
7280b5883440daa7d68a80c08625866952c86071028shepshapard
7290b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.setValue("1");
7300b5883440daa7d68a80c08625866952c86071028shepshapard
7310b5883440daa7d68a80c08625866952c86071028shepshapard        // Assert.
7320b5883440daa7d68a80c08625866952c86071028shepshapard
7330b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mActiveObserversChanged).onCall(false);
7340b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3, never()).onChanged(anyString());
7350b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3, never()).onChanged(anyString());
7360b5883440daa7d68a80c08625866952c86071028shepshapard    }
7370b5883440daa7d68a80c08625866952c86071028shepshapard
7380b5883440daa7d68a80c08625866952c86071028shepshapard    /*
7390b5883440daa7d68a80c08625866952c86071028shepshapard     * Arrange: LiveData was made inactive via SetValue (because both Lifecycles it was
7400b5883440daa7d68a80c08625866952c86071028shepshapard     * observing were in the CREATED state and no event was dispatched).
7410b5883440daa7d68a80c08625866952c86071028shepshapard     * Act: One Lifecycle enters STARTED state and dispatches lifecycle event.
7420b5883440daa7d68a80c08625866952c86071028shepshapard     * Assert: LiveData becomes active and dispatches new value to observer associated with started
7430b5883440daa7d68a80c08625866952c86071028shepshapard     * Lifecycle.
7440b5883440daa7d68a80c08625866952c86071028shepshapard     */
7450b5883440daa7d68a80c08625866952c86071028shepshapard    @Test
7460b5883440daa7d68a80c08625866952c86071028shepshapard    public void test_liveDataInactiveViaSetValueThenOneLifecycleResumes() {
7470b5883440daa7d68a80c08625866952c86071028shepshapard
7480b5883440daa7d68a80c08625866952c86071028shepshapard        // Arrange.
7490b5883440daa7d68a80c08625866952c86071028shepshapard
7500b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner3, mObserver3);
7510b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.observe(mOwner4, mObserver4);
7520b5883440daa7d68a80c08625866952c86071028shepshapard
7530b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3);
7540b5883440daa7d68a80c08625866952c86071028shepshapard        GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4);
7550b5883440daa7d68a80c08625866952c86071028shepshapard
7560b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
7570b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
7580b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
7590b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START);
7600b5883440daa7d68a80c08625866952c86071028shepshapard
7610b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
7620b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.CREATED);
7630b5883440daa7d68a80c08625866952c86071028shepshapard
7640b5883440daa7d68a80c08625866952c86071028shepshapard        mLiveData.setValue("1");
7655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
766a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar        reset(mActiveObserversChanged);
7670b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver3);
7680b5883440daa7d68a80c08625866952c86071028shepshapard        reset(mObserver4);
7690b5883440daa7d68a80c08625866952c86071028shepshapard
7700b5883440daa7d68a80c08625866952c86071028shepshapard        // Act.
7710b5883440daa7d68a80c08625866952c86071028shepshapard
7720b5883440daa7d68a80c08625866952c86071028shepshapard        when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED);
7730b5883440daa7d68a80c08625866952c86071028shepshapard        lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START);
7740b5883440daa7d68a80c08625866952c86071028shepshapard
7750b5883440daa7d68a80c08625866952c86071028shepshapard        // Assert.
7760b5883440daa7d68a80c08625866952c86071028shepshapard
7775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard        verify(mActiveObserversChanged).onCall(true);
7780b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver3).onChanged("1");
7790b5883440daa7d68a80c08625866952c86071028shepshapard        verify(mObserver4, never()).onChanged(anyString());
7800b5883440daa7d68a80c08625866952c86071028shepshapard    }
7810b5883440daa7d68a80c08625866952c86071028shepshapard
7820b5883440daa7d68a80c08625866952c86071028shepshapard    private GenericLifecycleObserver getGenericLifecycleObserver(Lifecycle lifecycle) {
7830b5883440daa7d68a80c08625866952c86071028shepshapard        ArgumentCaptor<GenericLifecycleObserver> captor =
7840b5883440daa7d68a80c08625866952c86071028shepshapard                ArgumentCaptor.forClass(GenericLifecycleObserver.class);
7850b5883440daa7d68a80c08625866952c86071028shepshapard        verify(lifecycle).addObserver(captor.capture());
7860b5883440daa7d68a80c08625866952c86071028shepshapard        return (captor.getValue());
7875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard    }
7885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard
789c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    @SuppressWarnings("WeakerAccess")
790c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    static class PublicLiveData<T> extends LiveData<T> {
791c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        // cannot spy due to internal calls
792c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        public MethodExec activeObserversChanged;
793c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
794c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        @Override
7954d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        protected void onActive() {
796c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar            if (activeObserversChanged != null) {
7974d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar                activeObserversChanged.onCall(true);
798c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar            }
799c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        }
800c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
801c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        @Override
8024d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar        protected void onInactive() {
8034d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar            if (activeObserversChanged != null) {
8044d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar                activeObserversChanged.onCall(false);
805c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar            }
806c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        }
807c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
808c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar
809c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    private class FailReentranceObserver<T> implements Observer<T> {
810c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        @Override
811c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        public void onChanged(@Nullable T t) {
812c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets            assertThat(mInObserver, is(false));
813c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets        }
814c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets    }
815c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets
816c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    interface MethodExec {
817c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar        void onCall(boolean value);
818c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar    }
819c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar}
820