SortedListTest.java revision 12833d36969f1540dd5fc6fe32a25fa8b52a8e0b
1a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar/* 2a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * Copyright (C) 2014 The Android Open Source Project 3a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * 4a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * you may not use this file except in compliance with the License. 6a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * You may obtain a copy of the License at 7a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * 8a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * 10a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * Unless required by applicable law or agreed to in writing, software 11a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * See the License for the specific language governing permissions and 14a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar * limitations under the License. 15a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar */ 16a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 17a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarpackage android.support.v7.util; 18a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 19a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport junit.framework.TestCase; 20a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 21be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.Before; 22be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.Test; 23be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.runner.RunWith; 24be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyarimport org.junit.runners.JUnit4; 25a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 26a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport java.util.ArrayList; 27a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport java.util.Collections; 28a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport java.util.Comparator; 29a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport java.util.List; 30a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarimport java.util.Random; 31a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 32be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar@RunWith(JUnit4.class) 33a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyarpublic class SortedListTest extends TestCase { 34a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 35a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar SortedList<Item> mList; 36a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar List<Pair> mAdditions = new ArrayList<Pair>(); 37a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar List<Pair> mRemovals = new ArrayList<Pair>(); 38a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar List<Pair> mMoves = new ArrayList<Pair>(); 39a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar List<Pair> mUpdates = new ArrayList<Pair>(); 40a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar private SortedList.Callback<Item> mCallback; 41a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 42a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar private Comparator<? super Item> sItemComparator = new Comparator<Item>() { 43a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 44a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public int compare(Item o1, Item o2) { 45a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return mCallback.compare(o1, o2); 46a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 47a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar }; 48a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 49a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 50be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Before 51a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void setUp() throws Exception { 52a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar super.setUp(); 53a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mCallback = new SortedList.Callback<Item>() { 54a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 55a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public int compare(Item o1, Item o2) { 56a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return o1.cmpField < o2.cmpField ? -1 : (o1.cmpField == o2.cmpField ? 0 : 1); 57a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 58a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 59a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 60a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void onInserted(int position, int count) { 61a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mAdditions.add(new Pair(position, count)); 62a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 63a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 64a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 65a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void onRemoved(int position, int count) { 66a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mRemovals.add(new Pair(position, count)); 67a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 68a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 69a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 70a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void onMoved(int fromPosition, int toPosition) { 71a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mMoves.add(new Pair(fromPosition, toPosition)); 72a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 73a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 74a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 75a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void onChanged(int position, int count) { 76a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mUpdates.add(new Pair(position, count)); 77a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 78a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 79a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 80a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public boolean areContentsTheSame(Item oldItem, Item newItem) { 81a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return oldItem.cmpField == newItem.cmpField && oldItem.data == newItem.data; 82a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 83a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 84a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 85a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public boolean areItemsTheSame(Item item1, Item item2) { 86a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return item1.id == item2.id; 87a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 88a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar }; 89a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mList = new SortedList<Item>(Item.class, mCallback); 90a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 91a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 92be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 93a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testEmpty() { 94a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals("empty", mList.size(), 0); 95a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 96a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 97be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 98a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testAdd() { 99a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = new Item(); 100a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(insert(item), 0); 101a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(size(), 1); 102a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mAdditions.contains(new Pair(0, 1))); 103a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item2 = new Item(); 104a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item2.cmpField = item.cmpField + 1; 105a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(insert(item2), 1); 106a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(size(), 2); 107a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mAdditions.contains(new Pair(1, 1))); 108a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item3 = new Item(); 109a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item3.cmpField = item.cmpField - 1; 110a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mAdditions.clear(); 111a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(insert(item3), 0); 112a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(size(), 3); 113a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mAdditions.contains(new Pair(0, 1))); 114a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 115a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 116be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 117a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testAddDuplicate() { 118a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = new Item(); 119a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item2 = new Item(item.id, item.cmpField); 120a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item2.data = item.data; 121a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar insert(item); 122a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, insert(item2)); 123a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(1, size()); 124a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(1, mAdditions.size()); 125a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, mUpdates.size()); 126a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 127a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 128be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 129a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testRemove() { 130a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = new Item(); 131a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertFalse(remove(item)); 132a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, mRemovals.size()); 133a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar insert(item); 134a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(remove(item)); 135a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(1, mRemovals.size()); 136a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mRemovals.contains(new Pair(0, 1))); 137a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, size()); 138a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertFalse(remove(item)); 139a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(1, mRemovals.size()); 140a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 141a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 142be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 143a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testRemove2() { 144a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = new Item(); 145a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item2 = new Item(item.cmpField); 146a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar insert(item); 147a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertFalse(remove(item2)); 148a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, mRemovals.size()); 149a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 150a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 151be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 15212833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar public void clearTest() { 15312833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar insert(new Item(1)); 15412833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar insert(new Item(2)); 15512833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar assertEquals(2, mList.size()); 15612833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar mList.clear(); 15712833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar assertEquals(0, mList.size()); 15812833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar insert(new Item(3)); 15912833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar assertEquals(1, mList.size()); 16012833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar } 16112833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar 16212833d36969f1540dd5fc6fe32a25fa8b52a8e0bYigit Boyar @Test 163a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testBatch() { 164a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mList.beginBatchedUpdates(); 165be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar for (int i = 0; i < 5; i++) { 166a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mList.add(new Item(i)); 167a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 168a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertEquals(0, mAdditions.size()); 169a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mList.endBatchedUpdates(); 170a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mAdditions.contains(new Pair(0, 5))); 171a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 172a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 173be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar @Test 174a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public void testRandom() throws Throwable { 175a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Random random = new Random(System.nanoTime()); 176a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar List<Item> copy = new ArrayList<Item>(); 177a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar StringBuilder log = new StringBuilder(); 178a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar try { 179a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar for (int i = 0; i < 10000; i++) { 180a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar switch (random.nextInt(3)) { 181a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar case 0://ADD 182a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = new Item(); 183a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar copy.add(item); 184a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar insert(item); 185be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar log.append("add ").append(item).append("\n"); 186a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar break; 187a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar case 1://REMOVE 188a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (copy.size() > 0) { 189a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int index = random.nextInt(mList.size()); 190a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item = mList.get(index); 191be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar log.append("remove ").append(item).append("\n"); 192a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(copy.remove(item)); 193a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mList.remove(item)); 194a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 195a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar break; 196a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar case 2://UPDATE 197a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (copy.size() > 0) { 198a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int index = random.nextInt(mList.size()); 199a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item = mList.get(index); 200a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar // TODO this cannot work 201a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item newItem = new Item(item.id, item.cmpField); 202be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar log.append("update ").append(item).append(" to ").append(newItem) 203be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar .append("\n"); 204a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar while (newItem.data == item.data) { 205a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar newItem.data = random.nextInt(1000); 206a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 207a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int itemIndex = mList.add(newItem); 208a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar copy.remove(item); 209a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar copy.add(newItem); 210a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertSame(mList.get(itemIndex), newItem); 211a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertNotSame(mList.get(index), item); 212a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 213a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar break; 214a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar case 3:// UPDATE AT 215a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (copy.size() > 0) { 216a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int index = random.nextInt(mList.size()); 217a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar item = mList.get(index); 218a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item newItem = new Item(item.id, random.nextInt()); 219a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar mList.updateItemAt(index, newItem); 220a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar copy.remove(item); 221a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar copy.add(newItem); 222a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 223a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 224a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int lastCmp = Integer.MIN_VALUE; 225be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar for (int index = 0; index < copy.size(); index++) { 226a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertFalse(mList.indexOf(copy.get(index)) == SortedList.INVALID_POSITION); 227a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(mList.get(index).cmpField >= lastCmp); 228a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar lastCmp = mList.get(index).cmpField; 229a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertTrue(copy.contains(mList.get(index))); 230a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 231a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 232be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar for (int index = 0; index < mList.size(); index++) { 233a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertNotNull(mList.mData[index]); 234a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 235be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar for (int index = mList.size(); index < mList.mData.length; index++) { 236a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar assertNull(mList.mData[index]); 237a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 238a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 239a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 240a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } catch (Throwable t) { 241a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Collections.sort(copy, sItemComparator); 242a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar log.append("Items:\n"); 243a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar for (Item item : copy) { 244a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar log.append(item).append("\n"); 245a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 246a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar log.append("SortedList:\n"); 247be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar for (int i = 0; i < mList.size(); i++) { 248a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar log.append(mList.get(i)).append("\n"); 249a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 250a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 251a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar throw new Throwable(" \nlog:\n" + log.toString(), t); 252a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 253a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 254a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 255a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar private int size() { 256a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return mList.size(); 257a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 258a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 259a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar private int insert(Item item) { 260a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return mList.add(item); 261a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 262a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 263be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar private boolean remove(Item item) { 264a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return mList.remove(item); 265a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 266a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 267a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar static class Item { 268be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar 269a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar static int idCounter = 0; 270a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar final int id; 271a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 272a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int cmpField; 273a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 274a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int data = (int) (Math.random() * 1000);//used for comparison 275a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 276a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public Item() { 277be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar id = idCounter++; 278a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar cmpField = (int) (Math.random() * 1000); 279a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 280a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 281a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public Item(int cmpField) { 282be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar id = idCounter++; 283a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.cmpField = cmpField; 284a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 285a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 286a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public Item(int id, int cmpField) { 287a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.id = id; 288a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.cmpField = cmpField; 289a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 290a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 291a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 292a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public boolean equals(Object o) { 293a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (this == o) { 294a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return true; 295a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 296a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (o == null || getClass() != o.getClass()) { 297a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 298a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 299a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 300a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Item item = (Item) o; 301a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 302a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (cmpField != item.cmpField) { 303a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 304a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 305a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (id != item.id) { 306a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 307a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 308a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 309a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return true; 310a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 311a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 312a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 313a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public int hashCode() { 314a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int result = id; 315a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar result = 31 * result + cmpField; 316a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return result; 317a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 318a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 319a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 320a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public String toString() { 321a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return "Item{" + 322a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar "id=" + id + 323a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar ", cmpField=" + cmpField + 324a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar ", data=" + data + 325a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar '}'; 326a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 327a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 328a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 329a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar private static final class Pair { 330be7a54a6e02c9230a08e63f1c964907d129b6a10Yigit Boyar 331a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar final int first, second; 332a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 333a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public Pair(int first) { 334a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.first = first; 335a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.second = Integer.MIN_VALUE; 336a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 337a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 338a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public Pair(int first, int second) { 339a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.first = first; 340a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar this.second = second; 341a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 342a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 343a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 344a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public boolean equals(Object o) { 345a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (this == o) { 346a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return true; 347a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 348a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (o == null || getClass() != o.getClass()) { 349a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 350a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 351a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 352a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar Pair pair = (Pair) o; 353a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 354a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (first != pair.first) { 355a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 356a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 357a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar if (second != pair.second) { 358a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return false; 359a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 360a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 361a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return true; 362a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 363a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar 364a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar @Override 365a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar public int hashCode() { 366a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar int result = first; 367a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar result = 31 * result + second; 368a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar return result; 369a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 370a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar } 371a3d5bb01bc01733999d84c452a27012c57ab369cYigit Boyar}