1a046d00fSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3a046d00fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4a046d00fSAndrew Rist * or more contributor license agreements. See the NOTICE file 5a046d00fSAndrew Rist * distributed with this work for additional information 6a046d00fSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7a046d00fSAndrew Rist * to you under the Apache License, Version 2.0 (the 8a046d00fSAndrew Rist * "License"); you may not use this file except in compliance 9a046d00fSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11a046d00fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13a046d00fSAndrew Rist * Unless required by applicable law or agreed to in writing, 14a046d00fSAndrew Rist * software distributed under the License is distributed on an 15a046d00fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16a046d00fSAndrew Rist * KIND, either express or implied. See the License for the 17a046d00fSAndrew Rist * specific language governing permissions and limitations 18a046d00fSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20a046d00fSAndrew Rist *************************************************************/ 21a046d00fSAndrew Rist 22a046d00fSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir package com.sun.star.lib.util; 25cdf0e10cSrcweir 26cdf0e10cSrcweir import util.WaitUnreachable; 27cdf0e10cSrcweir 28*967b1ad8SDamjan Jovanovic import org.junit.Test; 29*967b1ad8SDamjan Jovanovic import static org.junit.Assert.*; 30cdf0e10cSrcweir 31*967b1ad8SDamjan Jovanovic public final class WeakMap_Test { 32*967b1ad8SDamjan Jovanovic @Test test()33cdf0e10cSrcweir public void test() { 34cdf0e10cSrcweir WeakMap m = new WeakMap(); 35*967b1ad8SDamjan Jovanovic assertTrue("", m.size() == 0); 36*967b1ad8SDamjan Jovanovic assertTrue("", m.isEmpty()); 37*967b1ad8SDamjan Jovanovic assertTrue("", !m.containsKey("key1")); 38*967b1ad8SDamjan Jovanovic assertTrue("", !m.containsValue(null)); 39cdf0e10cSrcweir WaitUnreachable u1 = new WaitUnreachable(new Object()); 40cdf0e10cSrcweir m.put("key1", u1.get()); 41cdf0e10cSrcweir WaitUnreachable u2 = new WaitUnreachable(new Disposable()); 42cdf0e10cSrcweir m.put("key2", u2.get()); 43*967b1ad8SDamjan Jovanovic assertTrue("", m.size() == 2); 44*967b1ad8SDamjan Jovanovic assertTrue("", !m.isEmpty()); 45*967b1ad8SDamjan Jovanovic assertTrue("", m.containsKey("key1")); 46*967b1ad8SDamjan Jovanovic assertTrue("", m.containsKey("key2")); 47*967b1ad8SDamjan Jovanovic assertTrue("", !m.containsKey("key3")); 48*967b1ad8SDamjan Jovanovic assertTrue("", m.containsValue(m.get("key1"))); 49*967b1ad8SDamjan Jovanovic assertTrue("", m.containsValue(m.get("key2"))); 50*967b1ad8SDamjan Jovanovic assertTrue("", WeakMap.getValue(m.get("key1")).equals(u1.get())); 51*967b1ad8SDamjan Jovanovic assertTrue("", WeakMap.getValue(m.get("key2")).equals(u2.get())); 52*967b1ad8SDamjan Jovanovic assertTrue("", m.values().size() == 2); 53*967b1ad8SDamjan Jovanovic assertTrue("", m.values().contains(m.get("key1"))); 54*967b1ad8SDamjan Jovanovic assertTrue("", m.values().contains(m.get("key2"))); 55cdf0e10cSrcweir u1.waitUnreachable(); 56*967b1ad8SDamjan Jovanovic assertTrue("", WeakMap.getValue(m.get("key1")) == null); 57cdf0e10cSrcweir ((Disposable) u2.get()).dispose(); 58*967b1ad8SDamjan Jovanovic assertTrue("", WeakMap.getValue(m.get("key2")) == null); 59cdf0e10cSrcweir m.clear(); 60cdf0e10cSrcweir u2.waitUnreachable(); 61*967b1ad8SDamjan Jovanovic assertTrue("", m.size() == 0); 62cdf0e10cSrcweir m.put("key2", new Object()); 63*967b1ad8SDamjan Jovanovic assertTrue("", m.size() == 1); 64cdf0e10cSrcweir } 65cdf0e10cSrcweir 66cdf0e10cSrcweir // This simple class (single listener, no synchronization) exploits 67cdf0e10cSrcweir // knowledge about the implementation of WeakMap: 68cdf0e10cSrcweir private static final class Disposable implements DisposeNotifier { addDisposeListener(DisposeListener listener)69cdf0e10cSrcweir public void addDisposeListener(DisposeListener listener) { 70cdf0e10cSrcweir this.listener = listener; 71cdf0e10cSrcweir } 72cdf0e10cSrcweir dispose()73cdf0e10cSrcweir public void dispose() { 74cdf0e10cSrcweir if (listener != null) { 75cdf0e10cSrcweir listener.notifyDispose(this); 76cdf0e10cSrcweir } 77cdf0e10cSrcweir } 78cdf0e10cSrcweir 79cdf0e10cSrcweir private DisposeListener listener = null; 80cdf0e10cSrcweir } 81cdf0e10cSrcweir } 82