1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.util; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertTrue; 21 22 import android.support.annotation.NonNull; 23 import android.support.test.filters.SmallTest; 24 import android.support.test.runner.AndroidJUnit4; 25 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 30 import java.util.Random; 31 32 /** 33 * Internal tests for {@link SparseLongArray}. 34 */ 35 @SmallTest 36 @RunWith(AndroidJUnit4.class) 37 public class SparseLongArrayTest { 38 39 private static final int TEST_SIZE = 1000; 40 41 private SparseLongArray mSparseLongArray; 42 private int[] mKeys; 43 private long[] mValues; 44 private Random mRandom; 45 46 private static boolean isSame(@NonNull SparseLongArray array1, 47 @NonNull SparseLongArray array2) { 48 if (array1.size() != array2.size()) { 49 return false; 50 } 51 for (int i = 0; i < array1.size(); i++) { 52 if (array1.keyAt(i) != array2.keyAt(i) || array1.valueAt(i) != array2.valueAt(i)) { 53 return false; 54 } 55 } 56 return true; 57 } 58 59 private void assertRemoved(int startIndex, int endIndex) { 60 for (int i = 0; i < TEST_SIZE; i++) { 61 if (i >= startIndex && i <= endIndex) { 62 assertEquals("Entry not removed", Long.MIN_VALUE, 63 mSparseLongArray.get(mKeys[i], Long.MIN_VALUE)); 64 } else { 65 assertEquals("Untouched entry corrupted", mValues[i], 66 mSparseLongArray.get(mKeys[i])); 67 } 68 } 69 } 70 71 /** 72 * Generates a sorted array of distinct and random keys 73 * 74 * @param size the number of keys to return in the array. Should be < (2^31)/1000. 75 * @return the array of keys 76 */ 77 private int[] generateRandomKeys(int size) { 78 final int[] keys = new int[size]; 79 keys[0] = -1 * mRandom.nextInt(size * 500); 80 for (int i = 1; i < size; i++) { 81 keys[i] = keys[i - 1] + 1 + mRandom.nextInt(1000); 82 assertTrue(keys[i] > keys[i - 1]); 83 } 84 return keys; 85 } 86 87 @Before 88 public void setUp() { 89 mSparseLongArray = new SparseLongArray(); 90 mRandom = new Random(12345); 91 mKeys = generateRandomKeys(TEST_SIZE); 92 mValues = new long[TEST_SIZE]; 93 for (int i = 0; i < TEST_SIZE; i++) { 94 mValues[i] = i + 1; 95 mSparseLongArray.put(mKeys[i], mValues[i]); 96 } 97 } 98 99 @Test 100 public void testRemoveAtRange_removeHead() { 101 mSparseLongArray.removeAtRange(0, 100); 102 assertEquals(TEST_SIZE - 100, mSparseLongArray.size()); 103 assertRemoved(0, 99); 104 } 105 106 @Test 107 public void testRemoveAtRange_removeTail() { 108 mSparseLongArray.removeAtRange(TEST_SIZE - 200, 200); 109 assertEquals(TEST_SIZE - 200, mSparseLongArray.size()); 110 assertRemoved(TEST_SIZE - 200, TEST_SIZE - 1); 111 } 112 113 @Test 114 public void testRemoveAtRange_removeOverflow() { 115 mSparseLongArray.removeAtRange(TEST_SIZE - 100, 200); 116 assertEquals(TEST_SIZE - 100, mSparseLongArray.size()); 117 assertRemoved(TEST_SIZE - 100, TEST_SIZE - 1); 118 } 119 120 @Test 121 public void testRemoveAtRange_removeEverything() { 122 mSparseLongArray.removeAtRange(0, TEST_SIZE); 123 assertEquals(0, mSparseLongArray.size()); 124 assertRemoved(0, TEST_SIZE - 1); 125 } 126 127 @Test 128 public void testRemoveAtRange_removeMiddle() { 129 mSparseLongArray.removeAtRange(200, 200); 130 assertEquals(TEST_SIZE - 200, mSparseLongArray.size()); 131 assertRemoved(200, 399); 132 } 133 134 @Test 135 public void testRemoveAtRange_removeSingle() { 136 mSparseLongArray.removeAtRange(300, 1); 137 assertEquals(TEST_SIZE - 1, mSparseLongArray.size()); 138 assertRemoved(300, 300); 139 } 140 141 @Test 142 public void testRemoveAtRange_compareRemoveAt() { 143 final SparseLongArray sparseLongArray2 = mSparseLongArray.clone(); 144 assertTrue(isSame(mSparseLongArray, sparseLongArray2)); 145 146 final int startIndex = 101; 147 final int endIndex = 200; 148 mSparseLongArray.removeAtRange(startIndex, endIndex - startIndex + 1); 149 for (int i = endIndex; i >= startIndex; i--) { 150 sparseLongArray2.removeAt(i); 151 } 152 assertEquals(TEST_SIZE - (endIndex - startIndex + 1), mSparseLongArray.size()); 153 assertRemoved(startIndex, endIndex); 154 assertTrue(isSame(sparseLongArray2, mSparseLongArray)); 155 } 156 } 157