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;
2021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackbornimport android.util.ArraySet;
21f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport android.util.Log;
22f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
23f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Collection;
24f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.HashMap;
2521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackbornimport java.util.HashSet;
26f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Iterator;
27f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Map;
28f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Set;
29f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
30f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornpublic class ArrayMapTests {
31f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static final int OP_ADD = 1;
32f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static final int OP_REM = 2;
33f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
34f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static int[] OPS = new int[] {
35f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
36f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
37f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
38f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
39f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
40f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
41f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
42f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
43f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
44f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
45f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
46f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
47f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
48f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
49f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
50f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
5162d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn            OP_ADD, OP_ADD, OP_ADD,
52f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
5362d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn            OP_REM, OP_REM, OP_REM,
54f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
55f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    };
56f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
57f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static int[] KEYS = new int[] {
58f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            // General adding and removing.
5962d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn             -1,    1900,    600,    200,   1200,   1500,   1800,    100,   1900,
60f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            2100,    300,    800,    600,   1100,   1300,   2000,   1000,   1400,
6162d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn             600,    -1,    1900,    600,    300,   2100,    200,    800,    800,
62f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            1800,   1500,   1300,   1100,   2000,   1400,   1000,   1200,   1900,
63f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
64f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            // Shrink when removing item from end.
65f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             100,    200,    300,    400,    500,    600,    700,    800,    900,
66f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             900,    800,    700,    600,    500,    400,    300,    200,    100,
67f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
68f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            // Shrink when removing item from middle.
69f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             100,    200,    300,    400,    500,    600,    700,    800,    900,
70f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             900,    800,    700,    600,    500,    400,    200,    300,    100,
71f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
72f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            // Shrink when removing item from front.
73f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             100,    200,    300,    400,    500,    600,    700,    800,    900,
74f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             900,    800,    700,    600,    500,    400,    100,    200,    300,
75f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
76f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            // Test hash collisions.
77f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             105,    106,    108,    104,    102,    102,    107,      5,    205,
78f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn               4,    202,    203,      3,      5,    101,    109,    200,    201,
7962d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn               0,     -1,    100,
80f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn             106,    108,    104,    102,    103,    105,    107,    101,    109,
8162d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn              -1,    100,      0,
82f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn               4,      5,      3,      5,    200,    203,    202,    201,    205,
83f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    };
84f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
85f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class ControlledHash {
86f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        final int mValue;
87f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
88f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        ControlledHash(int value) {
89f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mValue = value;
90f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
91f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
92f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        @Override
93f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        public final boolean equals(Object o) {
9462d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn            if (o == null) {
9562d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                return false;
9662d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn            }
97f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return mValue == ((ControlledHash)o).mValue;
98f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
99f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
100f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        @Override
101f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        public final int hashCode() {
102f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return mValue/100;
103f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
104f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
105f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        @Override
106f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        public final String toString() {
107f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return Integer.toString(mValue);
108f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
109f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
110f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
111f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    private static boolean compare(Object v1, Object v2) {
112f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        if (v1 == null) {
113f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return v2 == null;
114f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
115f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        if (v2 == null) {
116f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return false;
117f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
118f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        return v1.equals(v2);
119f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
120f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
121f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    private static boolean compareMaps(HashMap map, ArrayMap array) {
122f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        if (map.size() != array.size()) {
123f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Log.e("test", "Bad size: expected " + map.size() + ", got " + array.size());
124f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return false;
125f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
126f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
127f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Set<Map.Entry> mapSet = map.entrySet();
128f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        for (Map.Entry entry : mapSet) {
129f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object expValue = entry.getValue();
130f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object gotValue = array.get(entry.getKey());
131f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(expValue, gotValue)) {
132f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                Log.e("test", "Bad value: expected " + expValue + ", got " + gotValue
133f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + " at key " + entry.getKey());
134f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
135f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
136f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
137f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
138f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        for (int i=0; i<array.size(); i++) {
139f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object gotValue = array.valueAt(i);
140f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object key = array.keyAt(i);
141f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object expValue = map.get(key);
142f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(expValue, gotValue)) {
143f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                Log.e("test", "Bad value: expected " + expValue + ", got " + gotValue
144f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + " at key " + key);
145f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
146f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
147f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
148f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1498b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (map.entrySet().hashCode() != array.entrySet().hashCode()) {
1508b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Entry set hash codes differ: map=0x"
1518b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn                    + Integer.toHexString(map.entrySet().hashCode()) + " array=0x"
1528b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn                    + Integer.toHexString(array.entrySet().hashCode()));
1538b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1548b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1558b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1568b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!map.entrySet().equals(array.entrySet())) {
1578b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed calling equals on map entry set against array set");
1588b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1598b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1608b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1618b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!array.entrySet().equals(map.entrySet())) {
1628b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed calling equals on array entry set against map set");
1638b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1648b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1658b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1668b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (map.keySet().hashCode() != array.keySet().hashCode()) {
1678b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Key set hash codes differ: map=0x"
1688b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn                    + Integer.toHexString(map.keySet().hashCode()) + " array=0x"
1698b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn                    + Integer.toHexString(array.keySet().hashCode()));
1708b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1718b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1728b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1738b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!map.keySet().equals(array.keySet())) {
1748b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed calling equals on map key set against array set");
1758b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1768b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1778b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1788b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!array.keySet().equals(map.keySet())) {
1798b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed calling equals on array key set against map set");
1808b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1818b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1828b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1838b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!map.keySet().containsAll(array.keySet())) {
1848b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed map key set contains all of array key set");
1858b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1868b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1878b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1888b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!array.keySet().containsAll(map.keySet())) {
1898b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed array key set contains all of map key set");
1908b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1918b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1928b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1938b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!array.containsAll(map.keySet())) {
1948b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed array contains all of map key set");
1958b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
1968b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
1978b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
1988b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!map.entrySet().containsAll(array.entrySet())) {
1998b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed map entry set contains all of array entry set");
2008b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
2018b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
2028b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
2038b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        if (!array.entrySet().containsAll(map.entrySet())) {
2048b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            Log.e("test", "Failed array entry set contains all of map entry set");
2058b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn            return false;
2068b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn        }
2078b7bc13e217034e0ddd00f9033463190f50dce88Dianne Hackborn
20821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        return true;
20921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    }
21021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
21121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    private static boolean compareSets(HashSet set, ArraySet array) {
21221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (set.size() != array.size()) {
21321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "Bad size: expected " + set.size() + ", got " + array.size());
21421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return false;
21521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
21621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
21721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (Object entry : set) {
21821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!array.contains(entry)) {
21921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad value: expected " + entry + " not found in ArraySet");
220f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
221f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
222f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
223f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
22421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (int i=0; i<array.size(); i++) {
22521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Object entry = array.valueAt(i);
22621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!set.contains(entry)) {
22721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad value: unexpected " + entry + " in ArraySet");
228f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
229f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
230f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
231f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
23221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        int index = 0;
23321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (Object entry : array) {
23421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Object realEntry = array.valueAt(index);
23521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!compare(entry, realEntry)) {
23621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad iterator: expected value " + realEntry + ", got " + entry
237f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + " at index " + index);
238f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
239f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
240f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            index++;
241f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
242f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
243f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        return true;
244f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
245f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
246f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    private static boolean validateArrayMap(ArrayMap array) {
247f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Set<Map.Entry> entrySet = array.entrySet();
248f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        int index=0;
249f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Iterator<Map.Entry> entryIt = entrySet.iterator();
250f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        while (entryIt.hasNext()) {
251f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Map.Entry entry = entryIt.next();
252f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object value = entry.getKey();
253f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object realValue = array.keyAt(index);
254f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(realValue, value)) {
25521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad array map entry set: expected key " + realValue
256f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + ", got " + value + " at index " + index);
257f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
258f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
259f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            value = entry.getValue();
260f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            realValue = array.valueAt(index);
261f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(realValue, value)) {
26221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad array map entry set: expected value " + realValue
263f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + ", got " + value + " at index " + index);
264f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
265f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
266f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            index++;
267f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
268f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
269f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        index = 0;
270f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Set keySet = array.keySet();
271f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Iterator keyIt = keySet.iterator();
272f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        while (keyIt.hasNext()) {
273f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object value = keyIt.next();
274f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object realValue = array.keyAt(index);
275f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(realValue, value)) {
27621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad array map key set: expected key " + realValue
277f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + ", got " + value + " at index " + index);
278f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
279f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
280f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            index++;
281f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
282f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
283f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        index = 0;
284f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Collection valueCol = array.values();
285f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Iterator valueIt = valueCol.iterator();
286f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        while (valueIt.hasNext()) {
287f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object value = valueIt.next();
288f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Object realValue = array.valueAt(index);
289f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (!compare(realValue, value)) {
29021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad array map value col: expected value " + realValue
291f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                        + ", got " + value + " at index " + index);
292f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return false;
293f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
294f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            index++;
295f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
296f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
297f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        return true;
298f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
299f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
30021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    private static void dump(Map map, ArrayMap array) {
301f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Log.e("test", "HashMap of " + map.size() + " entries:");
302f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Set<Map.Entry> mapSet = map.entrySet();
303f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        for (Map.Entry entry : mapSet) {
304f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Log.e("test", "    " + entry.getKey() + " -> " + entry.getValue());
305f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
306f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Log.e("test", "ArrayMap of " + array.size() + " entries:");
307f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        for (int i=0; i<array.size(); i++) {
308f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Log.e("test", "    " + array.keyAt(i) + " -> " + array.valueAt(i));
309f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
310f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
311f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
31221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    private static void dump(Set set, ArraySet array) {
31321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        Log.e("test", "HashSet of " + set.size() + " entries:");
31421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (Object entry : set) {
31521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "    " + entry);
31621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
31721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        Log.e("test", "ArraySet of " + array.size() + " entries:");
31821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (int i=0; i<array.size(); i++) {
31921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "    " + array.valueAt(i));
32021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
32121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    }
32221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
323f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase    private static void dump(ArrayMap map1, ArrayMap map2) {
324f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        Log.e("test", "ArrayMap of " + map1.size() + " entries:");
325f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        Set<Map.Entry> mapSet = map1.entrySet();
326f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        for (int i=0; i<map2.size(); i++) {
327f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "    " + map1.keyAt(i) + " -> " + map1.valueAt(i));
328f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
329f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        Log.e("test", "ArrayMap of " + map2.size() + " entries:");
330f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        for (int i=0; i<map2.size(); i++) {
331f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "    " + map2.keyAt(i) + " -> " + map2.valueAt(i));
332f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
333f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase    }
334f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
335f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    public static void run() {
33621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        HashMap<ControlledHash, Integer> hashMap = new HashMap<ControlledHash, Integer>();
33721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArrayMap<ControlledHash, Integer> arrayMap = new ArrayMap<ControlledHash, Integer>();
33821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        HashSet<ControlledHash> hashSet = new HashSet<ControlledHash>();
33921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArraySet<ControlledHash> arraySet = new ArraySet<ControlledHash>();
340f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
341f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        for (int i=0; i<OPS.length; i++) {
34221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Integer oldHash;
343f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Integer oldArray;
34421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            boolean hashChanged;
34521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            boolean arrayChanged;
34662d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn            ControlledHash key = KEYS[i] < 0 ? null : new ControlledHash(KEYS[i]);
347f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            switch (OPS[i]) {
348f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                case OP_ADD:
349f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    Log.i("test", "Adding key: " + KEYS[i]);
35062d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    oldHash = hashMap.put(key, i);
35162d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    oldArray = arrayMap.put(key, i);
35262d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    hashChanged = hashSet.add(key);
35362d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    arrayChanged = arraySet.add(key);
354f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    break;
355f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                case OP_REM:
356f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    Log.i("test", "Removing key: " + KEYS[i]);
35762d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    oldHash = hashMap.remove(key);
35862d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    oldArray = arrayMap.remove(key);
35962d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    hashChanged = hashSet.remove(key);
36062d708f4dd8e2a8554df4967837df9896efeff7cDianne Hackborn                    arrayChanged = arraySet.remove(key);
361f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    break;
362f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                default:
363f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    Log.e("test", "Bad operation " + OPS[i] + " @ " + i);
364f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    return;
365f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
36621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!compare(oldHash, oldArray)) {
36721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad result: expected " + oldHash + ", got " + oldArray);
36821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                dump(hashMap, arrayMap);
36921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                return;
37021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            }
37121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (hashChanged != arrayChanged) {
37221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                Log.e("test", "Bad change: expected " + hashChanged + ", got " + arrayChanged);
37321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                dump(hashSet, arraySet);
374f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return;
375f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
37621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!validateArrayMap(arrayMap)) {
37721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                dump(hashMap, arrayMap);
378f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return;
379f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
38021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!compareMaps(hashMap, arrayMap)) {
38121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                dump(hashMap, arrayMap);
38221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                return;
38321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            }
38421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (!compareSets(hashSet, arraySet)) {
38521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                dump(hashSet, arraySet);
386f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return;
387f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
388f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
389f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
39021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        arrayMap.put(new ControlledHash(50000), 100);
391f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        ControlledHash lookup = new ControlledHash(50000);
39221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        Iterator<ControlledHash> it = arrayMap.keySet().iterator();
39321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        while (it.hasNext()) {
39421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            if (it.next().equals(lookup)) {
39521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                it.remove();
39621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            }
39721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
39821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (arrayMap.containsKey(lookup)) {
39921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "Bad map iterator: didn't remove test key");
40021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            dump(hashMap, arrayMap);
40121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
40221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
40321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        arraySet.add(new ControlledHash(50000));
40421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        it = arraySet.iterator();
405f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        while (it.hasNext()) {
406f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            if (it.next().equals(lookup)) {
407f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                it.remove();
408f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
409f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
41021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (arraySet.contains(lookup)) {
41121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "Bad set iterator: didn't remove test key");
41221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            dump(hashSet, arraySet);
41321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
41421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
41521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (!equalsMapTest()) {
41621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return;
417f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
418f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
41921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (!equalsSetTest()) {
420f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return;
421f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
422f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
42321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        // map copy constructor test
424f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        ArrayMap newMap = new ArrayMap<Integer, String>();
425f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        for (int i = 0; i < 10; ++i) {
426f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            newMap.put(i, String.valueOf(i));
427f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
428f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        ArrayMap mapCopy = new ArrayMap(newMap);
429f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        if (!compare(mapCopy, newMap)) {
430f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "ArrayMap copy constructor failure: expected " +
431f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase                    newMap + ", got " + mapCopy);
43221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            dump(newMap, mapCopy);
43321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return;
43421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
43521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
43621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        // set copy constructor test
43721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArraySet newSet = new ArraySet<Integer>();
43821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (int i = 0; i < 10; ++i) {
43921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            newSet.add(i);
44021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
44121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArraySet setCopy = new ArraySet(newSet);
44221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (!compare(setCopy, newSet)) {
44321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "ArraySet copy constructor failure: expected " +
44421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                    newSet + ", got " + setCopy);
44521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            dump(newSet, setCopy);
446f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return;
447f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
448f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
449f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        Log.e("test", "Test successful; printing final map.");
45021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        dump(hashMap, arrayMap);
45121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
45221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        Log.e("test", "Test successful; printing final set.");
45321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        dump(hashSet, arraySet);
454f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
455f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
45621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    private static boolean equalsMapTest() {
457f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        ArrayMap<Integer, String> map1 = new ArrayMap<Integer, String>();
458f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        ArrayMap<Integer, String> map2 = new ArrayMap<Integer, String>();
459f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        HashMap<Integer, String> map3 = new HashMap<Integer, String>();
460f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        if (!compare(map1, map2) || !compare(map1, map3) || !compare(map3, map2)) {
461f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "ArrayMap equals failure for empty maps " + map1 + ", " +
462f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase                    map2 + ", " + map3);
463f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return false;
464f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
465f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
466f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        for (int i = 0; i < 10; ++i) {
467f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            String value = String.valueOf(i);
468f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            map1.put(i, value);
469f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            map2.put(i, value);
470f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            map3.put(i, value);
471f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
472f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        if (!compare(map1, map2) || !compare(map1, map3) || !compare(map3, map2)) {
473f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "ArrayMap equals failure for populated maps " + map1 + ", " +
474f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase                    map2 + ", " + map3);
475f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return false;
476f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
477f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
478f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        map1.remove(0);
479f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        if (compare(map1, map2) || compare(map1, map3) || compare(map3, map1)) {
480f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "ArrayMap equals failure for map size " + map1 + ", " +
481f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase                    map2 + ", " + map3);
482f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return false;
483f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
484f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
485f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        map1.put(0, "-1");
486f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        if (compare(map1, map2) || compare(map1, map3) || compare(map3, map1)) {
487f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            Log.e("test", "ArrayMap equals failure for map contents " + map1 + ", " +
488f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase                    map2 + ", " + map3);
489f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase            return false;
490f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        }
491f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase
492f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase        return true;
493f4130cf35fa128e36f96e55955d4f5db86197e4aChet Haase    }
49421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
49521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    private static boolean equalsSetTest() {
49621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArraySet<Integer> set1 = new ArraySet<Integer>();
49721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        ArraySet<Integer> set2 = new ArraySet<Integer>();
49821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        HashSet<Integer> set3 = new HashSet<Integer>();
49921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (!compare(set1, set2) || !compare(set1, set3) || !compare(set3, set2)) {
50021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "ArraySet equals failure for empty sets " + set1 + ", " +
50121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                    set2 + ", " + set3);
50221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return false;
50321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
50421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
50521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        for (int i = 0; i < 10; ++i) {
50621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            set1.add(i);
50721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            set2.add(i);
50821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            set3.add(i);
50921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
51021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (!compare(set1, set2) || !compare(set1, set3) || !compare(set3, set2)) {
51121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "ArraySet equals failure for populated sets " + set1 + ", " +
51221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                    set2 + ", " + set3);
51321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return false;
51421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
51521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
51621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        set1.remove(0);
51721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (compare(set1, set2) || compare(set1, set3) || compare(set3, set1)) {
51821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "ArraSet equals failure for set size " + set1 + ", " +
51921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                    set2 + ", " + set3);
52021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return false;
52121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
52221ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
52321ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        set1.add(-1);
52421ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        if (compare(set1, set2) || compare(set1, set3) || compare(set3, set1)) {
52521ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            Log.e("test", "ArraySet equals failure for set contents " + set1 + ", " +
52621ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn                    set2 + ", " + set3);
52721ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn            return false;
52821ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        }
52921ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn
53021ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn        return true;
53121ab6f49910a6f319bc7b9d3964086cb1ffe09d0Dianne Hackborn    }
532f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn}
533