1e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar/* 2e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 3e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * 4e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * you may not use this file except in compliance with the License. 6e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * You may obtain a copy of the License at 7e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * 8e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * 10e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * Unless required by applicable law or agreed to in writing, software 11e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * See the License for the specific language governing permissions and 14e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar * limitations under the License. 15e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar */ 16e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 17e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarpackage android.support.v7.widget; 18e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 19e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport junit.framework.TestCase; 20e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 21e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport org.junit.Before; 22e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport org.junit.Test; 23e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport org.junit.runner.RunWith; 24e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport org.junit.runners.JUnit4; 25e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 26e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.support.annotation.NonNull; 27e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.support.annotation.Nullable; 28e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.support.v4.util.Pair; 29f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyarimport android.test.suitebuilder.annotation.SmallTest; 30e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.view.View; 31e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 32e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport java.util.ArrayList; 33e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport java.util.HashMap; 34e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport java.util.List; 35e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport java.util.Map; 36e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 37e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport static android.support.v7.widget.ViewInfoStore.InfoRecord.FLAG_PRE; 38e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport static android.support.v7.widget.ViewInfoStore.InfoRecord.FLAG_POST; 39e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport static android.support.v7.widget.ViewInfoStore.InfoRecord.FLAG_APPEAR; 40e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport static android.support.v7.widget.ViewInfoStore.InfoRecord.FLAG_DISAPPEARED; 41e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo; 42e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarimport android.support.v7.widget.RecyclerView.ViewHolder; 43e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 44e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar@SuppressWarnings("ConstantConditions") 45e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar@RunWith(JUnit4.class) 46f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyar@SmallTest 47e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyarpublic class ViewInfoStoreTest extends TestCase { 48e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewInfoStore mStore; 49e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar LoggingProcessCallback mCallback; 50e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Before 51e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void prepare() { 52e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore = new ViewInfoStore(); 53e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mCallback = new LoggingProcessCallback(); 54e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 55e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 56e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 574143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void addOverridePre() { 584143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo info = new MockInfo(); 604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPreLayout(vh, info); 614143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo info2 = new MockInfo(); 624143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPreLayout(vh, info2); 634143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertSame(info2, find(vh, FLAG_PRE)); 644143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 654143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 664143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 674143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void addOverridePost() { 684143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 694143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo info = new MockInfo(); 704143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPostLayout(vh, info); 714143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo info2 = new MockInfo(); 724143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPostLayout(vh, info2); 734143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertSame(info2, find(vh, FLAG_POST)); 744143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 754143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 764143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 774143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void addRemoveAndReAdd() { 784143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 794143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo pre = new MockInfo(); 804143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPreLayout(vh, pre); 814143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar MockInfo post1 = new MockInfo(); 824143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToPostLayout(vh, post1); 834143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.onViewDetached(vh); 844143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mStore.addToDisappearedInLayout(vh); 854143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 864143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 874143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 88e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void addToPreLayout() { 89e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 90e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 91e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, info); 92e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertSame(info, find(vh, FLAG_PRE)); 93e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mStore.isInPreLayout(vh)); 94e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeViewHolder(vh); 95e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertFalse(mStore.isInPreLayout(vh)); 96e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 97e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 98e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 99e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void addToPostLayout() { 100e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 101e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 102e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPostLayout(vh, info); 103e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertSame(info, find(vh, FLAG_POST)); 104e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeViewHolder(vh); 105e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNull(find(vh, FLAG_POST)); 106e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 107e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 108e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 109e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void popFromPreLayout() { 110e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(0, sizeOf(FLAG_PRE)); 111e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 112e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 113e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, info); 114e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertSame(info, mStore.popFromPreLayout(vh)); 115e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNull(mStore.popFromPreLayout(vh)); 116e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 117e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 118e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 119e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void addToOldChangeHolders() { 120e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 121e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToOldChangeHolders(1, vh); 122e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertSame(vh, mStore.getFromOldChangeHolders(1)); 123e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeViewHolder(vh); 124e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNull(mStore.getFromOldChangeHolders(1)); 125e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 126e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 127e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 128e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void appearListTests() { 129e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 130e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ItemAnimator.ItemHolderInfo info = new MockInfo(); 131e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToAppearedInPreLayoutHolders(vh, info); 132e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(1, sizeOf(FLAG_APPEAR)); 133e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh2 = new MockViewHolder(); 134e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToAppearedInPreLayoutHolders(vh2, info); 135e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(2, sizeOf(FLAG_APPEAR)); 136e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeViewHolder(vh2); 137e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(1, sizeOf(FLAG_APPEAR)); 138e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 139e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 140e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 141e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void disappearListTest() { 142e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh = new MockViewHolder(); 143e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh); 144e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(1, sizeOf(FLAG_DISAPPEARED)); 145e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh); 146e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(1, sizeOf(FLAG_DISAPPEARED)); 147e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder vh2 = new MockViewHolder(); 148e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh2); 149e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(2, sizeOf(FLAG_DISAPPEARED)); 150e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeViewHolder(vh2); 151e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(1, sizeOf(FLAG_DISAPPEARED)); 152e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeFromDisappearedInLayout(vh); 153e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(0, sizeOf(FLAG_DISAPPEARED)); 154e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 155e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 156e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 157e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processAppear() { 158e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewHolder vh = new MockViewHolder(); 159e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 160e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPostLayout(vh, info); 161e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.process(mCallback); 162e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(new Pair<>(null, info), mCallback.appeared.get(vh)); 163e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.disappeared.isEmpty()); 164e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.unused.isEmpty()); 165e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.persistent.isEmpty()); 166e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 167e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 168e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 169e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processDisappearNormal() { 170e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewHolder vh = new MockViewHolder(); 171e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 172e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, info); 173e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.process(mCallback); 174e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(new Pair<>(info, null), mCallback.disappeared.get(vh)); 175e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.appeared.isEmpty()); 176e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.unused.isEmpty()); 177e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.persistent.isEmpty()); 178e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 179e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 180e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 181e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processDisappearMissingLayout() { 182e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewHolder vh = new MockViewHolder(); 183e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo info = new MockInfo(); 184e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, info); 185e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh); 186e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.process(mCallback); 187e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(new Pair<>(info, null), mCallback.disappeared.get(vh)); 188e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.appeared.isEmpty()); 189e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.unused.isEmpty()); 190e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.persistent.isEmpty()); 191e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 192e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 193e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 194e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processDisappearMoveOut() { 195e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewHolder vh = new MockViewHolder(); 196e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo pre = new MockInfo(); 197e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo post = new MockInfo(); 198e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, pre); 199e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh); 200e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPostLayout(vh, post); 201e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.process(mCallback); 202e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(new Pair<>(pre, post), mCallback.disappeared.get(vh)); 203e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.appeared.isEmpty()); 204e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.unused.isEmpty()); 205e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.persistent.isEmpty()); 206e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 207e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 208e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Test 209e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processDisappearAppear() { 210e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewHolder vh = new MockViewHolder(); 211e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo pre = new MockInfo(); 212e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar MockInfo post = new MockInfo(); 213e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPreLayout(vh, pre); 214e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToDisappearedInLayout(vh); 215e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.addToPostLayout(vh, post); 216e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.removeFromDisappearedInLayout(vh); 217e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar mStore.process(mCallback); 218e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.disappeared.isEmpty()); 219e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.appeared.isEmpty()); 220e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertTrue(mCallback.unused.isEmpty()); 221e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertEquals(mCallback.persistent.get(vh), new Pair<>(pre, post)); 222e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 223e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 224a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar @Test 225a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar public void processAppearAndDisappearInPostLayout() { 226a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar ViewHolder vh = new MockViewHolder(); 227a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar MockInfo info1 = new MockInfo(); 228a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar mStore.addToPostLayout(vh, info1); 229a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar mStore.addToDisappearedInLayout(vh); 230a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar mStore.process(mCallback); 231a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar assertTrue(mCallback.disappeared.isEmpty()); 232a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar assertTrue(mCallback.appeared.isEmpty()); 233a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar assertTrue(mCallback.persistent.isEmpty()); 234a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar assertSame(mCallback.unused.get(0), vh); 235a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar } 236a7d7e30042bb6fbe2944b752a24fd57fd31d285fYigit Boyar 237e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar static class MockViewHolder extends RecyclerView.ViewHolder { 238e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public MockViewHolder() { 239e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar super(new View(null)); 240e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 241e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 242e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 243e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar static class MockInfo extends RecyclerView.ItemAnimator.ItemHolderInfo { 244e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 245e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 246e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 247e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar private int sizeOf(int flags) { 248e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar int cnt = 0; 249e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final int size = mStore.mLayoutHolderMap.size(); 250e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar for (int i = 0; i < size; i ++) { 251e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewInfoStore.InfoRecord record = mStore.mLayoutHolderMap.valueAt(i); 252e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar if ((record.flags & flags) != 0) { 253e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar cnt ++; 254e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 255e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 256e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar return cnt; 257e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 258e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 259e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar private RecyclerView.ItemAnimator.ItemHolderInfo find(RecyclerView.ViewHolder viewHolder, 260e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar int flags) { 261e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final int size = mStore.mLayoutHolderMap.size(); 262e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar for (int i = 0; i < size; i ++) { 263e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ViewInfoStore.InfoRecord record = mStore.mLayoutHolderMap.valueAt(i); 264e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar RecyclerView.ViewHolder holder = mStore.mLayoutHolderMap.keyAt(i); 265e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar if ((record.flags & flags) != 0 && holder == viewHolder) { 266e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar if (flags == FLAG_PRE || flags == FLAG_APPEAR) { 267e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar return record.preInfo; 268e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } else if (flags == FLAG_POST) { 269e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar return record.postInfo; 270e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 271e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar throw new UnsupportedOperationException("don't know this flag"); 272e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 273e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 274e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar return null; 275e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 276e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 277e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar private static class LoggingProcessCallback implements ViewInfoStore.ProcessCallback { 278e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final Map<ViewHolder, Pair<ItemHolderInfo, ItemHolderInfo>> disappeared = new HashMap<>(); 279e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final Map<ViewHolder, Pair<ItemHolderInfo, ItemHolderInfo>> appeared = new HashMap<>(); 280e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final Map<ViewHolder, Pair<ItemHolderInfo, ItemHolderInfo>> persistent = new HashMap<>(); 281e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar final List<ViewHolder> unused = new ArrayList<>(); 282e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Override 283e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processDisappeared(ViewHolder viewHolder, 284e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar ItemHolderInfo preInfo, 285e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Nullable ItemHolderInfo postInfo) { 286e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNotNull(preInfo); 287e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertFalse(disappeared.containsKey(viewHolder)); 288e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar disappeared.put(viewHolder, new Pair<>(preInfo, postInfo)); 289e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 290e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 291e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Override 292e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processAppeared(ViewHolder viewHolder, 293e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Nullable ItemHolderInfo preInfo, @NonNull ItemHolderInfo info) { 294e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNotNull(info); 295e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertFalse(appeared.containsKey(viewHolder)); 296e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar appeared.put(viewHolder, new Pair<>(preInfo, info)); 297e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 298e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 299e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Override 300e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void processPersistent(ViewHolder viewHolder, 301e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo) { 302e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertFalse(persistent.containsKey(viewHolder)); 303e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNotNull(preInfo); 304e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar assertNotNull(postInfo); 305e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar persistent.put(viewHolder, new Pair<>(preInfo, postInfo)); 306e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 307e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 308e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar @Override 309e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar public void unused(ViewHolder holder) { 310e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar unused.add(holder); 311e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 312e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar } 313e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar 314e09e0b4ea04b6b6b0ef6c62979e8abdead0bf378Yigit Boyar} 315