TransformationsTest.java revision 3223e9cb19c7ef1175a3620f11a661648a38fad9
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
1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage android.arch.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;
2461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.reset;
2561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.verify;
2661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.when;
2761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
2864db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.core.executor.AppToolkitTaskExecutor;
2964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.core.util.Function;
30b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.arch.lifecycle.util.InstantTaskExecutor;
31b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.test.filters.SmallTest;
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@SmallTest
4061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@RunWith(JUnit4.class)
4161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetspublic class TransformationsTest {
4261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    private LifecycleOwner mOwner;
4461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
4661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void swapExecutorDelegate() {
4761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
4861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
4961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
5061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
5161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void setup() {
5261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mOwner = mock(LifecycleOwner.class);
5361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LifecycleRegistry registry = new LifecycleRegistry(mOwner);
5461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        when(mOwner.getLifecycle()).thenReturn(registry);
55b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
56b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
5861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
5961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
6061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testMap() {
61abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<String> source = new MutableLiveData<>();
6261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> mapped = Transformations.map(source, new Function<String, Integer>() {
6361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            @Override
6461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            public Integer apply(String input) {
6561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                return input.length();
6661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            }
6761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        });
6861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<Integer> observer = mock(Observer.class);
6961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mapped.observe(mOwner, observer);
7061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        source.setValue("four");
7161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged(4);
7261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
7361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
7461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
7561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap() {
76abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
77abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
78abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> second = new MutableLiveData<>();
7961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
8061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
8161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
8261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
8361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
8461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
8561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
8661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
8761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
8861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
8961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
9061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
9161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
9261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
9361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
9461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
9561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
9661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
9761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
9861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
9961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
10061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
10161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
10261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
10361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
10461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
10561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
10661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
10761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
10861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap2() {
109abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
110abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
111abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> second = new MutableLiveData<>();
11261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
11361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
11461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
11561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
11661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
11761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
11861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
11961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
12061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
12161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
12261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
12361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
12561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
12661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
12861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
12961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
13061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("fi");
13161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("fi");
13261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("rst");
13361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("rst");
13461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
13561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
13661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
13761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
13861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
13961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
14061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
14161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
14261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
14361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
14461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
14561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
14661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testNoRedispatchSwitchMap() {
147abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
148abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
14961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
15061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
15161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
15261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
15361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        return first;
15461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
15561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
15661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
15761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
15861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
15961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
16061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
16161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
16261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
16361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
16461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
16561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
16661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
1673223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1683223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    @Test
1693223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    public void testSwitchMapToNull() {
1703223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        LiveData<Integer> trigger = new MutableLiveData<>();
1713223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        final LiveData<String> first = new MutableLiveData<>();
1723223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
1733223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
1743223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    @Override
1753223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
1763223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        if (input == 1) {
1773223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                            return first;
1783223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        } else {
1793223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                            return null;
1803223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                        }
1813223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                    }
1823223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets                });
1833223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1843223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
1853223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        result.observe(mOwner, observer);
1863223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
1873223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        first.setValue("first");
1883223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        trigger.setValue(1);
1893223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer).onChanged("first");
1903223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        reset(observer);
1913223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets
1923223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        trigger.setValue(2);
1933223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
1943223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets        assertThat(first.hasObservers(), is(false));
1953223e9cb19c7ef1175a3620f11a661648a38fad9Sergey Vasilinets    }
19661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets}
197