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