/*******************************************************************************
 * Copyright (c) 2008, 2010 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.osgi.tests.eventmgr;

import java.util.*;
import junit.framework.*;
import org.eclipse.osgi.framework.eventmgr.CopyOnWriteIdentityMap;

public class EventManagerTests extends TestCase {
	public static Test suite() {
		return new TestSuite(EventManagerTests.class);
	}

	public void testCopyOnWriteIdentityMap() {
		Object l1 = new Object();
		Object l2 = new Object();
		Object l3 = new Object();
		Object l4 = new Object();
		Object c1 = new Object();
		Object c2 = new Object();
		Object c3 = new Object();
		Object c4 = new Object();

		CopyOnWriteIdentityMap el1 = new CopyOnWriteIdentityMap();

		assertTrue("not empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 0, el1.size()); //$NON-NLS-1$

		assertNull("non null", el1.put(l1, c1)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 1, el1.size()); //$NON-NLS-1$

		assertNull("non null", el1.put(l2, c2)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el1.size()); //$NON-NLS-1$

		assertNull("non null", el1.put(l3, c3)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 3, el1.size()); //$NON-NLS-1$

		assertNull("non null", el1.put(l4, c4)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el1.size()); //$NON-NLS-1$

		assertEquals("wrong value", c1, el1.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el1.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el1.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el1.get(l4)); //$NON-NLS-1$

		CopyOnWriteIdentityMap el2 = new CopyOnWriteIdentityMap(el1);
		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el2.size()); //$NON-NLS-1$

		assertEquals("wrong value", c1, el2.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el2.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el2.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el2.get(l4)); //$NON-NLS-1$

		assertEquals("wrong value", c2, el1.remove(l2)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 3, el1.size()); //$NON-NLS-1$
		assertEquals("not null", null, el1.remove(l2)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 3, el1.size()); //$NON-NLS-1$
		assertEquals("wrong value", c4, el1.remove(l4)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el1.size()); //$NON-NLS-1$
		assertEquals("not null", null, el1.remove(l4)); //$NON-NLS-1$
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el1.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el1.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el1.get(l3)); //$NON-NLS-1$

		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el2.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el2.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el2.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el2.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el2.get(l4)); //$NON-NLS-1$

		assertEquals("wrong value", c1, el2.remove(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el2.remove(l3)); //$NON-NLS-1$

		el1.putAll(el2);
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el1.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el1.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el1.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el1.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el1.get(l4)); //$NON-NLS-1$
		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el2.size()); //$NON-NLS-1$
		assertEquals("wrong value", c2, el2.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el2.get(l4)); //$NON-NLS-1$

		el2.putAll(el1);
		assertFalse("empty", el1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el1.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el1.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el1.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el1.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el1.get(l4)); //$NON-NLS-1$
		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, el2.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el2.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c2, el2.get(l2)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el2.get(l3)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el2.get(l4)); //$NON-NLS-1$

		el2.clear();
		assertTrue("not empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 0, el2.size()); //$NON-NLS-1$

		assertNull("non null", el2.put(l1, c1)); //$NON-NLS-1$
		assertEquals("wrong value", c1, el2.put(l1, c3)); //$NON-NLS-1$
		assertEquals("wrong value", c3, el2.get(l1)); //$NON-NLS-1$
		assertTrue("missed key", el2.containsKey(l1)); //$NON-NLS-1$
		assertTrue("missed value", el2.containsValue(c3)); //$NON-NLS-1$
		assertFalse("invalid key", el2.containsKey(l2)); //$NON-NLS-1$
		assertFalse("invalid value", el2.containsValue(c1)); //$NON-NLS-1$

		el2.clear();
		Map source = new HashMap();
		source.put(l1, c1);
		source.put(l4, c4);
		el2.putAll(source);
		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el2.size()); //$NON-NLS-1$
		assertEquals("wrong value", c1, el2.get(l1)); //$NON-NLS-1$
		assertEquals("wrong value", c4, el2.get(l4)); //$NON-NLS-1$

		el2.clear();
		Set k1 = el1.keySet();
		Set k2 = el2.keySet();
		Set k3 = el1.keySet();
		Set k4 = el1.keySet();
		Collection v1 = el1.values();
		Collection v2 = el2.values();
		Collection v3 = el1.values();
		Collection v4 = el1.values();
		Set e1 = el1.entrySet();
		Set e2 = el2.entrySet();
		Set e3 = el1.entrySet();
		Set e4 = el1.entrySet();
		Set e5 = el1.entrySet();
		el1.clear();

		assertFalse("empty", k1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, k1.size()); //$NON-NLS-1$
		assertTrue("missed key", k1.contains(l1)); //$NON-NLS-1$
		assertTrue("missed key", k1.contains(l2)); //$NON-NLS-1$
		assertTrue("missed key", k1.contains(l3)); //$NON-NLS-1$
		assertTrue("missed key", k1.contains(l4)); //$NON-NLS-1$
		assertTrue("missed key", k1.containsAll(Arrays.asList(new Object[] {l1, l2, l3, l4}))); //$NON-NLS-1$
		assertTrue("array unequal", Arrays.equals(new Object[] {l1, l3, l2, l4}, k1.toArray())); //$NON-NLS-1$
		assertTrue("array unequal", Arrays.equals(new Object[] {l1, l3, l2, l4}, k1.toArray(new Object[4]))); //$NON-NLS-1$

		Iterator i1 = k1.iterator();
		assertTrue("missing next", i1.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", l1, i1.next()); //$NON-NLS-1$
		i1.remove();
		assertEquals("wrong size", 3, k1.size()); //$NON-NLS-1$
		assertFalse("still present", k1.contains(l1));
		assertTrue("missing next", i1.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", l3, i1.next()); //$NON-NLS-1$
		i1.remove();
		assertEquals("wrong size", 2, k1.size()); //$NON-NLS-1$
		assertFalse("still present", k1.contains(l3));
		assertTrue("missing next", i1.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", l2, i1.next()); //$NON-NLS-1$
		i1.remove();
		assertEquals("wrong size", 1, k1.size()); //$NON-NLS-1$
		assertFalse("still present", k1.contains(l2));
		assertTrue("missing next", i1.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", l4, i1.next()); //$NON-NLS-1$
		i1.remove();
		assertEquals("wrong size", 0, k1.size()); //$NON-NLS-1$
		assertFalse("still present", k1.contains(l4));
		assertFalse("extra next", i1.hasNext()); //$NON-NLS-1$
		try {
			i1.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		assertTrue("not empty", k2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 0, k2.size()); //$NON-NLS-1$

		Iterator i2 = k2.iterator();
		assertFalse("extra next", i2.hasNext()); //$NON-NLS-1$
		try {
			i2.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		try {
			k2.add(l1);
			fail("add did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		try {
			k2.addAll(Arrays.asList(new Object[] {l1, l2}));
			fail("addAll did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}

		k3.remove(l3);
		assertFalse("not removed", k3.contains(l3)); //$NON-NLS-1$
		k3.removeAll(Arrays.asList(new Object[] {l1, l2}));
		assertFalse("not removed", k3.contains(l1)); //$NON-NLS-1$
		assertFalse("not removed", k3.contains(l2)); //$NON-NLS-1$
		k4.retainAll(Arrays.asList(new Object[] {l1, l2}));
		assertTrue("missing", k4.contains(l1)); //$NON-NLS-1$
		assertTrue("missing", k4.contains(l2)); //$NON-NLS-1$
		assertFalse("not removed", k4.contains(l3)); //$NON-NLS-1$
		assertFalse("not removed", k4.contains(l4)); //$NON-NLS-1$
		k4.clear();
		assertTrue("not empty", k4.isEmpty()); //$NON-NLS-1$

		assertFalse("empty", v1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, v1.size()); //$NON-NLS-1$
		assertTrue("missed key", v1.contains(c1)); //$NON-NLS-1$
		assertTrue("missed key", v1.contains(c2)); //$NON-NLS-1$
		assertTrue("missed key", v1.contains(c3)); //$NON-NLS-1$
		assertTrue("missed key", v1.contains(c4)); //$NON-NLS-1$
		assertTrue("missed key", v1.containsAll(Arrays.asList(new Object[] {c1, c2, c3, c4}))); //$NON-NLS-1$
		assertTrue("array unequal", Arrays.equals(new Object[] {c1, c3, c2, c4}, v1.toArray())); //$NON-NLS-1$
		assertTrue("array unequal", Arrays.equals(new Object[] {c1, c3, c2, c4}, v1.toArray(new Object[4]))); //$NON-NLS-1$

		Iterator i3 = v1.iterator();
		assertTrue("missing next", i3.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", c1, i3.next()); //$NON-NLS-1$
		i3.remove();
		assertEquals("wrong size", 3, v1.size()); //$NON-NLS-1$
		assertFalse("still present", v1.contains(c1));
		assertTrue("missing next", i3.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", c3, i3.next()); //$NON-NLS-1$
		i3.remove();
		assertEquals("wrong size", 2, v1.size()); //$NON-NLS-1$
		assertFalse("still present", v1.contains(c3));
		assertTrue("missing next", i3.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", c2, i3.next()); //$NON-NLS-1$
		i3.remove();
		assertEquals("wrong size", 1, v1.size()); //$NON-NLS-1$
		assertFalse("still present", v1.contains(c2));
		assertTrue("missing next", i3.hasNext()); //$NON-NLS-1$
		assertEquals("wrong key", c4, i3.next()); //$NON-NLS-1$
		i3.remove();
		assertEquals("wrong size", 0, v1.size()); //$NON-NLS-1$
		assertFalse("still present", v1.contains(c4));
		assertFalse("extra next", i3.hasNext()); //$NON-NLS-1$
		try {
			i3.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		assertTrue("not empty", v2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 0, v2.size()); //$NON-NLS-1$

		Iterator i4 = v2.iterator();
		assertFalse("extra next", i4.hasNext()); //$NON-NLS-1$
		try {
			i4.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		try {
			v2.add(c1);
			fail("add did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		try {
			v2.addAll(Arrays.asList(new Object[] {c1, c2}));
			fail("addAll did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}

		v3.remove(c3);
		assertFalse("not removed", v3.contains(c3)); //$NON-NLS-1$
		v3.removeAll(Arrays.asList(new Object[] {c1, c2}));
		assertFalse("not removed", v3.contains(c1)); //$NON-NLS-1$
		assertFalse("not removed", v3.contains(c2)); //$NON-NLS-1$
		v4.retainAll(Arrays.asList(new Object[] {c1, c2}));
		assertTrue("missing", v4.contains(c1)); //$NON-NLS-1$
		assertTrue("missing", v4.contains(c2)); //$NON-NLS-1$
		assertFalse("not removed", v4.contains(c3)); //$NON-NLS-1$
		assertFalse("not removed", v4.contains(c4)); //$NON-NLS-1$
		v4.clear();
		assertTrue("not empty", v4.isEmpty()); //$NON-NLS-1$

		assertFalse("empty", e1.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 4, e1.size()); //$NON-NLS-1$

		Iterator i5 = e1.iterator();
		assertTrue("missing next", i5.hasNext()); //$NON-NLS-1$
		Map.Entry me1 = (Map.Entry) i5.next();
		assertEquals("wrong key", l1, me1.getKey()); //$NON-NLS-1$
		assertEquals("wrong value", c1, me1.getValue()); //$NON-NLS-1$
		try {
			me1.setValue(c2);
			fail("remove did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		i5.remove();
		assertEquals("wrong size", 3, e1.size()); //$NON-NLS-1$
		assertFalse("still present", e1.contains(me1));
		assertTrue("missing next", i5.hasNext()); //$NON-NLS-1$
		Map.Entry me3 = (Map.Entry) i5.next();
		assertEquals("wrong key", l3, me3.getKey()); //$NON-NLS-1$
		assertEquals("wrong value", c3, me3.getValue()); //$NON-NLS-1$
		try {
			me3.setValue(c2);
			fail("remove did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		i5.remove();
		assertEquals("wrong size", 2, e1.size()); //$NON-NLS-1$
		assertFalse("still present", e1.contains(me3));
		assertTrue("missing next", i5.hasNext()); //$NON-NLS-1$
		Map.Entry me2 = (Map.Entry) i5.next();
		assertEquals("wrong key", l2, me2.getKey()); //$NON-NLS-1$
		assertEquals("wrong value", c2, me2.getValue()); //$NON-NLS-1$
		try {
			me2.setValue(c3);
			fail("remove did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		i5.remove();
		assertEquals("wrong size", 1, e1.size()); //$NON-NLS-1$
		assertFalse("still present", e1.contains(me2));
		assertTrue("missing next", i5.hasNext()); //$NON-NLS-1$
		Map.Entry me4 = (Map.Entry) i5.next();
		assertEquals("wrong key", l4, me4.getKey()); //$NON-NLS-1$
		assertEquals("wrong value", c4, me4.getValue()); //$NON-NLS-1$
		try {
			me4.setValue(c2);
			fail("remove did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		i5.remove();
		assertEquals("wrong size", 0, e1.size()); //$NON-NLS-1$
		assertFalse("still present", e1.contains(me4));
		assertFalse("extra next", i5.hasNext()); //$NON-NLS-1$
		try {
			i1.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		assertTrue("not empty", e2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 0, e2.size()); //$NON-NLS-1$

		Iterator i6 = e2.iterator();
		assertFalse("extra next", i6.hasNext()); //$NON-NLS-1$
		try {
			i6.next();
			fail("next did not throw exception"); //$NON-NLS-1$
		} catch (NoSuchElementException e) {
			//expected
		}

		try {
			e2.add(me1);
			fail("add did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		try {
			e2.addAll(Arrays.asList(new Map.Entry[] {me2, me4}));
			fail("addAll did not throw exception"); //$NON-NLS-1$
		} catch (UnsupportedOperationException e) {
			//expected
		}
		e3.remove(me3);
		assertFalse("not removed", e3.contains(me3)); //$NON-NLS-1$
		e3.removeAll(Arrays.asList(new Object[] {me1, me2}));
		assertFalse("not removed", e3.contains(me1)); //$NON-NLS-1$
		assertFalse("not removed", e3.contains(me2)); //$NON-NLS-1$
		e4.retainAll(Arrays.asList(new Object[] {me1, me2}));
		assertTrue("missing", e4.contains(me1)); //$NON-NLS-1$
		assertTrue("missing", e4.contains(me2)); //$NON-NLS-1$
		assertFalse("not removed", e4.contains(me3)); //$NON-NLS-1$
		assertFalse("not removed", e4.contains(me4)); //$NON-NLS-1$
		e4.clear();
		assertTrue("not empty", e4.isEmpty()); //$NON-NLS-1$

		assertTrue("array unequal", Arrays.equals(new Map.Entry[] {me1, me3, me2, me4}, e5.toArray())); //$NON-NLS-1$
		assertTrue("array unequal", Arrays.equals(new Map.Entry[] {me1, me3, me2, me4}, e5.toArray(new Map.Entry[4]))); //$NON-NLS-1$

		el2.clear();
		el2.putAll(new Object[] {l1, l3});
		assertFalse("empty", el2.isEmpty()); //$NON-NLS-1$
		assertEquals("wrong size", 2, el2.size()); //$NON-NLS-1$
		assertTrue("missed key", el2.containsKey(l1)); //$NON-NLS-1$
		assertTrue("missed key", el2.containsKey(l3)); //$NON-NLS-1$
		assertNull("value not null", el2.get(l1)); //$NON-NLS-1$
		assertNull("value not null", el2.get(l3)); //$NON-NLS-1$

	}
}
