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