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
22115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyarimport android.os.Debug;
238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport android.test.AndroidTestCase;
241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyarimport android.util.Log;
258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport android.widget.TextView;
268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.ArrayList;
288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.LinkedList;
298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.List;
308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.Queue;
318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.Random;
328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport java.util.concurrent.atomic.AtomicInteger;
338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarimport static android.support.v7.widget.RecyclerView.*;
358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyarpublic class AdapterHelperTest extends AndroidTestCase {
378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
381faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private static final boolean DEBUG = false;
391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
40245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    private boolean mCollectLogs = false;
41245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
421faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private static final String TAG = "AHT";
438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
44115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar    List<RecyclerViewBasicTest.MockViewHolder> mViewHolders;
458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper mAdapterHelper;
478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    List<AdapterHelper.UpdateOp> mFirstPassUpdates, mSecondPassUpdates;
498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    TestAdapter mTestAdapter;
518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    TestAdapter mPreProcessClone; // we clone adapter pre-process to run operations to see result
538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private List<TestAdapter.Item> mPreLayoutItems;
551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
56245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    private StringBuilder mLog = new StringBuilder();
57245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    @Override
598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    protected void setUp() throws Exception {
608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        cleanState();
618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
63245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    @Override
64245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void run(TestResult result) {
65245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        super.run(result);
66245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        if (!result.wasSuccessful()) {
67245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            result.addFailure(this, new AssertionFailedError(mLog.toString()));
68245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        }
69245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
70245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    private void cleanState() {
72245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        mLog.setLength(0);
731faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mPreLayoutItems = new ArrayList<TestAdapter.Item>();
74115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        mViewHolders = new ArrayList<RecyclerViewBasicTest.MockViewHolder>();
758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mFirstPassUpdates = new ArrayList<AdapterHelper.UpdateOp>();
768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mSecondPassUpdates = new ArrayList<AdapterHelper.UpdateOp>();
77e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mPreProcessClone = null;
788ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper = new AdapterHelper(new AdapterHelper.Callback() {
798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public RecyclerView.ViewHolder findViewHolder(int position) {
818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder vh : mViewHolders) {
82a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar                    if (vh.mPosition == position && !vh.isRemoved()) {
838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        return vh;
848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                return null;
878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForRemovingInvisible(int positionStart, int itemCount) {
918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionEnd) {
948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(-itemCount, true);
958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    } else if (holder.mPosition >= positionStart) {
964b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.flagRemovedAndOffsetPosition(positionStart - 1, -itemCount, true);
978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForRemovingLaidOutOrNewView(int positionStart,
1038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    int itemCount) {
1048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
1058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionEnd) {
1078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(-itemCount, false);
1088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    } else if (holder.mPosition >= positionStart) {
1094b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.flagRemovedAndOffsetPosition(positionStart - 1, -itemCount, false);
1108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void markViewHoldersUpdated(int positionStart, int itemCount) {
1168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                final int positionEnd = positionStart + itemCount;
1178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder.mPosition >= positionStart && holder.mPosition < positionEnd) {
1198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.addFlags(ViewHolder.FLAG_UPDATE);
1208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1248ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1258ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void onDispatchFirstPass(AdapterHelper.UpdateOp updateOp) {
1261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (DEBUG) {
127245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar                    log("first pass:" + updateOp.toString());
1281faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
12916e5adf5416248d97f2aeaa9d5e17bb5093130ebYigit Boyar                for (ViewHolder viewHolder : mViewHolders) {
130c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar                    for (int i = 0; i < updateOp.itemCount; i ++) {
1314b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        // events are dispatched before view holders are updated for consistency
132c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar                        assertFalse("update op should not match any existing view holders",
133115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                                viewHolder.getLayoutPosition() == updateOp.positionStart + i);
134c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar                    }
13516e5adf5416248d97f2aeaa9d5e17bb5093130ebYigit Boyar                }
136c50c4cad31d73e574b27bb3d7581542975e37263Yigit Boyar
1378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mFirstPassUpdates.add(updateOp);
1388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void onDispatchSecondPass(AdapterHelper.UpdateOp updateOp) {
1421faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (DEBUG) {
143245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar                    log("second pass:" + updateOp.toString());
1441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
1458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mSecondPassUpdates.add(updateOp);
1468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
1488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            @Override
1498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void offsetPositionsForAdd(int positionStart, int itemCount) {
1508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (holder != null && holder.mPosition >= positionStart) {
1528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        holder.offsetPosition(itemCount, false);
1538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
1548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
1558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
1561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
1571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            @Override
1581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            public void offsetPositionsForMove(int from, int to) {
1591faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                final int start, end, inBetweenOffset;
1601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                if (from < to) {
1611faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    start = from;
1621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    end = to;
1631faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    inBetweenOffset = -1;
1641faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                } else {
1651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    start = to;
1661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    end = from;
1671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    inBetweenOffset = 1;
1681faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                }
1691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                for (ViewHolder holder : mViewHolders) {
1701faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    if (holder == null || holder.mPosition < start || holder.mPosition > end) {
1711faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        continue;
1721faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    }
1734b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                    if (holder.mPosition == from) {
1744b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.offsetPosition(to - from, false);
1754b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                    } else {
1764b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        holder.offsetPosition(inBetweenOffset, false);
1774bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                    }
1784bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                }
1794bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            }
1804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }, true);
1818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
1828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
183245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    void log(String msg) {
184245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        if (mCollectLogs) {
185245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            mLog.append(msg).append("\n");
186245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        } else {
187245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            Log.d(TAG, msg);
188245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        }
189245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
190245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
1918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void setupBasic(int count, int visibleStart, int visibleCount) {
1921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
193245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("setupBasic(" + count + "," + visibleStart + "," + visibleCount + ");");
1941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
1958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter = new TestAdapter(count, mAdapterHelper);
1968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < visibleCount; i++) {
1978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            addViewHolder(visibleStart + i);
1988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
1998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone = mTestAdapter.createCopy();
2008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
202115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar    private void addViewHolder(int position) {
203115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        RecyclerViewBasicTest.MockViewHolder viewHolder = new RecyclerViewBasicTest.MockViewHolder(
2048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                new TextView(getContext()));
205115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        viewHolder.mPosition = position;
206115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        viewHolder.mItem = mTestAdapter.mItems.get(position);
2078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mViewHolders.add(viewHolder);
2088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
210e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    public void testChangeAll() throws Exception {
211e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        try {
212e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            setupBasic(5, 0, 3);
213e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            up(0, 5);
214e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            mAdapterHelper.preProcess();
215e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        } catch (Throwable t) {
216e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            throw new Exception(mLog.toString());
217e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
218e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
219e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
2204bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar    public void testFindPositionOffsetInPreLayout() {
2214bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        setupBasic(50, 25, 10);
2224bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        rm(24, 5);
2234bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        mAdapterHelper.preProcess();
2244bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        // since 25 is invisible, we offset by one while checking
2254bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 23",
2264bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                23, mAdapterHelper.findPositionOffset(23));
2274bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 24",
2284bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(24));
2294bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 25",
2304bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(25));
2314bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 26",
2324bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(26));
2334bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 27",
2344bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                -1, mAdapterHelper.findPositionOffset(27));
2354bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 28",
2364bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                24, mAdapterHelper.findPositionOffset(28));
2374bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        assertEquals("find position for view 29",
2384bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                25, mAdapterHelper.findPositionOffset(29));
2394bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar    }
2404bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar
2418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testSinglePass() {
2428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 3);
2438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(2, 1);
2448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 2);
2458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(1, 5);
2468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.consumeUpdatesInOnePass();
2478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(0, 3);
2488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteVisible() {
2518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 3);
2528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 1);
2538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(0, 1);
2558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteInvisible() {
2588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 4);
2598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 1);
2608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 0);
2628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddCount() {
2658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(0, 0, 0);
2668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(0, 1);
2678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(1, mAdapterHelper.mPendingUpdates.size());
2688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDeleteCount() {
2718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(1, 0, 0);
2728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1);
2738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(1, mAdapterHelper.mPendingUpdates.size());
2748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddProcess() {
2778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(0, 0, 0);
2788ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(0, 1);
2798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, mAdapterHelper.mPendingUpdates.size());
2818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testAddRemoveSeparate() {
2848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 2);
2858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(6, 1);
2868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(5, 1);
2878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 1);
2898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
2911faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario1() {
2928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 2);
2938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(4, 1);
2948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(3, 1);
2958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(3, 1);
2968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
2978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 2);
2988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
2998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void testDivideDelete() {
3018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 4);
3028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 2);
3038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(1, 1);
3058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario2() {
3088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 3, 3); // 3-4-5
3098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(4, 2); // 3 a b 4 5
3108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1); // (0) 3(2) a(3) b(4) 4(3) 5(4)
3118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 3); // (1,2) (x) a(1) b(2) 4(3)
3128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(2, 2);
3148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3161faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario3() {
3178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(10, 2, 2);
3188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 5);
3198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertDispatch(2, 1);
3218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertOps(mFirstPassUpdates, rmOp(0, 2), rmOp(2, 1));
3228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertOps(mSecondPassUpdates, rmOp(0, 2));
3238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    // TODO test MOVE then remove items in between.
3251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    // TODO test MOVE then remove it, make sure it is not dispatched
3268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario4() {
3288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(5, 0, 5);
3298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 3 4
3308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 a b 3 4
3318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 2 a b 3 4
3328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 c d 2 a b 3 4
3338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 c d 2 a 4
3348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // c d 2 a 4
3358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre: 0 1 2 3 4
3368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(3, 2);
3378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(1, 1);
3388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(1, 2);
3398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(5, 2);
3408ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(0, 1);
3418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario5() {
3458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(5, 0, 5);
3468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 3 4
3478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 2 a b 3 4
3488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // 0 1 b 3 4
3498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre: 0 1 2 3 4
3508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // pre w/ adap: 0 1 2 b 3 4
3518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        add(3, 2);
3528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        rm(2, 2);
3538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
3548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
3558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
3561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario6() {
3571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        setupBasic(47, 19, 24);
3581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        mv(11, 12);
3591faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        add(24, 16);
3601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar//        rm(9, 3);
3611faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 5, 3);
3621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(2, 3);
3631faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(6, 4);
3641faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 1);
3651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
3661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
3671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
3681faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario8() {
3691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(68, 51, 13);
3701faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(22, 11);
3711faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(22, 52);
3721faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(37, 19);
3731faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(12, 38);
3741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
3751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
3761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
3771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario9() {
3781faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(44, 3, 7);
3791faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(7, 21);
3801faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(31, 3);
3811faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(32, 11);
3821faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(29, 5);
3831faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(30, 32);
3841faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(25, 32);
3851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(15, 66);
3861faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
3871faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
3881faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
3891faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario10() {
3901faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(14, 10, 3);
3911faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 4);
3921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(5, 11);
3931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(5, 18);
3941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 9);
3951faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
3961faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
3971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
3981faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario11() {
3991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(78, 3, 64);
4001faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(34, 28);
4011faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(1, 11);
4021faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(9, 74);
4031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4041faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4051faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario12() {
4071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(38, 9, 7);
4081faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(26, 3);
4091faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(29, 15);
4101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(30, 1);
4111faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4121faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4131faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4141faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario13() {
4151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(49, 41, 3);
4161faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(30, 13);
4171faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(4, 10);
4181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(3, 38);
4191faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(20, 17);
4201faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(18, 23);
4211faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4231faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario14() {
4251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(24, 3, 11);
4261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 15);
4271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(2, 1);
4281faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(2, 34);
4291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(11, 3);
4301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(10, 25);
4311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(13, 6);
4321faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(4, 4);
4331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(6, 4);
4341faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4351faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4361faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4371faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario15() {
4381faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 8, 1);
4391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(6, 1);
4401faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1, 4);
4411faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(3, 1);
4421faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4431faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4451faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario16() {
4461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 3, 3);
4471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2, 1);
4481faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(1, 7);
4491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(0, 1);
4501faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4511faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4521faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4531faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario17() {
4541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 8, 1);
4551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1, 0);
4561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(5, 1);
4571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(1, 7);
4581faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4591faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4601faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4611faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario18() throws InterruptedException {
4621faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 1, 4);
4631faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(2, 11);
4641faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(16, 1);
4651faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(3, 1);
4661faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(9, 10);
4671faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4681faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4691faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4701faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario19() {
471e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 8, 1);
472e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 7);
473e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 3);
4741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(5,4);
4751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4781faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario20() {
4791faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,7,1);
4801faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(9,1);
4811faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(3,9);
4821faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(7,2);
4831faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4841faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4861faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario21() {
4871faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,5,2);
4881faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1,0);
4891faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(9,1);
4901faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(2,3);
4911faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
4921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
4931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
4941faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario22() {
4951faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,7,2);
496e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(2, 16);
4971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(20,9);
4981faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(17,6);
4991faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5001faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5011faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
5021faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario23() {
5031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,5,3);
504e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(9, 6);
505e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(4, 15);
5061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(21,3);
5071faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5081faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5091faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
5101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario24() {
5111faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,1,6);
512e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(6, 5);
513e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(14, 6);
5141faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(7,6);
5151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5161faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5171faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
5181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario25() {
5191faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,3,4);
5204b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(3,9);
5211faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(5,4);
5221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5231faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
5254b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenario25a() {
5264b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,3,4);
5274b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(6,4);
5284b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(3,5);
5294b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
5304b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
5314b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
5321faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testScenario26() {
5331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10,4,4);
5341faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        rm(3,5);
535e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(2, 0);
5361faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(1,0);
537e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(1, 1);
538e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(0, 2);
5391faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5401faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5411faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
542d7e2f2ab1d253133fa54f309e74a7ee384c33971Yigit Boyar    public void testScenario27() {
543e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 0, 3);
5441faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(9,4);
5451faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(8,4);
546e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(7, 6);
547e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(5, 5);
5481faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
5491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
5501faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
551245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void testScenerio28() {
552245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        setupBasic(10,4,1);
553e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(8, 6);
554e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(8, 1);
555245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        mv(7,5);
556e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(3, 3);
557245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        rm(1,4);
558245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        preProcess();
559245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    }
560245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar
561e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    public void testScenerio29() {
562e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10, 6, 3);
563e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mv(3, 6);
564e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        up(6,2);
565e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        add(5, 5);
566e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
567e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
5684b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio30() throws InterruptedException {
569e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        mCollectLogs = true;
570e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        setupBasic(10,3,1);
571e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(3,2);
572e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        rm(2,5);
573e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        preProcess();
574e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
575e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
5764b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio31() throws InterruptedException {
5774b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mCollectLogs = true;
5784b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,3,1);
5794b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(3,1);
5804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(2,3);
5814b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
5824b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
5834b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
5844b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio32() {
5854b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,8,1);
5864b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(9,2);
5874b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(7,39);
5884b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(0,39);
5894b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(36,20);
5904b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(1,48);
5914b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(22,98);
5924b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(96,29);
5934b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(36,29);
5944b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(60,36);
5954b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(127,34);
5964b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(142,22);
5974b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(12,69);
5984b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(116,13);
5994b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(118,19);
6004b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(94,69);
6014b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(98,21);
6024b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(89,18);
6034b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(94,70);
6044b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(71,8);
6054b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(54,26);
6064b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(2,20);
6074b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(78,84);
6084b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(56,2);
6094b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(1,79);
6104b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(76,7);
6114b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(57,12);
6124b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(30,27);
6134b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(24,13);
6144b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(21,5);
6154b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(11,27);
6164b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(32,1);
6174b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(0,5);
6184b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(14,9);
6194b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(15,12);
6204b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(19,1);
6214b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(7,1);
6224b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(10,4);
6234b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(4,3);
6244b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(16,1);
6254b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(13,5);
6264b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(2,8);
6274b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(10,19);
6284b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(15,42);
6294b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6304b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6314b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6324b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio33() throws Throwable {
6334b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        try {
6344b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mCollectLogs = true;
6354b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            setupBasic(10, 7, 1);
6364b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mv(0, 6);
6374b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            up(0, 7);
6384b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            preProcess();
6394b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        } catch (Throwable t) {
6404b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            throw new Throwable(t.getMessage() + "\n" + mLog.toString());
6414b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
6424b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6434b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6444b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio34() {
6454b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,6,1);
6464b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(9,7);
6474b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(5,2);
6484b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(4,3);
6494b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6504b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6514b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6524b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio35() {
6534b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,4,4);
6544b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(1,4);
6554b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(2,7);
6564b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(0,1);
6574b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6584b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6594b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6604b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio36() {
6614b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,7,2);
6624b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(4,1);
6634b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(1,6);
6644b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(4,4);
6654b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6664b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6674b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6684b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio37() throws Throwable {
6694b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        try {
6704b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mCollectLogs = true;
6714b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            setupBasic(10, 5, 2);
6724b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            mv(3, 6);
6734b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            rm(4, 4);
6744b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            rm(3, 2);
6754b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            preProcess();
6764b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        } catch (Throwable t) {
6774b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            throw new Throwable(t.getMessage() + "\n" + mLog.toString());
6784b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
6794b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6804b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6814b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio38() {
6824b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,2,2);
6834b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        add(0,24);
6844b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(26,4);
6854b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(1,24);
6864b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6874b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6884b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6894b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio39() {
6904b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,7,1);
6914b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(0,2);
6924b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(8,1);
6934b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(2,6);
6944b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
6954b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
6964b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
6974b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio40() {
6984b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,5,3);
6994b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(5,4);
7004b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(0,5);
7014b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(2,3);
7024b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7034b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7044b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7054b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio41() {
7064b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,7,2);
7074b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(4,9);
7084b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(0,6);
7094b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(0,1);
7104b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7114b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7124b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7134b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio42() {
7144b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,6,2);
7154b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(5,9);
7164b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(5,1);
7174b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(2,6);
7184b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7194b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7204b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7214b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio43() {
7224b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,1,6);
7234b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(6,8);
7244b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(3,5);
7254b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(3, 1);
7264b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7274b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7284b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7294b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio44() {
7304b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,5,2);
7314b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(6,4);
7324b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(4,1);
7334b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(5,3);
7344b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7354b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7364b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7374b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio45() {
7384b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,4,2);
7394b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(1, 4);
7404b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7414b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7424b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7434b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    public void testScenerio46() {
7444b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        setupBasic(10,4,3);
7454b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        up(6,1);
7464b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        mv(8,0);
7474b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        rm(2,7);
7484b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        preProcess();
7494b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
7504b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
7511faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    public void testMoveAdded() {
7521faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        setupBasic(10, 2, 2);
7531faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        add(3, 5);
7541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mv(4, 2);
7551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        preProcess();
7561faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
7571faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
758245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar    public void testRandom() throws Throwable {
759245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar        mCollectLogs = true;
7608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        Random random = new Random(System.nanoTime());
76190ca3086dbf66ad6bb8840e46ec8524a705e1c18Yigit Boyar        for (int i = 0; i < 100; i++) {
762245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            try {
7634b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                Log.d(TAG, "running random test " + i);
7644b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                randomTest(random, Math.max(40, 10 + nextInt(random, i)));
765245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            } catch (Throwable t) {
7664b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                throw new Throwable("failure at random test " + i + "\n" + t.getMessage()
7674b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                        + "\n" + mLog.toString(), t);
768245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            }
7698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
7708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
7718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
7728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void randomTest(Random random, int opCount) {
7738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        cleanState();
7741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
775245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("randomTest");
7761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
777e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int count = 10;// + nextInt(random,100);
778e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int start = nextInt(random, count - 1);
779e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        final int layoutCount = Math.max(1, nextInt(random, count - start));
7808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        setupBasic(count, start, layoutCount);
7818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
7828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        while (opCount-- > 0) {
783e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            final int op = nextInt(random, 4);
7848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            switch (op) {
7851faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 0:
7868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    if (mTestAdapter.mItems.size() > 1) {
787e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int s = nextInt(random, mTestAdapter.mItems.size() - 1);
788e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
7898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        rm(s, len);
7908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    }
7918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    break;
7921faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 1:
7931faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    int s = mTestAdapter.mItems.size() == 0 ? 0 :
794e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                            nextInt(random, mTestAdapter.mItems.size());
795e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        add(s, nextInt(random, 50));
7968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    break;
7971faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                case 2:
7981faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    if (mTestAdapter.mItems.size() >= 2) {
799e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int from = nextInt(random, mTestAdapter.mItems.size());
8001faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        int to;
8011faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        do {
802e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                            to = nextInt(random, mTestAdapter.mItems.size());
8031faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        } while (to == from);
8041faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        mv(from, to);
8051faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    }
806e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    break;
807e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                case 3:
808e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    if (mTestAdapter.mItems.size() > 1) {
809e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        s = nextInt(random, mTestAdapter.mItems.size() - 1);
810e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        int len = Math.max(1, nextInt(random, mTestAdapter.mItems.size() - s));
811e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                        up(s, len);
812e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    }
813e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar                    break;
8148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
8158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
8168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        preProcess();
8178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
819e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    int nextInt(Random random, int n) {
820e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        if (n == 0) {
821e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            return 0;
822e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
823e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        return random.nextInt(n);
824e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar    }
825e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar
8268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    public void assertOps(List<AdapterHelper.UpdateOp> actual,
8278ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            AdapterHelper.UpdateOp... expected) {
8288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(expected.length, actual.size());
8298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < expected.length; i++) {
8308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertEquals(expected[i], actual.get(i));
8318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
8328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void assertDispatch(int firstPass, int secondPass) {
8358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(firstPass, mFirstPassUpdates.size());
8368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(secondPass, mSecondPassUpdates.size());
8378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void preProcess() {
840115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        for (RecyclerViewBasicTest.MockViewHolder vh : mViewHolders) {
841115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            final int ind = mTestAdapter.mItems.indexOf(vh.mItem);
842115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            assertEquals("actual adapter position should match", ind,
843115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                    mAdapterHelper.applyPendingUpdatesToPosition(vh.mPosition));
844115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar        }
8458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.preProcess();
8461faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (int i = 0; i < mPreProcessClone.mItems.size(); i++) {
8471faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            TestAdapter.Item item = mPreProcessClone.mItems.get(i);
8481faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            final int preLayoutIndex = mPreLayoutItems.indexOf(item);
8491faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            final int endIndex = mTestAdapter.mItems.indexOf(item);
8504bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            if (preLayoutIndex != -1) {
8514bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar                assertEquals("find position offset should work properly for existing elements" + i
8521faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        + " at pre layout position " + preLayoutIndex + " and post layout position "
8531faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        + endIndex, endIndex, mAdapterHelper.findPositionOffset(preLayoutIndex));
8541faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
8551faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
8564b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        // make sure visible view holders still have continuous positions
8574b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        final StringBuilder vhLogBuilder = new StringBuilder();
8584b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        for (ViewHolder vh : mViewHolders) {
8594b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            vhLogBuilder.append("\n").append(vh.toString());
8604b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
8614b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        if (mViewHolders.size() > 0) {
8624b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            final String vhLog = vhLogBuilder.toString();
863115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar            final int start = mViewHolders.get(0).getLayoutPosition();
8644b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            for (int i = 1; i < mViewHolders.size(); i++) {
8654b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar                assertEquals("view holder positions should be continious in pre-layout" + vhLog,
866115ba0c7b2a14aa4cd0273952195e1d8f6468f87Yigit Boyar                        start + i, mViewHolders.get(i).getLayoutPosition());
8674b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar            }
8684b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        }
8698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mAdapterHelper.consumePostponedUpdates();
8708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        // now assert these two adapters have identical data.
8718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone.applyOps(mFirstPassUpdates, mTestAdapter);
8728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mPreProcessClone.applyOps(mSecondPassUpdates, mTestAdapter);
8738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertAdaptersEqual(mTestAdapter, mPreProcessClone);
8748ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8758ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8768ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    private void assertAdaptersEqual(TestAdapter a1, TestAdapter a2) {
8778ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(a1.mItems.size(), a2.mItems.size());
8788ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        for (int i = 0; i < a1.mItems.size(); i++) {
8798ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            TestAdapter.Item item = a1.mItems.get(i);
8808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertSame(item, a2.mItems.get(i));
8818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            assertEquals(0, item.getUpdateCount());
8828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
8838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, a1.mPendingAdded.size());
8848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        assertEquals(0, a2.mPendingAdded.size());
8858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp op(int cmd, int start, int count) {
8888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return new AdapterHelper.UpdateOp(cmd, start, count);
8898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp addOp(int start, int count) {
8928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return op(AdapterHelper.UpdateOp.ADD, start, count);
8938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp rmOp(int start, int count) {
8968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return op(AdapterHelper.UpdateOp.REMOVE, start, count);
8978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
8988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
8998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    AdapterHelper.UpdateOp upOp(int start, int count) {
9008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        return op(AdapterHelper.UpdateOp.UPDATE, start, count);
9018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void add(int start, int count) {
9041faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
905245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("add(" + start + "," + count + ");");
9061faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.add(start, count);
9088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9101faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    boolean isItemLaidOut(int pos) {
9111faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (ViewHolder viewHolder : mViewHolders) {
9121faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            if (viewHolder.mOldPosition == pos) {
9131faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                return true;
9141faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
9151faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9161faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        return false;
9171faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
9181faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
9191faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    private void mv(int from, int to) {
9201faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
921245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("mv(" + from + "," + to + ");");
9221faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9231faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        mTestAdapter.move(from, to);
9241faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar    }
9251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar
9268ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void rm(int start, int count) {
9271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        if (DEBUG) {
928245b9720dad47a694d16a1d0f48ad462bc27989fYigit Boyar            log("rm(" + start + "," + count + ");");
9291faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9301faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        for (int i = start; i < start + count; i++) {
9311faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            if (!isItemLaidOut(i)) {
9321faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                TestAdapter.Item item = mTestAdapter.mItems.get(i);
9331faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                mPreLayoutItems.remove(item);
9341faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            }
9351faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9368ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.remove(start, count);
9378ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9388ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9398ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    void up(int start, int count) {
940e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        if (DEBUG) {
941e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar            log("up(" + start + "," + count + ");");
942e4fde6825bba479c9b030feb8f810694d46b2f06Yigit Boyar        }
9438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        mTestAdapter.update(start, count);
9448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
9458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    static class TestAdapter {
9478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        List<Item> mItems;
9498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        final AdapterHelper mAdapterHelper;
9518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        Queue<Item> mPendingAdded;
9538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public TestAdapter(int initialCount, AdapterHelper container) {
9558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mItems = new ArrayList<Item>();
9568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper = container;
9578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mPendingAdded = new LinkedList<Item>();
9588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < initialCount; i++) {
9598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.add(new Item());
9608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
9618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void add(int index, int count) {
9648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
9658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                Item item = new Item();
9668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mPendingAdded.add(item);
9678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.add(index + i, item);
9688ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
9698ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
9708ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    AdapterHelper.UpdateOp.ADD, index, count
9718ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
9728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9738ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9741faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        public void move(int from, int to) {
9751faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            mItems.add(to, mItems.remove(from));
9761faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
9771faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    AdapterHelper.UpdateOp.MOVE, from, to
9781faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar            ));
9791faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar        }
9808ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void remove(int index, int count) {
9818ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
9828ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.remove(index);
9838ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
9848ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
9858ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    AdapterHelper.UpdateOp.REMOVE, index, count
9868ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
9878ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9888ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9898ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void update(int index, int count) {
9908ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (int i = 0; i < count; i++) {
9918ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mItems.get(index + i).update();
9928ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
9938ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            mAdapterHelper.addUpdateOp(new AdapterHelper.UpdateOp(
9948ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    AdapterHelper.UpdateOp.UPDATE, index, count
9958ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            ));
9968ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
9978ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
9988ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        protected TestAdapter createCopy() {
9998ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            TestAdapter adapter = new TestAdapter(0, mAdapterHelper);
10008ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (Item item : mItems) {
10018ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                adapter.mItems.add(item);
10028ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10038ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            return adapter;
10048ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10058ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10068ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public void applyOps(List<AdapterHelper.UpdateOp> updates,
10078ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                TestAdapter dataSource) {
10088ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            for (AdapterHelper.UpdateOp op : updates) {
10098ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                switch (op.cmd) {
10108ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.ADD:
10118ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
10128ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                            mItems.add(op.positionStart + i, dataSource.consumeNextAdded());
10138ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
10148ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
10158ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.REMOVE:
10168ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
10178ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                            mItems.remove(op.positionStart);
10188ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
10198ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
10208ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                    case AdapterHelper.UpdateOp.UPDATE:
10218ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        for (int i = 0; i < op.itemCount; i++) {
10228ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                            mItems.get(i).handleUpdate();
10238ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        }
10248ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                        break;
10251faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                    case AdapterHelper.UpdateOp.MOVE:
10261faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        mItems.add(op.itemCount, mItems.remove(op.positionStart));
10271faed0c7c20fc3a0b7befabbac1beac1019effc7Yigit Boyar                        break;
10288ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                }
10298ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10308ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10318ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10328ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        private Item consumeNextAdded() {
10338ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            return mPendingAdded.remove();
10348ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10358ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10364bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        public void createFakeItemAt(int fakeAddedItemIndex) {
10374bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            Item fakeItem = new Item();
10384bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar            ((LinkedList<Item>)mPendingAdded).add(fakeAddedItemIndex, fakeItem);
10394bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar        }
10404bacf13ec17763ba2e2d049d32a4a1dcca77a433Yigit Boyar
10418ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        public static class Item {
10428ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10438ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private static AtomicInteger itemCounter = new AtomicInteger();
10448ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10458ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private final int id;
10468ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10478ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private int mVersionCount = 0;
10488ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10498ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            private int mUpdateCount;
10508ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10518ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public Item() {
10528ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                id = itemCounter.incrementAndGet();
10538ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10548ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10558ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void update() {
10568ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mVersionCount++;
10578ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10588ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10598ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public void handleUpdate() {
10608ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                mVersionCount--;
10618ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10628ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar
10638ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            public int getUpdateCount() {
10648ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar                return mUpdateCount;
10658ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar            }
10668ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar        }
10678ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar    }
10684b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar
10694b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    void waitForDebugger() {
10704b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar        android.os.Debug.waitForDebugger();
10714b9b4d3fca81486051bac9aadb73d8865948c3bfYigit Boyar    }
10728ae76f91527ce850f155ce960fb9068bcd5d49f9Yigit Boyar}
1073