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