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