/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.core.util; import java.util.EventListener; import java.util.Iterator; import org.eclipse.riena.core.test.RienaTestCase; import org.eclipse.riena.core.test.collect.NonUITestCase; import org.eclipse.riena.ui.ridgets.listener.IWindowRidgetListener; /** * Tests the <code>ListenerList</code> */ @NonUITestCase public class ListenerListTest extends RienaTestCase { private final ListenerList<TestListener> listenerList = new ListenerList<TestListener>(TestListener.class); public void testFresh() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); TestListener.pieps = 0; for (final TestListener listener : listenerList.getListeners()) { listener.piep(); } assertEquals(0, TestListener.pieps); } public void testFreshUsingIterator() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); TestListener.pieps = 0; for (final TestListener listener : listenerList) { listener.piep(); } assertEquals(0, TestListener.pieps); } public void testAddOneRemoveOne() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener t = new TestListener(); listenerList.add(t); assertEquals(1, listenerList.getListeners().length); TestListener.pieps = 0; for (final TestListener listener : listenerList.getListeners()) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); listenerList.remove(t); assertEquals(0, listenerList.getListeners().length); } public void testAddOneRemoveOneUsingIterator() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener t = new TestListener(); listenerList.add(t); assertEquals(1, listenerList.getListeners().length); TestListener.pieps = 0; for (final TestListener listener : listenerList) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); listenerList.remove(t); assertEquals(0, listenerList.getListeners().length); } public void testAddMoreRemoveAll() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener[] listeners = new TestListener[10]; for (int i = 0; i < listeners.length; i++) { listeners[i] = new TestListener(); listenerList.add(listeners[i]); TestListener.pieps = 0; for (final TestListener listener : listenerList.getListeners()) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); } for (int i = listeners.length - 1; i >= 0; i--) { listenerList.remove(listeners[i]); assertEquals(i, listenerList.getListeners().length); TestListener.pieps = 0; for (final TestListener listener : listenerList.getListeners()) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); } assertEquals(0, listenerList.getListeners().length); } public void testAddMoreRemoveAllUsingIterator() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener[] listeners = new TestListener[10]; for (int i = 0; i < listeners.length; i++) { listeners[i] = new TestListener(); listenerList.add(listeners[i]); TestListener.pieps = 0; for (final TestListener listener : listenerList) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); } for (int i = listeners.length - 1; i >= 0; i--) { listenerList.remove(listeners[i]); assertEquals(i, listenerList.getListeners().length); TestListener.pieps = 0; for (final TestListener listener : listenerList) { listener.piep(); } assertEquals(listenerList.getListeners().length, TestListener.pieps); } assertEquals(0, listenerList.getListeners().length); } /** * Test a bug fix for an ArrayStoreException that was thrown when * adding/removing several anonymous classes from the same listener list. */ public void testFixArrayStoreExceptionWithAnonymousClasses() { final ListenerList<IWindowRidgetListener> windowListenerList = new ListenerList<IWindowRidgetListener>( IWindowRidgetListener.class); final IWindowRidgetListener listener1 = new IWindowRidgetListener() { public void activated() { } public void closed() { } }; windowListenerList.add(listener1); final IWindowRidgetListener listener2 = new IWindowRidgetListener() { public void activated() { } public void closed() { } }; windowListenerList.add(listener2); windowListenerList.remove(listener1); windowListenerList.remove(listener2); } public void testRemoveWhileItering() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener[] listeners = new TestListener[10]; for (int i = 0; i < listeners.length; i++) { listeners[i] = new TestListener(); listenerList.add(listeners[i]); } TestListener.pieps = 0; int i = 0; for (final TestListener listener : listenerList.getListeners()) { listener.piep(); if ((i % 2) == 0) { listenerList.remove(listener); } i++; } assertEquals(10, TestListener.pieps); assertEquals(5, listenerList.size()); } public void testRemoveWhileIteringUsingIterator() { final EventListener[] list = listenerList.getListeners(); assertNotNull(list); assertEquals(0, list.length); final TestListener[] listeners = new TestListener[10]; for (int i = 0; i < listeners.length; i++) { listeners[i] = new TestListener(); listenerList.add(listeners[i]); } TestListener.pieps = 0; final Iterator<TestListener> iterator = listenerList.iterator(); int i = 0; while (iterator.hasNext()) { iterator.next().piep(); if ((i % 2) == 0) { iterator.remove(); } i++; } assertEquals(10, TestListener.pieps); assertEquals(5, listenerList.size()); } private static class TestListener implements EventListener { private static int pieps; public void piep() { pieps++; } } }