1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.util;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayInputStream;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectInputStream;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectOutputStream;
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.lang.reflect.Method;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Collection;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.HashMap;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Iterator;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Map;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.NoSuchElementException;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Random;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Set;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.SortedMap;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.TreeMap;
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport junit.framework.TestCase;
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic abstract class SortedMapTestBase extends TestCase {
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    final int N = 1000;
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    final int TRIES = 100;
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    SortedMap<Integer, Integer> map;
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    SortedMap<Integer, Integer> ref;
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Random rnd;
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void setUp() throws Exception {
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        rnd = new Random(-1);
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < N; i++) {
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ref.put(rnd.nextInt(N) * 2, rnd.nextBoolean() ? null : rnd.nextInt(N) * 2);
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testClear() {
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.clear();
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(map.isEmpty());
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testContainsKey() {
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.containsKey(key), map.containsKey(key));
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testContainsValue() {
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int value = rnd.nextInt(N);
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.containsValue(value), map.containsValue(value));
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testEntrySet() {
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Set<Map.Entry<Integer, Integer>> refSet = ref.entrySet();
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Set<Map.Entry<Integer, Integer>> mapSet = map.entrySet();
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (Map.Entry<Integer, Integer> e : refSet) {
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue(mapSet.contains(e));
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (Map.Entry<Integer, Integer> e : mapSet) {
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue(refSet.contains(e));
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.entrySet(), map.entrySet());
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testGet() {
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.get(key), map.get(key));
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testKeySet() {
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.keySet(), map.keySet());
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator<Integer> i = ref.keySet().iterator();
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator<Integer> j = map.keySet().iterator();
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while (i.hasNext()) {
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(i.next(), j.next());
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (rnd.nextBoolean()) {
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                j.remove();
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                i.remove();
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testPut() {
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int value = rnd.nextInt(N);
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.put(key, value), map.put(key, value));
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.get(key), map.get(key));
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref, map);
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testPut0() {
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ref.clear();
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.clear();
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < N; i++) {
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int value = rnd.nextInt(N);
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.put(key, value), map.put(key, value));
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.get(key), map.get(key));
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testPutAll() {
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Map<Integer, Integer> mixin = new HashMap<Integer, Integer>(TRIES);
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            mixin.put(rnd.nextInt(N), rnd.nextInt(N));
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ref.putAll(mixin);
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.putAll(mixin);
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref, map);
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testRemove() {
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < N; i++) {
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.remove(key), map.remove(key));
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (i % (N / TRIES) == 0) {
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertEquals(ref, map);
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testRemove0() {
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while (!ref.isEmpty()) {
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = ref.tailMap((ref.firstKey() + ref.lastKey()) / 2)
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .firstKey();
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.remove(key), map.remove(key));
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testSize() {
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.size(), map.size());
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testValues() {
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.values().size(), map.values().size());
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(ref.values().containsAll(map.values()));
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(map.values().containsAll(ref.values()));
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator<Integer> i = ref.values().iterator();
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator<Integer> j = map.values().iterator();
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while (i.hasNext()) {
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(i.next(), j.next());
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (rnd.nextBoolean()) {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                j.remove();
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                i.remove();
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testComparator() {
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.comparator(), map.comparator());
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testFirstKey() {
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.firstKey(), map.firstKey());
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testHeadMap() {
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(N);
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            checkSubMap(ref.headMap(key), map.headMap(key));
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        checkSubMap(ref.headMap(-1), map.headMap(-1));
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testLastKey() {
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.lastKey(), map.lastKey());
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testSubMap() {
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key0 = rnd.nextInt(N / 2);
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key1 = rnd.nextInt(N / 2) + N / 2;
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (ref.comparator() != null &&
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    ref.comparator().compare(key0, key1) > 0) {
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                int tmp = key0;
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                key0 = key1;
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                key1 = tmp;
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            checkSubMap(ref.subMap(key0, key1), map.subMap(key0, key1));
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        boolean caught = false;
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (ref.comparator() != null && ref.comparator().compare(100, 0) < 0) {
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                map.subMap(0, 100);
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } else {
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                map.subMap(100, 0);
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IllegalArgumentException e) {
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            caught = true;
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(caught);
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int firstKey = ref.firstKey();
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Map.Entry<Integer, Integer> refE = ref.entrySet().iterator().next();
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Map.Entry<Integer, Integer> mapE = map.entrySet().iterator().next();
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        mapE.setValue(-1);
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        refE.setValue(-1);
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.get(firstKey), map.get(firstKey));
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testTailMap() {
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < TRIES; i++) {
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int key = rnd.nextInt(2 * N);
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            checkSubMap(ref.tailMap(key), map.tailMap(key));
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        checkSubMap(ref.tailMap(2 * N + 1), map.tailMap(2 * N + 1));
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testHashCode() {
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.hashCode(), map.hashCode());
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testEqualsObject() {
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(map.equals(ref));
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.put(N + 1, N + 1);
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(map.equals(ref));
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testIsEmpty() {
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.isEmpty(), map.isEmpty());
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testIsEmpty2() {
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        TreeMap<String, String> map = new TreeMap<String, String>();
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.put("one", "1");
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("size should be one", 1, map.size());
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.clear();
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("size should be zero", 0, map.size());
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Should not have entries", !map.entrySet().iterator()
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .hasNext());
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.put("one", "1");
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("size should be one", 1, map.size());
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.remove("one");
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("size should be zero", 0, map.size());
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Should not have entries", !map.entrySet().iterator()
276cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .hasNext());
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.clear();
279cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.put("0", "1");
280cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map.clear();
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(map.isEmpty());
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(map.entrySet().iterator().hasNext());
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(map.keySet().iterator().hasNext());
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(map.values().iterator().hasNext());
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testToString() {
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.toString(), map.toString());
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void checkSubMap(SortedMap<Integer, Integer> ref,
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            SortedMap<Integer, Integer> map) {
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.size(), map.size());
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref, map);
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.isEmpty(), map.isEmpty());
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        if (!ref.isEmpty()) {
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.firstKey(), map.firstKey());
299cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(ref.lastKey(), map.lastKey());
300cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            testViews(ref, map);
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } else {
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            boolean caught = false;
304cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                map.firstKey();
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (NoSuchElementException e) {
307cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                caught = true;
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            caught = false;
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                map.lastKey();
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (NoSuchElementException e) {
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                caught = true;
314cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue(caught);
316cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
317cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
318cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
319cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testViews() {
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        testViews(ref, map);
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void testViews(SortedMap<Integer, Integer> ref, SortedMap<Integer, Integer> map) {
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.keySet().size(), map.keySet().size());
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.keySet(), map.keySet());
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        compareIterators(ref.keySet(), map.keySet());
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
329cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.values().size(), map.values().size());
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        compareIterators(ref.values(), map.values());
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref.entrySet(), map.entrySet());
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        compareIterators(ref.entrySet(), map.entrySet());
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
336cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void compareIterators(Collection ref, Collection map) {
337cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator i = ref.iterator();
338cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Iterator j = map.iterator();
339cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while (i.hasNext()) {
340cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals(i.next(), j.next());
341cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (rnd.nextBoolean()) {
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                j.remove();
343cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                i.remove();
344cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                assertEquals(ref.size(), map.size());
345cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
346cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
347cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
348cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
349cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @SuppressWarnings("unchecked")
350cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testSerialization() throws IOException, ClassNotFoundException {
351cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream baos = new ByteArrayOutputStream();
352cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream oos = new ObjectOutputStream(baos);
353cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(map);
354cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.close();
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Object read = ois.readObject();
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(ref, read);
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
360cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public final void testClone() throws Exception {
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Method refClone = ref.getClass().getMethod("clone", new Class[0]);
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Method mapClone = map.getClass().getMethod("clone", new Class[0]);
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SortedMap<Integer, Integer> map2 = (SortedMap<Integer, Integer>) mapClone.invoke(map, new Object[0]);
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(refClone.invoke(ref, new Object[0]), map2);
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        map2.remove(map2.lastKey());
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(ref.equals(map2));
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
369cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
370