18ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar/*
28ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * Copyright (C) 2014 The Android Open Source Project
38ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar *
48ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
58ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * you may not use this file except in compliance with the License.
68ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * You may obtain a copy of the License at
78ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar *
88ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
98ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar *
108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * Unless required by applicable law or agreed to in writing, software
118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * See the License for the specific language governing permissions and
148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar * limitations under the License.
158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar */
168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarpackage android.support.v7.widget;
188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
19245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyarimport junit.framework.AssertionFailedError;
20245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyarimport junit.framework.TestResult;
21245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
22be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.Before;
23be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.Test;
24be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.runner.RunWith;
25be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.runners.JUnit4;
26be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar
278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport android.test.AndroidTestCase;
28f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyarimport android.test.suitebuilder.annotation.SmallTest;
291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyarimport android.util.Log;
30be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport android.view.View;
318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport android.widget.TextView;
328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.ArrayList;
348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.LinkedList;
358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.List;
368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.Queue;
378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.Random;
388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.concurrent.atomic.AtomicInteger;
398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport static android.support.v7.widget.RecyclerView.*;
418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
42be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar@RunWith(JUnit4.class)
43f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyar@SmallTest
448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarpublic class AdapterHelperTest extends AndroidTestCase {
458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private static final boolean DEBUG = false;
471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
48245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    private boolean mCollectLogs = false;
49245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
501faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private static final String TAG = "AHT";
518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
52be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    List<MockViewHolder> mViewHolders;
538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper mAdapterHelper;
558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    List<AdapterHelper.UpdateOp> mFirstPassUpdates, mSecondPassUpdates;
578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    TestAdapter mTestAdapter;
598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    TestAdapter mPreProcessClone; // we clone adapter pre-process to run operations to see result
618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private List<TestAdapter.Item> mPreLayoutItems;
631faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
64245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    private StringBuilder mLog = new StringBuilder();
65245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    @Override
67245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void run(TestResult result) {
68245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        super.run(result);
69245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        if (!result.wasSuccessful()) {
70245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            result.addFailure(this, new AssertionFailedError(mLog.toString()));
71245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        }
72245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
73245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
74be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Before
75be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    public void cleanState() {
76245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        mLog.setLength(0);
771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mPreLayoutItems = new ArrayList<TestAdapter.Item>();
78be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mViewHolders = new ArrayList<MockViewHolder>();
798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mFirstPassUpdates = new ArrayList<AdapterHelper.UpdateOp>();
808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mSecondPassUpdates = new ArrayList<AdapterHelper.UpdateOp>();
81e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mPreProcessClone = null;
828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper = new AdapterHelper(new AdapterHelper.Callback() {
838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public RecyclerView.ViewHolder findViewHolder(int position) {
858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder vh : mViewHolders) {
86a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar                    if (vh.mPosition == position && !vh.isRemoved()) {
878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        return vh;
888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                return null;
918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForRemovingInvisible(int positionStart, int itemCount) {
958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionEnd) {
988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(-itemCount, true);
998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    } else if (holder.mPosition >= positionStart) {
1004b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.flagRemovedAndOffsetPosition(positionStart - 1, -itemCount, true);
1018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForRemovingLaidOutOrNewView(int positionStart,
1078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    int itemCount) {
1088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
1098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionEnd) {
1118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(-itemCount, false);
1128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    } else if (holder.mPosition >= positionStart) {
1134b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.flagRemovedAndOffsetPosition(positionStart - 1, -itemCount, false);
1148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
11921b345f101abc385496f42d250e580d21f1287b6Dake Gu            public void markViewHoldersUpdated(int positionStart, int itemCount, Object payload) {
1208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
1218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionStart && holder.mPosition < positionEnd) {
1238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.addFlags(ViewHolder.FLAG_UPDATE);
12421b345f101abc385496f42d250e580d21f1287b6Dake Gu                        holder.addChangePayload(payload);
1258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void onDispatchFirstPass(AdapterHelper.UpdateOp updateOp) {
1311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (DEBUG) {
132245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar                    log("first pass:" + updateOp.toString());
1331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
13416e5adf5416248d97f2aeaa9d5e17bb5093130ebYigit Boyar                for (ViewHolder viewHolder : mViewHolders) {
135be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar                    for (int i = 0; i < updateOp.itemCount; i++) {
1364b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        // events are dispatched before view holders are updated for consistency
137c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar                        assertFalse("update op should not match any existing view holders",
138115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                                viewHolder.getLayoutPosition() == updateOp.positionStart + i);
139c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar                    }
14016e5adf5416248d97f2aeaa9d5e17bb5093130ebYigit Boyar                }
141c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar
1428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mFirstPassUpdates.add(updateOp);
1438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void onDispatchSecondPass(AdapterHelper.UpdateOp updateOp) {
1471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (DEBUG) {
148245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar                    log("second pass:" + updateOp.toString());
1491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
1508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mSecondPassUpdates.add(updateOp);
1518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForAdd(int positionStart, int itemCount) {
1558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder != null && holder.mPosition >= positionStart) {
1578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(itemCount, false);
1588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1611faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
1621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            @Override
1631faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            public void offsetPositionsForMove(int from, int to) {
1641faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                final int start, end, inBetweenOffset;
1651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (from < to) {
1661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    start = from;
1671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    end = to;
1681faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    inBetweenOffset = -1;
1691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                } else {
1701faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    start = to;
1711faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    end = from;
1721faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    inBetweenOffset = 1;
1731faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
1741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    if (holder == null || holder.mPosition < start || holder.mPosition > end) {
1761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        continue;
1771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    }
1784b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                    if (holder.mPosition == from) {
1794b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.offsetPosition(to - from, false);
1804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                    } else {
1814b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.offsetPosition(inBetweenOffset, false);
1824bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                    }
1834bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                }
1844bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            }
1854b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }, true);
1868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
1878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
188245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    void log(String msg) {
189245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        if (mCollectLogs) {
190245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            mLog.append(msg).append("\n");
191245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        } else {
192245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            Log.d(TAG, msg);
193245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        }
194245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
195245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
1968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void setupBasic(int count, int visibleStart, int visibleCount) {
1971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
198245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("setupBasic(" + count + "," + visibleStart + "," + visibleCount + ");");
1991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
2008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter = new TestAdapter(count, mAdapterHelper);
2018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < visibleCount; i++) {
2028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            addViewHolder(visibleStart + i);
2038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
2048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone = mTestAdapter.createCopy();
2058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
207115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar    private void addViewHolder(int position) {
208be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        MockViewHolder viewHolder = new MockViewHolder(
2098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                new TextView(getContext()));
210115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        viewHolder.mPosition = position;
211115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        viewHolder.mItem = mTestAdapter.mItems.get(position);
2128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mViewHolders.add(viewHolder);
2138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
215be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
216e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    public void testChangeAll() throws Exception {
217e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        try {
218e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            setupBasic(5, 0, 3);
219e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            up(0, 5);
220e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            mAdapterHelper.preProcess();
221e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        } catch (Throwable t) {
222e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            throw new Exception(mLog.toString());
223e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
224e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
225e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
226be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2274bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar    public void testFindPositionOffsetInPreLayout() {
2284bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        setupBasic(50, 25, 10);
2294bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        rm(24, 5);
2304bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        mAdapterHelper.preProcess();
2314bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        // since 25 is invisible, we offset by one while checking
2324bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 23",
2334bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                23, mAdapterHelper.findPositionOffset(23));
2344bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 24",
2354bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(24));
2364bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 25",
2374bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(25));
2384bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 26",
2394bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(26));
2404bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 27",
2414bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(27));
2424bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 28",
2434bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                24, mAdapterHelper.findPositionOffset(28));
2444bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 29",
2454bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                25, mAdapterHelper.findPositionOffset(29));
2464bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar    }
2474bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar
248be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2494143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar    public void testNotifyAfterPre() {
2504143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        setupBasic(10, 2, 3);
2514143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        add(2, 1);
2524143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        mAdapterHelper.preProcess();
2534143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        add(3, 1);
2544143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        mAdapterHelper.consumeUpdatesInOnePass();
2554143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        mPreProcessClone.applyOps(mFirstPassUpdates, mTestAdapter);
2564143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        mPreProcessClone.applyOps(mSecondPassUpdates, mTestAdapter);
2574143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar        assertAdaptersEqual(mTestAdapter, mPreProcessClone);
2584143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar    }
2594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar
2604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar    @Test
2618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testSinglePass() {
2628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 3);
2638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(2, 1);
2648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 2);
2658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(1, 5);
2668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.consumeUpdatesInOnePass();
2678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(0, 3);
2688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
270be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteVisible() {
2728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 3);
2738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 1);
2748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(0, 1);
2768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
278be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteInvisible() {
2808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 4);
2818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 1);
2828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 0);
2848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
286be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddCount() {
2888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(0, 0, 0);
2898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(0, 1);
2908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(1, mAdapterHelper.mPendingUpdates.size());
2918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
293be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
2948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteCount() {
2958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(1, 0, 0);
2968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1);
2978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(1, mAdapterHelper.mPendingUpdates.size());
2988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
300be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddProcess() {
3028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(0, 0, 0);
3038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(0, 1);
3048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, mAdapterHelper.mPendingUpdates.size());
3068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
308be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddRemoveSeparate() {
3108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 2);
3118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(6, 1);
3128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(5, 1);
3138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 1);
3158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
317be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario1() {
3198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 2);
3208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(4, 1);
3218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(3, 1);
3228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(3, 1);
3238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3248ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 2);
3258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
327be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDivideDelete() {
3298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 4);
3308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 2);
3318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 1);
3338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
335be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3361faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario2() {
3378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 3); // 3-4-5
3388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(4, 2); // 3 a b 4 5
3398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1); // (0) 3(2) a(3) b(4) 4(3) 5(4)
3408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 3); // (1,2) (x) a(1) b(2) 4(3)
3418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(2, 2);
3438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
345be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario3() {
3478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 2);
3488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 5);
3498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(2, 1);
3518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertOps(mFirstPassUpdates, rmOp(0, 2), rmOp(2, 1));
3528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertOps(mSecondPassUpdates, rmOp(0, 2));
3538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    // TODO test MOVE then remove items in between.
3551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    // TODO test MOVE then remove it, make sure it is not dispatched
3568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
357be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario4() {
3598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(5, 0, 5);
3608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 3 4
3618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 a b 3 4
3628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 2 a b 3 4
3638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 c d 2 a b 3 4
3648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 c d 2 a 4
3658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // c d 2 a 4
3668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre: 0 1 2 3 4
3678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(3, 2);
3688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 1);
3698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(1, 2);
3708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(5, 2);
3718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1);
3728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
375be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario5() {
3778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(5, 0, 5);
3788ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 3 4
3798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 a b 3 4
3808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 b 3 4
3818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre: 0 1 2 3 4
3828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre w/ adap: 0 1 2 b 3 4
3838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(3, 2);
3848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 2);
3858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
388be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
3891faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario6() {
3901faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        setupBasic(47, 19, 24);
3911faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        mv(11, 12);
3921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        add(24, 16);
3931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        rm(9, 3);
3941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 5, 3);
3951faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(2, 3);
3961faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(6, 4);
3971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 1);
3981faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
3991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4001faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
401be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4021faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario8() {
4031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(68, 51, 13);
4041faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(22, 11);
4051faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(22, 52);
4061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(37, 19);
4071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(12, 38);
4081faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4091faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
411be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4121faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario9() {
4131faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(44, 3, 7);
4141faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(7, 21);
4151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(31, 3);
4161faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(32, 11);
4171faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(29, 5);
4181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(30, 32);
4191faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(25, 32);
4201faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(15, 66);
4211faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4231faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
424be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario10() {
4261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(14, 10, 3);
4271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 4);
4281faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(5, 11);
4291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(5, 18);
4301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 9);
4311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4321faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
434be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4351faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario11() {
4361faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(78, 3, 64);
4371faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(34, 28);
4381faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(1, 11);
4391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(9, 74);
4401faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4411faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4421faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
443be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario12() {
4451faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(38, 9, 7);
4461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(26, 3);
4471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(29, 15);
4481faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(30, 1);
4491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4501faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4511faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
452be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4531faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario13() {
4541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(49, 41, 3);
4551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(30, 13);
4561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(4, 10);
4571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(3, 38);
4581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(20, 17);
4591faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(18, 23);
4601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4611faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
463be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4641faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario14() {
4651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(24, 3, 11);
4661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 15);
4671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(2, 1);
4681faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(2, 34);
4691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(11, 3);
4701faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(10, 25);
4711faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(13, 6);
4721faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 4);
4731faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(6, 4);
4741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
477be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4781faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario15() {
4791faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 8, 1);
4801faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(6, 1);
4811faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1, 4);
4821faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(3, 1);
4831faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4841faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
486be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4871faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario16() {
4881faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 3, 3);
4891faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 1);
4901faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(1, 7);
4911faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(0, 1);
4921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
495be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
4961faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario17() {
4971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 8, 1);
4981faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1, 0);
4991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(5, 1);
5001faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(1, 7);
5011faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5021faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
504be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5051faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario18() throws InterruptedException {
5061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 1, 4);
5071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(2, 11);
5081faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(16, 1);
5091faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(3, 1);
5101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(9, 10);
5111faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5121faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5131faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
514be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario19() {
516e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 8, 1);
517e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 7);
518e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 3);
519be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 4);
5201faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5211faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
523be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario20() {
525be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 7, 1);
526be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(9, 1);
527be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(3, 9);
528be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(7, 2);
5291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
532be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario21() {
534be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 5, 2);
535be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(1, 0);
536be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(9, 1);
537be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 3);
5381faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5401faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
541be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5421faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario22() {
543be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 7, 2);
544e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(2, 16);
545be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(20, 9);
546be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(17, 6);
5471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5481faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
550be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5511faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario23() {
552be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 5, 3);
553e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 6);
554e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(4, 15);
555be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(21, 3);
5561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
559be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario24() {
561be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 1, 6);
562e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(6, 5);
563e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(14, 6);
564be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(7, 6);
5651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
568be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario25() {
570be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 3, 4);
571be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(3, 9);
572be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 4);
5731faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
576be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5774b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenario25a() {
578be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 3, 4);
579be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(6, 4);
580be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(3, 5);
5814b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
5824b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
5834b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
584be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
5851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario26() {
586be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 4, 4);
587be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(3, 5);
588e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(2, 0);
589be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(1, 0);
590e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(1, 1);
591e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(0, 2);
5921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
595be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
596d7e2f2ab1d253133fa54f309e74a7ee384c33971Yigit Boyar    public void testScenario27() {
597e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 0, 3);
598be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(9, 4);
599be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(8, 4);
600e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(7, 6);
601e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(5, 5);
6021faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
6031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
6041faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
605be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
606245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void testScenerio28() {
607be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 4, 1);
608e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(8, 6);
609e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(8, 1);
610be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(7, 5);
611e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(3, 3);
612be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(1, 4);
613245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        preProcess();
614245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
615245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
616be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
617e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    public void testScenerio29() {
618e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 6, 3);
619e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(3, 6);
620be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(6, 2);
621e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(5, 5);
622e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
623e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
624be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
6254b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio30() throws InterruptedException {
626e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mCollectLogs = true;
627be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 3, 1);
628be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(3, 2);
629be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 5);
630e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        preProcess();
631e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
632e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
633be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
6344b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio31() throws InterruptedException {
6354b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mCollectLogs = true;
636be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 3, 1);
637be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(3, 1);
638be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 3);
6394b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6404b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6414b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
642be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
6434b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio32() {
644be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 8, 1);
645be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(9, 2);
646be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(7, 39);
647be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(0, 39);
648be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(36, 20);
649be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(1, 48);
650be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(22, 98);
651be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(96, 29);
652be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(36, 29);
653be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(60, 36);
654be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(127, 34);
655be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(142, 22);
656be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(12, 69);
657be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(116, 13);
658be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(118, 19);
659be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(94, 69);
660be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(98, 21);
661be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(89, 18);
662be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(94, 70);
663be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(71, 8);
664be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(54, 26);
665be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(2, 20);
666be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(78, 84);
667be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(56, 2);
668be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(1, 79);
669be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(76, 7);
670be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(57, 12);
671be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(30, 27);
672be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(24, 13);
673be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(21, 5);
674be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(11, 27);
675be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(32, 1);
676be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(0, 5);
677be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(14, 9);
678be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(15, 12);
679be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(19, 1);
680be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(7, 1);
681be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(10, 4);
682be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(4, 3);
683be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(16, 1);
684be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(13, 5);
685be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(2, 8);
686be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(10, 19);
687be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(15, 42);
6884b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6894b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6904b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
691be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
6924b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio33() throws Throwable {
6934b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        try {
6944b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mCollectLogs = true;
6954b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            setupBasic(10, 7, 1);
6964b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mv(0, 6);
6974b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            up(0, 7);
6984b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            preProcess();
6994b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        } catch (Throwable t) {
7004b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            throw new Throwable(t.getMessage() + "\n" + mLog.toString());
7014b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
7024b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7034b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
704be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7054b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio34() {
706be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 6, 1);
707be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(9, 7);
708be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 2);
709be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(4, 3);
7104b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7114b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7124b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
713be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7144b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio35() {
715be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 4, 4);
716be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(1, 4);
717be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(2, 7);
718be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(0, 1);
7194b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7204b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7214b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
722be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7234b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio36() {
724be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 7, 2);
725be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(4, 1);
726be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(1, 6);
727be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(4, 4);
7284b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7294b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7304b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
731be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7324b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio37() throws Throwable {
7334b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        try {
7344b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mCollectLogs = true;
7354b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            setupBasic(10, 5, 2);
7364b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mv(3, 6);
7374b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            rm(4, 4);
7384b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            rm(3, 2);
7394b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            preProcess();
7404b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        } catch (Throwable t) {
7414b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            throw new Throwable(t.getMessage() + "\n" + mLog.toString());
7424b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
7434b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7444b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
745be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7464b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio38() {
747be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 2, 2);
748be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        add(0, 24);
749be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(26, 4);
750be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(1, 24);
7514b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7524b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7534b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
754be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7554b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio39() {
756be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 7, 1);
757be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(0, 2);
758be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(8, 1);
759be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 6);
7604b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7614b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7624b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
763be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7644b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio40() {
765be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 5, 3);
766be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 4);
767be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(0, 5);
768be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 3);
7694b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7704b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7714b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
772be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7734b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio41() {
774be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 7, 2);
775be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(4, 9);
776be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(0, 6);
777be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(0, 1);
7784b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7794b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
781be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7824b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio42() {
783be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 6, 2);
784be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(5, 9);
785be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 1);
786be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 6);
7874b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7884b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7894b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
790be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
7914b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio43() {
792be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 1, 6);
793be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(6, 8);
794be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(3, 5);
7954b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(3, 1);
7964b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7974b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7984b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
799be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
8004b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio44() {
801be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 5, 2);
802be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(6, 4);
803be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(4, 1);
804be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(5, 3);
8054b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
8064b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
8074b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
808be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
8094b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio45() {
810be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 4, 2);
8114b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(1, 4);
8124b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
8134b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
8144b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
815be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
8164b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio46() {
817be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        setupBasic(10, 4, 3);
818be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        up(6, 1);
819be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        mv(8, 0);
820be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        rm(2, 7);
8214b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
8224b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
8234b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
824be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
8251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testMoveAdded() {
8261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 2, 2);
8271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(3, 5);
8281faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(4, 2);
8291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
8301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
8311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
832be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    @Test
83321b345f101abc385496f42d250e580d21f1287b6Dake Gu    public void testPayloads() {
83421b345f101abc385496f42d250e580d21f1287b6Dake Gu        setupBasic(10, 2, 2);
83521b345f101abc385496f42d250e580d21f1287b6Dake Gu        up(3, 3, "payload");
83621b345f101abc385496f42d250e580d21f1287b6Dake Gu        preProcess();
83721b345f101abc385496f42d250e580d21f1287b6Dake Gu        assertOps(mFirstPassUpdates, upOp(4, 2, "payload"));
83821b345f101abc385496f42d250e580d21f1287b6Dake Gu        assertOps(mSecondPassUpdates, upOp(3, 1, "payload"));
83921b345f101abc385496f42d250e580d21f1287b6Dake Gu    }
84021b345f101abc385496f42d250e580d21f1287b6Dake Gu
84121b345f101abc385496f42d250e580d21f1287b6Dake Gu    @Test
842245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void testRandom() throws Throwable {
843245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        mCollectLogs = true;
8448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        Random random = new Random(System.nanoTime());
84590ca3086dbf66ad6bb8840e46ec8524a705e1c18Yigit Boyar        for (int i = 0; i < 100; i++) {
846245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            try {
8474b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                Log.d(TAG, "running random test " + i);
8484b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                randomTest(random, Math.max(40, 10 + nextInt(random, i)));
849245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            } catch (Throwable t) {
8504b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                throw new Throwable("failure at random test " + i + "\n" + t.getMessage()
8514b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        + "\n" + mLog.toString(), t);
852245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            }
8538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
8548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void randomTest(Random random, int opCount) {
8578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        cleanState();
8581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
859245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("randomTest");
8601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
861e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int count = 10;// + nextInt(random,100);
862e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int start = nextInt(random, count - 1);
863e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int layoutCount = Math.max(1, nextInt(random, count - start));
8648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(count, start, layoutCount);
8658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        while (opCount-- > 0) {
86721b345f101abc385496f42d250e580d21f1287b6Dake Gu            final int op = nextInt(random, 5);
8688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            switch (op) {
8691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 0:
8708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (mTestAdapter.mItems.size() > 1) {
871e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int s = nextInt(random, mTestAdapter.mItems.size() - 1);
872e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
8738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        rm(s, len);
8748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
8758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    break;
8761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 1:
8771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    int s = mTestAdapter.mItems.size() == 0 ? 0 :
878e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                            nextInt(random, mTestAdapter.mItems.size());
879be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar                    add(s, nextInt(random, 50));
8808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    break;
8811faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 2:
8821faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    if (mTestAdapter.mItems.size() >= 2) {
883e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int from = nextInt(random, mTestAdapter.mItems.size());
8841faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        int to;
8851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        do {
886e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                            to = nextInt(random, mTestAdapter.mItems.size());
8871faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        } while (to == from);
8881faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        mv(from, to);
8891faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    }
890e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    break;
891e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                case 3:
892e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    if (mTestAdapter.mItems.size() > 1) {
893e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        s = nextInt(random, mTestAdapter.mItems.size() - 1);
894e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
895e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        up(s, len);
896e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    }
897e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    break;
89821b345f101abc385496f42d250e580d21f1287b6Dake Gu                case 4:
89921b345f101abc385496f42d250e580d21f1287b6Dake Gu                    if (mTestAdapter.mItems.size() > 1) {
90021b345f101abc385496f42d250e580d21f1287b6Dake Gu                        s = nextInt(random, mTestAdapter.mItems.size() - 1);
90121b345f101abc385496f42d250e580d21f1287b6Dake Gu                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
90221b345f101abc385496f42d250e580d21f1287b6Dake Gu                        up(s, len, Integer.toString(s));
90321b345f101abc385496f42d250e580d21f1287b6Dake Gu                    }
90421b345f101abc385496f42d250e580d21f1287b6Dake Gu                    break;
9058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
9068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
9088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
910e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    int nextInt(Random random, int n) {
911e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        if (n == 0) {
912e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            return 0;
913e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
914e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        return random.nextInt(n);
915e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
916e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
9178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void assertOps(List<AdapterHelper.UpdateOp> actual,
9188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            AdapterHelper.UpdateOp... expected) {
9198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(expected.length, actual.size());
9208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < expected.length; i++) {
9218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertEquals(expected[i], actual.get(i));
9228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9248ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void assertDispatch(int firstPass, int secondPass) {
9268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(firstPass, mFirstPassUpdates.size());
9278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(secondPass, mSecondPassUpdates.size());
9288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void preProcess() {
931be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        for (MockViewHolder vh : mViewHolders) {
932115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            final int ind = mTestAdapter.mItems.indexOf(vh.mItem);
933115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            assertEquals("actual adapter position should match", ind,
934115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                    mAdapterHelper.applyPendingUpdatesToPosition(vh.mPosition));
935115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        }
9368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.preProcess();
9371faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (int i = 0; i < mPreProcessClone.mItems.size(); i++) {
9381faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            TestAdapter.Item item = mPreProcessClone.mItems.get(i);
9391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            final int preLayoutIndex = mPreLayoutItems.indexOf(item);
9401faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            final int endIndex = mTestAdapter.mItems.indexOf(item);
9414bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            if (preLayoutIndex != -1) {
9424bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                assertEquals("find position offset should work properly for existing elements" + i
9431faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        + " at pre layout position " + preLayoutIndex + " and post layout position "
9441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        + endIndex, endIndex, mAdapterHelper.findPositionOffset(preLayoutIndex));
9451faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
9461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9474b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        // make sure visible view holders still have continuous positions
9484b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        final StringBuilder vhLogBuilder = new StringBuilder();
9494b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        for (ViewHolder vh : mViewHolders) {
9504b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            vhLogBuilder.append("\n").append(vh.toString());
9514b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
9524b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        if (mViewHolders.size() > 0) {
9534b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            final String vhLog = vhLogBuilder.toString();
954115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            final int start = mViewHolders.get(0).getLayoutPosition();
9554b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            for (int i = 1; i < mViewHolders.size(); i++) {
9564b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                assertEquals("view holder positions should be continious in pre-layout" + vhLog,
957115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                        start + i, mViewHolders.get(i).getLayoutPosition());
9584b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            }
9594b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
9608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.consumePostponedUpdates();
9618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // now assert these two adapters have identical data.
9628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone.applyOps(mFirstPassUpdates, mTestAdapter);
9638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone.applyOps(mSecondPassUpdates, mTestAdapter);
9648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertAdaptersEqual(mTestAdapter, mPreProcessClone);
9658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    private void assertAdaptersEqual(TestAdapter a1, TestAdapter a2) {
9688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(a1.mItems.size(), a2.mItems.size());
9698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < a1.mItems.size(); i++) {
9708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            TestAdapter.Item item = a1.mItems.get(i);
9718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertSame(item, a2.mItems.get(i));
9728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertEquals(0, item.getUpdateCount());
9738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, a1.mPendingAdded.size());
9758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, a2.mPendingAdded.size());
9768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9788ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp op(int cmd, int start, int count) {
97921b345f101abc385496f42d250e580d21f1287b6Dake Gu        return new AdapterHelper.UpdateOp(cmd, start, count, null);
98021b345f101abc385496f42d250e580d21f1287b6Dake Gu    }
98121b345f101abc385496f42d250e580d21f1287b6Dake Gu
98221b345f101abc385496f42d250e580d21f1287b6Dake Gu    AdapterHelper.UpdateOp op(int cmd, int start, int count, Object payload) {
98321b345f101abc385496f42d250e580d21f1287b6Dake Gu        return new AdapterHelper.UpdateOp(cmd, start, count, payload);
9848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp addOp(int start, int count) {
9878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return op(AdapterHelper.UpdateOp.ADD, start, count);
9888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp rmOp(int start, int count) {
9918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return op(AdapterHelper.UpdateOp.REMOVE, start, count);
9928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
99421b345f101abc385496f42d250e580d21f1287b6Dake Gu    AdapterHelper.UpdateOp upOp(int start, int count, Object payload) {
99521b345f101abc385496f42d250e580d21f1287b6Dake Gu        return op(AdapterHelper.UpdateOp.UPDATE, start, count, payload);
9968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void add(int start, int count) {
9991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
1000245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("add(" + start + "," + count + ");");
10011faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
10028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.add(start, count);
10038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
10048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10051faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    boolean isItemLaidOut(int pos) {
10061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (ViewHolder viewHolder : mViewHolders) {
10071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            if (viewHolder.mOldPosition == pos) {
10081faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                return true;
10091faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
10101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
10111faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        return false;
10121faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
10131faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
10141faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private void mv(int from, int to) {
10151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
1016245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("mv(" + from + "," + to + ");");
10171faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
10181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mTestAdapter.move(from, to);
10191faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
10201faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
10218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void rm(int start, int count) {
10221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
1023245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("rm(" + start + "," + count + ");");
10241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
10251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (int i = start; i < start + count; i++) {
10261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            if (!isItemLaidOut(i)) {
10271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                TestAdapter.Item item = mTestAdapter.mItems.get(i);
10281faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                mPreLayoutItems.remove(item);
10291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
10301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
10318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.remove(start, count);
10328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
10338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void up(int start, int count) {
1035e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        if (DEBUG) {
1036e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            log("up(" + start + "," + count + ");");
1037e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
10388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.update(start, count);
10398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
10408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
104121b345f101abc385496f42d250e580d21f1287b6Dake Gu    void up(int start, int count, Object payload) {
104221b345f101abc385496f42d250e580d21f1287b6Dake Gu        if (DEBUG) {
104321b345f101abc385496f42d250e580d21f1287b6Dake Gu            log("up(" + start + "," + count + "," + payload + ");");
104421b345f101abc385496f42d250e580d21f1287b6Dake Gu        }
104521b345f101abc385496f42d250e580d21f1287b6Dake Gu        mTestAdapter.update(start, count, payload);
104621b345f101abc385496f42d250e580d21f1287b6Dake Gu    }
104721b345f101abc385496f42d250e580d21f1287b6Dake Gu
10488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    static class TestAdapter {
10498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        List<Item> mItems;
10518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        final AdapterHelper mAdapterHelper;
10538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        Queue<Item> mPendingAdded;
10558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public TestAdapter(int initialCount, AdapterHelper container) {
10578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mItems = new ArrayList<Item>();
10588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper = container;
10598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mPendingAdded = new LinkedList<Item>();
10608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < initialCount; i++) {
10618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.add(new Item());
10628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void add(int index, int count) {
10668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
10678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                Item item = new Item();
10688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mPendingAdded.add(item);
10698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.add(index + i, item);
10708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
107221b345f101abc385496f42d250e580d21f1287b6Dake Gu                    AdapterHelper.UpdateOp.ADD, index, count, null
10738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
10748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        public void move(int from, int to) {
10771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            mItems.add(to, mItems.remove(from));
10781faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
107921b345f101abc385496f42d250e580d21f1287b6Dake Gu                    AdapterHelper.UpdateOp.MOVE, from, to, null
10801faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            ));
10811faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
1082be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar
10838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void remove(int index, int count) {
10848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
10858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.remove(index);
10868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
108821b345f101abc385496f42d250e580d21f1287b6Dake Gu                    AdapterHelper.UpdateOp.REMOVE, index, count, null
10898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
10908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void update(int index, int count) {
109321b345f101abc385496f42d250e580d21f1287b6Dake Gu            update(index, count, null);
109421b345f101abc385496f42d250e580d21f1287b6Dake Gu        }
109521b345f101abc385496f42d250e580d21f1287b6Dake Gu
109621b345f101abc385496f42d250e580d21f1287b6Dake Gu        public void update(int index, int count, Object payload) {
10978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
109821b345f101abc385496f42d250e580d21f1287b6Dake Gu                mItems.get(index + i).update(payload);
10998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
110121b345f101abc385496f42d250e580d21f1287b6Dake Gu                    AdapterHelper.UpdateOp.UPDATE, index, count, payload
11028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
11038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
11048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        protected TestAdapter createCopy() {
11068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            TestAdapter adapter = new TestAdapter(0, mAdapterHelper);
11078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (Item item : mItems) {
11088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                adapter.mItems.add(item);
11098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            return adapter;
11118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
11128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void applyOps(List<AdapterHelper.UpdateOp> updates,
11148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                TestAdapter dataSource) {
11158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (AdapterHelper.UpdateOp op : updates) {
11168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                switch (op.cmd) {
11178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.ADD:
11188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
11198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                            mItems.add(op.positionStart + i, dataSource.consumeNextAdded());
11208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
11218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
11228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.REMOVE:
11238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
11248ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                            mItems.remove(op.positionStart);
11258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
11268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
11278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.UPDATE:
11288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
112921b345f101abc385496f42d250e580d21f1287b6Dake Gu                            mItems.get(op.positionStart + i).handleUpdate(op.payload);
11308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
11318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
11321faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    case AdapterHelper.UpdateOp.MOVE:
11331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        mItems.add(op.itemCount, mItems.remove(op.positionStart));
11341faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        break;
11358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
11368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
11388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        private Item consumeNextAdded() {
11408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            return mPendingAdded.remove();
11418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
11428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11434bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        public void createFakeItemAt(int fakeAddedItemIndex) {
11444bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            Item fakeItem = new Item();
1145be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar            ((LinkedList<Item>) mPendingAdded).add(fakeAddedItemIndex, fakeItem);
11464bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        }
11474bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar
11488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public static class Item {
11498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private static AtomicInteger itemCounter = new AtomicInteger();
11518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private final int id;
11538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private int mVersionCount = 0;
11558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
115621b345f101abc385496f42d250e580d21f1287b6Dake Gu            private ArrayList<Object> mPayloads = new ArrayList<Object>();
11578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public Item() {
11598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                id = itemCounter.incrementAndGet();
11608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
116221b345f101abc385496f42d250e580d21f1287b6Dake Gu            public void update(Object payload) {
116321b345f101abc385496f42d250e580d21f1287b6Dake Gu                mPayloads.add(payload);
11648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mVersionCount++;
11658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
116721b345f101abc385496f42d250e580d21f1287b6Dake Gu            public void handleUpdate(Object payload) {
116821b345f101abc385496f42d250e580d21f1287b6Dake Gu                assertSame(payload, mPayloads.get(0));
116921b345f101abc385496f42d250e580d21f1287b6Dake Gu                mPayloads.remove(0);
11708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mVersionCount--;
11718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
11738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public int getUpdateCount() {
117421b345f101abc385496f42d250e580d21f1287b6Dake Gu                return mVersionCount;
11758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
11768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
11778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
11784b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
11794b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    void waitForDebugger() {
11804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        android.os.Debug.waitForDebugger();
11814b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
1182be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar
1183be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    static class MockViewHolder extends RecyclerView.ViewHolder {
1184be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        public Object mItem;
1185be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        public MockViewHolder(View itemView) {
1186be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar            super(itemView);
1187be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar        }
1188be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar    }
11898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar}
1190