• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.collect;
18 
19 import com.google.common.annotations.GwtCompatible;
20 
21 import java.util.IdentityHashMap;
22 import java.util.Iterator;
23 import java.util.Map;
24 import java.util.Map.Entry;
25 import java.util.Set;
26 
27 /**
28  * Tests for {@link HashBiMap}.
29  *
30  * @author Mike Bostock
31  */
32 @GwtCompatible
33 public class HashBiMapTest extends AbstractBiMapTest {
34 
create()35   @Override protected BiMap<Integer, String> create() {
36     return HashBiMap.create();
37   }
38 
testCreate()39   public void testCreate() {
40     BiMap<String, String> bimap = HashBiMap.create();
41     assertEquals(0, bimap.size());
42     bimap.put("canada", "dollar");
43     assertEquals("dollar", bimap.get("canada"));
44     assertEquals("canada", bimap.inverse().get("dollar"));
45   }
46 
testMapConstructor()47   public void testMapConstructor() {
48     /* Test with non-empty Map. */
49     Map<String, String> map = ImmutableMap.of(
50         "canada", "dollar",
51         "chile", "peso",
52         "switzerland", "franc");
53     HashBiMap<String, String> bimap = HashBiMap.create(map);
54     assertEquals("dollar", bimap.get("canada"));
55     assertEquals("canada", bimap.inverse().get("dollar"));
56   }
57 
58   private static final int N = 1000;
59 
testBashIt()60   public void testBashIt() throws Exception {
61     BiMap<Integer, Integer> bimap = HashBiMap.create(N);
62     BiMap<Integer, Integer> inverse = bimap.inverse();
63 
64     for (int i = 0; i < N; i++) {
65       assertNull(bimap.put(2 * i, 2 * i + 1));
66     }
67     for (int i = 0; i < N; i++) {
68       assertEquals(2 * i + 1, (int) bimap.get(2 * i));
69     }
70     for (int i = 0; i < N; i++) {
71       assertEquals(2 * i, (int) inverse.get(2 * i + 1));
72     }
73     for (int i = 0; i < N; i++) {
74       int oldValue = bimap.get(2 * i);
75       assertEquals(2 * i + 1, (int) bimap.put(2 * i, oldValue - 2));
76     }
77     for (int i = 0; i < N; i++) {
78       assertEquals(2 * i - 1, (int) bimap.get(2 * i));
79     }
80     for (int i = 0; i < N; i++) {
81       assertEquals(2 * i, (int) inverse.get(2 * i - 1));
82     }
83     Set<Entry<Integer, Integer>> entries = bimap.entrySet();
84     for (Entry<Integer, Integer> entry : entries) {
85       entry.setValue(entry.getValue() + 2 * N);
86     }
87     for (int i = 0; i < N; i++) {
88       assertEquals(2 * N + 2 * i - 1, (int) bimap.get(2 * i));
89     }
90   }
91 
92   // The next two tests verify that map entries are not accessed after they're
93   // removed, since IdentityHashMap throws an exception when that occurs.
testIdentityKeySetIteratorRemove()94   public void testIdentityKeySetIteratorRemove() {
95     bimap = new AbstractBiMap<Integer, String>(
96         new IdentityHashMap<Integer, String>(),
97         new IdentityHashMap<String, Integer>()) {};
98     putOneTwoThree();
99     Iterator<Integer> iterator = bimap.keySet().iterator();
100     iterator.next();
101     iterator.next();
102     iterator.remove();
103     iterator.next();
104     iterator.remove();
105     assertEquals(1, bimap.size());
106     assertEquals(1, bimap.inverse().size());
107   }
108 
testIdentityEntrySetIteratorRemove()109   public void testIdentityEntrySetIteratorRemove() {
110     bimap = new AbstractBiMap<Integer, String>(
111         new IdentityHashMap<Integer, String>(),
112         new IdentityHashMap<String, Integer>()) {};
113     putOneTwoThree();
114     Iterator<Entry<Integer, String>> iterator = bimap.entrySet().iterator();
115     iterator.next();
116     iterator.next();
117     iterator.remove();
118     iterator.next();
119     iterator.remove();
120     assertEquals(1, bimap.size());
121     assertEquals(1, bimap.inverse().size());
122   }
123 }
124