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