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}