ArrayMapTests.java revision f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccda
1f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn/* 2f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * Copyright (C) 2013 The Android Open Source Project 3f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * 4f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * you may not use this file except in compliance with the License. 6f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * You may obtain a copy of the License at 7f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * 8f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * 10f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * See the License for the specific language governing permissions and 14f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn * limitations under the License. 15f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn */ 16f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 17f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornpackage com.google.android.test.activity; 18f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 19f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport android.util.ArrayMap; 20f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport android.util.Log; 21f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 22f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Collection; 23f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.HashMap; 24f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Iterator; 25f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Map; 26f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Set; 27f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 28f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornpublic class ArrayMapTests { 29f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn static final int OP_ADD = 1; 30f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn static final int OP_REM = 2; 31f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 32f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn static int[] OPS = new int[] { 33f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 34f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 35f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 36f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 37f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 38f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 39f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 40f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 41f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 42f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 43f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 44f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 45f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 46f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 47f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 48f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, 49f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 50f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, 51f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn }; 52f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 53f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn static int[] KEYS = new int[] { 54f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn // General adding and removing. 55f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 100, 1900, 600, 200, 1200, 1500, 1800, 100, 1900, 56f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 2100, 300, 800, 600, 1100, 1300, 2000, 1000, 1400, 57f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 600, 100, 1900, 600, 300, 2100, 200, 800, 800, 58f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 1800, 1500, 1300, 1100, 2000, 1400, 1000, 1200, 1900, 59f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 60f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn // Shrink when removing item from end. 61f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 100, 200, 300, 400, 500, 600, 700, 800, 900, 62f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 900, 800, 700, 600, 500, 400, 300, 200, 100, 63f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 64f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn // Shrink when removing item from middle. 65f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 100, 200, 300, 400, 500, 600, 700, 800, 900, 66f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 900, 800, 700, 600, 500, 400, 200, 300, 100, 67f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 68f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn // Shrink when removing item from front. 69f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 100, 200, 300, 400, 500, 600, 700, 800, 900, 70f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 900, 800, 700, 600, 500, 400, 100, 200, 300, 71f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 72f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn // Test hash collisions. 73f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 105, 106, 108, 104, 102, 102, 107, 5, 205, 74f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 4, 202, 203, 3, 5, 101, 109, 200, 201, 75f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 106, 108, 104, 102, 103, 105, 107, 101, 109, 76f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 4, 5, 3, 5, 200, 203, 202, 201, 205, 77f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn }; 78f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 79f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn static class ControlledHash { 80f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn final int mValue; 81f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 82f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn ControlledHash(int value) { 83f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn mValue = value; 84f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 85f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 86f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn @Override 87f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn public final boolean equals(Object o) { 88f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return mValue == ((ControlledHash)o).mValue; 89f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 90f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 91f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn @Override 92f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn public final int hashCode() { 93f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return mValue/100; 94f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 95f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 96f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn @Override 97f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn public final String toString() { 98f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return Integer.toString(mValue); 99f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 100f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 101f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 102f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn private static boolean compare(Object v1, Object v2) { 103f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (v1 == null) { 104f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return v2 == null; 105f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 106f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (v2 == null) { 107f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 108f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 109f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return v1.equals(v2); 110f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 111f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 112f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn private static boolean compareMaps(HashMap map, ArrayMap array) { 113f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (map.size() != array.size()) { 114f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad size: expected " + map.size() + ", got " + array.size()); 115f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 116f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 117f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 118f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Set<Map.Entry> mapSet = map.entrySet(); 119f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (Map.Entry entry : mapSet) { 120f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object expValue = entry.getValue(); 121f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object gotValue = array.get(entry.getKey()); 122f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(expValue, gotValue)) { 123f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad value: expected " + expValue + ", got " + gotValue 124f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at key " + entry.getKey()); 125f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 126f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 127f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 128f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 129f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (int i=0; i<array.size(); i++) { 130f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object gotValue = array.valueAt(i); 131f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object key = array.keyAt(i); 132f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object expValue = map.get(key); 133f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(expValue, gotValue)) { 134f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad value: expected " + expValue + ", got " + gotValue 135f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at key " + key); 136f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 137f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 138f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 139f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 140f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn int index = 0; 141f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (Object entry : array.entrySet()) { 142f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object key = ((Map.Entry)entry).getKey(); 143f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object value = ((Map.Entry)entry).getValue(); 144f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realKey = array.keyAt(index); 145f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realValue = array.valueAt(index); 146f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(key, realKey)) { 147f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad entry iterator: expected key " + realKey + ", got " + key 148f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at index " + index); 149f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 150f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 151f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(value, realValue)) { 152f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad entry iterator: expected value " + realValue + ", got " + value 153f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at index " + index); 154f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 155f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 156f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 157f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 158f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 159f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index = 0; 160f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (Object key : array.keySet()) { 161f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realKey = array.keyAt(index); 162f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(key, realKey)) { 163f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad key iterator: expected key " + realKey + ", got " + key 164f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at index " + index); 165f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 166f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 167f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 168f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 169f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 170f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index = 0; 171f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (Object value : array.values()) { 172f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realValue = array.valueAt(index); 173f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(value, realValue)) { 174f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad value iterator: expected value " + realValue + ", got " + value 175f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + " at index " + index); 176f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 177f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 178f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 179f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 180f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 181f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return true; 182f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 183f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 184f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn private static boolean validateArrayMap(ArrayMap array) { 185f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Set<Map.Entry> entrySet = array.entrySet(); 186f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn int index=0; 187f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Iterator<Map.Entry> entryIt = entrySet.iterator(); 188f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn while (entryIt.hasNext()) { 189f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Map.Entry entry = entryIt.next(); 190f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object value = entry.getKey(); 191f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realValue = array.keyAt(index); 192f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(realValue, value)) { 193f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad hash array entry set: expected key " + realValue 194f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + ", got " + value + " at index " + index); 195f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 196f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 197f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn value = entry.getValue(); 198f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn realValue = array.valueAt(index); 199f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(realValue, value)) { 200f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad hash array entry set: expected value " + realValue 201f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + ", got " + value + " at index " + index); 202f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 203f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 204f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 205f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 206f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 207f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index = 0; 208f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Set keySet = array.keySet(); 209f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Iterator keyIt = keySet.iterator(); 210f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn while (keyIt.hasNext()) { 211f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object value = keyIt.next(); 212f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realValue = array.keyAt(index); 213f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(realValue, value)) { 214f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad hash array key set: expected key " + realValue 215f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + ", got " + value + " at index " + index); 216f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 217f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 218f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 219f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 220f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 221f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index = 0; 222f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Collection valueCol = array.values(); 223f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Iterator valueIt = valueCol.iterator(); 224f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn while (valueIt.hasNext()) { 225f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object value = valueIt.next(); 226f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Object realValue = array.valueAt(index); 227f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(realValue, value)) { 228f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad hash array value col: expected value " + realValue 229f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn + ", got " + value + " at index " + index); 230f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return false; 231f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 232f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn index++; 233f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 234f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 235f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return true; 236f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 237f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 238f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn private static void dump(HashMap map, ArrayMap array) { 239f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "HashMap of " + map.size() + " entries:"); 240f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Set<Map.Entry> mapSet = map.entrySet(); 241f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (Map.Entry entry : mapSet) { 242f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", " " + entry.getKey() + " -> " + entry.getValue()); 243f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 244f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "ArrayMap of " + array.size() + " entries:"); 245f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (int i=0; i<array.size(); i++) { 246f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", " " + array.keyAt(i) + " -> " + array.valueAt(i)); 247f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 248f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 249f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 250f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn public static void run() { 251f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn HashMap<ControlledHash, Integer> mHashMap = new HashMap<ControlledHash, Integer>(); 252f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn ArrayMap<ControlledHash, Integer> mArrayMap = new ArrayMap<ControlledHash, Integer>(); 253f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 254f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn for (int i=0; i<OPS.length; i++) { 255f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Integer oldMap; 256f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Integer oldArray; 257f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn switch (OPS[i]) { 258f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn case OP_ADD: 259f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.i("test", "Adding key: " + KEYS[i]); 260f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn oldMap = mHashMap.put(new ControlledHash(KEYS[i]), i); 261f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn oldArray = mArrayMap.put(new ControlledHash(KEYS[i]), i); 262f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn break; 263f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn case OP_REM: 264f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.i("test", "Removing key: " + KEYS[i]); 265f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn oldMap = mHashMap.remove(new ControlledHash(KEYS[i])); 266f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn oldArray = mArrayMap.remove(new ControlledHash(KEYS[i])); 267f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn break; 268f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn default: 269f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad operation " + OPS[i] + " @ " + i); 270f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return; 271f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 272f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compare(oldMap, oldArray)) { 273f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad result: expected " + oldMap + ", got " + oldArray); 274f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn dump(mHashMap, mArrayMap); 275f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return; 276f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 277f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!validateArrayMap(mArrayMap)) { 278f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn dump(mHashMap, mArrayMap); 279f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return; 280f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 281f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (!compareMaps(mHashMap, mArrayMap)) { 282f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn dump(mHashMap, mArrayMap); 283f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return; 284f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 285f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 286f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 287f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn mArrayMap.put(new ControlledHash(50000), 100); 288f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn ControlledHash lookup = new ControlledHash(50000); 289f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Iterator<ControlledHash> it = mArrayMap.keySet().iterator(); 290f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn while (it.hasNext()) { 291f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (it.next().equals(lookup)) { 292f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn it.remove(); 293f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 294f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 295f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn if (mArrayMap.containsKey(lookup)) { 296f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Bad iterator: didn't remove test key"); 297f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn dump(mHashMap, mArrayMap); 298f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 299f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn 300f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn Log.e("test", "Test successful; printing final map."); 301f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn dump(mHashMap, mArrayMap); 302f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 303f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn} 304