TransformationsTest.java revision b86bef286718da421268bc52cf4fab7cccb3104c
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
1961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Matchers.anyString;
2061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.mock;
2161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.never;
2261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.reset;
2361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.verify;
2461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport static org.mockito.Mockito.when;
2561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
2664db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.core.executor.AppToolkitTaskExecutor;
2764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.core.util.Function;
28b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.arch.lifecycle.util.InstantTaskExecutor;
29b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.test.filters.SmallTest;
3061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
3161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.Before;
3261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.Test;
3361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.runner.RunWith;
3461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetsimport org.junit.runners.JUnit4;
3561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
3661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@SuppressWarnings("unchecked")
3761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@SmallTest
3861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets@RunWith(JUnit4.class)
3961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinetspublic class TransformationsTest {
4061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    private LifecycleOwner mOwner;
4261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
4461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void swapExecutorDelegate() {
4561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
4661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
4761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
4861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Before
4961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void setup() {
5061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mOwner = mock(LifecycleOwner.class);
5161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LifecycleRegistry registry = new LifecycleRegistry(mOwner);
5261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        when(mOwner.getLifecycle()).thenReturn(registry);
53b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
54b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        registry.handleLifecycleEvent(Lifecycle.Event.ON_START);
5561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
5661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
5761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
5861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testMap() {
5961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> source = new LiveData<>();
6061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> mapped = Transformations.map(source, new Function<String, Integer>() {
6161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            @Override
6261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            public Integer apply(String input) {
6361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                return input.length();
6461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets            }
6561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        });
6661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<Integer> observer = mock(Observer.class);
6761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        mapped.observe(mOwner, observer);
6861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        source.setValue("four");
6961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged(4);
7061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
7161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
7261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
7361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap() {
7461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> trigger = new LiveData<>();
7561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        final LiveData<String> first = new LiveData<>();
7661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        final LiveData<String> second = new LiveData<>();
7761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
7861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
7961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
8061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
8161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
8261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
8361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
8461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
8561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
8661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
8761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
8861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
8961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
9061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
9161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
9261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
9361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
9461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
9561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
9661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
9761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
9861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
9961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
10061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
10161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
10261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
10361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
10461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
10561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
10661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testSwitchMap2() {
10761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> trigger = new LiveData<>();
10861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        final LiveData<String> first = new LiveData<>();
10961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        final LiveData<String> second = new LiveData<>();
11061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
11161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
11261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
11361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
11461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        if (input == 1) {
11561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return first;
11661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        } else {
11761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                            return second;
11861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        }
11961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
12061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
12161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
12361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
12461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
12561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
12661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
12761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
12861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("fi");
12961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("fi");
13061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("rst");
13161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("rst");
13261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
13361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        second.setValue("second");
13461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
13561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
13661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
13761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("second");
13861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
13961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("failure");
14061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
14161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
14261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
14361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    @Test
14461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    public void testNoRedispatchSwitchMap() {
14561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<Integer> trigger = new LiveData<>();
14661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        final LiveData<String> first = new LiveData<>();
14761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        LiveData<String> result = Transformations.switchMap(trigger,
14861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                new Function<Integer, LiveData<String>>() {
14961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    @Override
15061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    public LiveData<String> apply(Integer input) {
15161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                        return first;
15261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                    }
15361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets                });
15461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets
15561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        Observer<String> observer = mock(Observer.class);
15661444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        result.observe(mOwner, observer);
15761444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
15861444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        first.setValue("first");
15961444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(1);
16061444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer).onChanged("first");
16161444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        reset(observer);
16261444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        trigger.setValue(2);
16361444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets        verify(observer, never()).onChanged(anyString());
16461444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets    }
16561444da588bb2454012ff23b99662dade74fa169Sergey Vasilinets}
166