/* * Copyright (C) 2007 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.collect; import com.google.common.collect.Synchronized.SynchronizedBiMap; import com.google.common.collect.Synchronized.SynchronizedSet; import junit.framework.TestSuite; import java.util.Set; /** * Tests for {@code Synchronized#biMap}. * * @author Mike Bostock */ public class SynchronizedBiMapTest extends SynchronizedMapTest { public static TestSuite suite() { TestSuite suite = new TestSuite(SynchronizedBiMapTest.class); suite.addTestSuite(AbstractBiMapTests.class); return suite; } @Override protected BiMap create() { TestBiMap inner = new TestBiMap(HashBiMap.create(), mutex); BiMap outer = Synchronized.biMap(inner, mutex); return outer; } static class TestBiMap extends TestMap implements BiMap { private final BiMap delegate; public TestBiMap(BiMap delegate, Object mutex) { super(delegate, mutex); this.delegate = delegate; } @Override public V forcePut(K key, V value) { assertTrue(Thread.holdsLock(mutex)); return delegate.forcePut(key, value); } @Override public BiMap inverse() { assertTrue(Thread.holdsLock(mutex)); return delegate.inverse(); } @Override public Set values() { assertTrue(Thread.holdsLock(mutex)); return delegate.values(); } private static final long serialVersionUID = 0; } public void testForcePut() { create().forcePut(null, null); } public void testInverse() { BiMap bimap = create(); BiMap inverse = bimap.inverse(); assertSame(bimap, inverse.inverse()); assertTrue(inverse instanceof SynchronizedBiMap); assertSame(mutex, ((SynchronizedBiMap) inverse).mutex); } @Override public void testValues() { BiMap map = create(); Set values = map.values(); assertTrue(values instanceof SynchronizedSet); assertSame(mutex, ((SynchronizedSet) values).mutex); } public static class AbstractBiMapTests extends AbstractBiMapTest { public final Object mutex = new Integer(1); // something Serializable @Override protected BiMap create() { TestBiMap inner = new TestBiMap( HashBiMap.create(), mutex); BiMap outer = Synchronized.biMap(inner, mutex); return outer; } /** * If you serialize a synchronized bimap and its inverse together, the * reserialized bimaps will have backing maps that stay in sync, as shown * by the {@code testSerializationWithInverseEqual()} test. However, the * inverse of one won't be the same as the other. * * To make them the same, the inverse synchronized bimap would need a custom * serialized form, similar to what {@code AbstractBiMap.Inverse} does. */ @Override public void testSerializationWithInverseSame() {} } }