161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets/*
261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * Copyright (C) 2017 The Android Open Source Project
361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets *
461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * you may not use this file except in compliance with the License.
661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * You may obtain a copy of the License at
761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets *
861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets *
1061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software
1161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
1261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * See the License for the specific language governing permissions and
1461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets * limitations under the License.
1561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets */
1661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
17ba069d50913c3fb250bb60ec310439db36895337Alan Viverettepackage androidx.lifecycle;
1861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
193223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinetsimport static org.hamcrest.CoreMatchers.is;
203223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinetsimport static org.hamcrest.MatcherAssert.assertThat;
2161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Matchers.anyString;
2261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.mock;
2361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.never;
24406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinetsimport static org.mockito.Mockito.only;
2561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.reset;
2661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.verify;
2761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.when;
2861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
29ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.arch.core.util.Function;
30ddee2b5170ae257a7b2494f8aaa8459ebed806dcAurimas Liutikasimport androidx.arch.core.executor.ArchTaskExecutor;
31ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.lifecycle.util.InstantTaskExecutor;
3261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
3361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.Before;
3461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.Test;
3561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.runner.RunWith;
3661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.runners.JUnit4;
3761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
3861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@SuppressWarnings("unchecked")
3961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@RunWith(JUnit4.class)
4061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetspublic class TransformationsTest {
4161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    private LifecycleOwner mOwner;
4361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
4561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void swapExecutorDelegate() {
46ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar        ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
4761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
4861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
5061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void setup() {
5161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mOwner = mock(LifecycleOwner.class);
5261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LifecycleRegistry registry = new LifecycleRegistry(mOwner);
5361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        when(mOwner.getLifecycle()).thenReturn(registry);
54b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
55b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
5761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
5861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
5961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testMap() {
60abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<String> source = new MutableLiveData<>();
6161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> mapped = Transformations.map(source, new Function<String, Integer>() {
6261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            @Override
6361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            public Integer apply(String input) {
6461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                return input.length();
6561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            }
6661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        });
6761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<Integer> observer = mock(Observer.class);
6861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mapped.observe(mOwner, observer);
6961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        source.setValue("four");
7061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged(4);
7161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
7261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
7361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
7461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap() {
75abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
76abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
77abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> second = new MutableLiveData<>();
7861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
7961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
8061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
8161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
8261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
8361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
8461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
8561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
8661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
8761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
8861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
8961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
9061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
9161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
9261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
9361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
9461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
9561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
9661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
9761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
9861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
9961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
10061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
10161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
10261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
10361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
10461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
10561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
10661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
10761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap2() {
108abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
109abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
110abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> second = new MutableLiveData<>();
11161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
11261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
11361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
11461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
11561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
11661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
11761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
11861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
11961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
12061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
12161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
12261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
12461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
12561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
12761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
12861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
12961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("fi");
13061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("fi");
13161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("rst");
13261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("rst");
13361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
13461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
13561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
13661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
13761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
13861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
13961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
14061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
14161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
14261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
14361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
14461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
14561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testNoRedispatchSwitchMap() {
146abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
147abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
14861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
14961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
15061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
15161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
15261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        return first;
15361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
15461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
15561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
15661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
15761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
15861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
15961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
16061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
16161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
16261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
16361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
16461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
16561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
1663223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1673223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    @Test
1683223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    public void testSwitchMapToNull() {
1693223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
1703223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
1713223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
1723223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
1733223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    @Override
1743223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
1753223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        if (input == 1) {
1763223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                            return first;
1773223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        } else {
1783223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                            return null;
1793223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        }
1803223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    }
1813223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                });
1823223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1833223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
1843223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        result.observe(mOwner, observer);
1853223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
1863223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        first.setValue("first");
1873223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        trigger.setValue(1);
1883223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer).onChanged("first");
1893223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        reset(observer);
1903223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1913223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        trigger.setValue(2);
1923223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
1933223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        assertThat(first.hasObservers(), is(false));
1943223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    }
195406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets
196406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets    @Test
197406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets    public void noObsoleteValueTest() {
198406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        MutableLiveData<Integer> numbers = new MutableLiveData<>();
199406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        LiveData<Integer> squared = Transformations.map(numbers, new Function<Integer, Integer>() {
200406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets            @Override
201406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets            public Integer apply(Integer input) {
202406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets                return input * input;
203406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets            }
204406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        });
205406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets
206406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        Observer observer = mock(Observer.class);
207406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        squared.setValue(1);
208406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        squared.observeForever(observer);
209406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        verify(observer).onChanged(1);
210406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        squared.removeObserver(observer);
211406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        reset(observer);
212406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        numbers.setValue(2);
213406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        squared.observeForever(observer);
214406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets        verify(observer, only()).onChanged(4);
215406dfb7a30f9fb785412cbe4d4e75503c58dafd9Sergey Vasilinets    }
21661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets}
217