/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.dlect.events;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import java.util.Set;
import org.dlect.events.testListener.TestEventListener;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
*
* @author lee
*/
@RunWith(MockitoJUnitRunner.class)
@SuppressWarnings("unchecked")
public class BaseEventAdapterTest {
@Mock
private Set<EventListener> mockedAcl;
@Mock
private Multimap<Class<?>, EventListener> mockedScel;
@InjectMocks
private BaseEventAdapter mockedTestObject;
private Set<EventListener> nonMockedAcl;
private Multimap<Class<?>, EventListener> nonMockedScel;
private BaseEventAdapter nonMockedTestObject;
private BaseEventAdapter defaultTestObject;
@Before
public void before() throws Exception {
nonMockedAcl = Sets.newHashSet();
nonMockedScel = HashMultimap.create();
nonMockedTestObject = new BaseEventAdapter(nonMockedAcl, nonMockedScel);
defaultTestObject = new BaseEventAdapter();
}
/**
* Test of addListener method, of class BaseEventAdapter.
*
* @throws IllegalArgumentException Must throw a IAE for a null adapter.
*/
@Test(expected = IllegalArgumentException.class)
public void testAddListener_NullListener() {
// Using method to avoid warnings about null listeners.
EventListener l = getNullListener();
mockedTestObject.addListener(l);
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_ExistingListener() {
EventListener l = new TestEventListener();
when(mockedAcl.contains(l)).thenReturn(true);
boolean addListener = mockedTestObject.addListener(l);
assertFalse(addListener);
verify(mockedAcl).contains(l);
verifyNoMoreInteractions(mockedAcl);
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_NonExistingAllListener() {
EventListener l = new TestEventListener();
boolean addListener = nonMockedTestObject.addListener(l);
assertTrue(addListener);
assertTrue(nonMockedScel.isEmpty());
assertTrue(nonMockedAcl.size() == 1);
// First element.
assertTrue(nonMockedAcl.iterator().next() == l);
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_NonExistingAllListenerNullClassArray() {
EventListener l = new TestEventListener();
boolean addListener = nonMockedTestObject.addListener(l, (Class[]) null);
assertTrue(addListener);
assertTrue(nonMockedScel.isEmpty());
assertTrue(nonMockedAcl.size() == 1);
// First element.
assertTrue(nonMockedAcl.iterator().next() == l);
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_AddExistingFilterListenerNowAll() {
EventListener l = new TestEventListener();
nonMockedScel.put(Object.class, l);
boolean addListener = nonMockedTestObject.addListener(l);
// The listener was added.
assertTrue(addListener);
// The adapter saved time by removing the new listener from SCEL.
assertTrue(nonMockedScel.isEmpty());
// The adapter added it to the list.
assertTrue(nonMockedAcl.size() == 1);
// First element.
assertTrue(nonMockedAcl.iterator().next() == l);
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_AddFilteredListener() {
EventListener l = new TestEventListener();
boolean addListener = nonMockedTestObject.addListener(l, Object.class);
// The listener was added.
assertTrue(addListener);
assertTrue(nonMockedScel.size() == 1);
assertTrue(nonMockedScel.containsEntry(Object.class, l));
// The adapter added it to the list.
assertTrue(nonMockedAcl.isEmpty());
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_AddMultiFilteredListener() {
EventListener l = new TestEventListener();
boolean addListener = nonMockedTestObject.addListener(l, Object.class, Number.class, Integer.class);
// The listener was added.
assertTrue(addListener);
assertTrue(nonMockedScel.size() == 3);
assertTrue(nonMockedScel.containsEntry(Object.class, l));
assertTrue(nonMockedScel.containsEntry(Number.class, l));
assertTrue(nonMockedScel.containsEntry(Integer.class, l));
assertTrue(nonMockedAcl.isEmpty());
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_AddExistingFilteredListener() {
EventListener l = new TestEventListener();
nonMockedScel.put(Object.class, l);
boolean addListener = nonMockedTestObject.addListener(l, Object.class);
// The listener was added.
assertFalse(addListener);
assertTrue(nonMockedScel.size() == 1);
assertTrue(nonMockedScel.containsEntry(Object.class, l));
assertTrue(nonMockedAcl.isEmpty());
}
/**
* Test of addListener method, of class BaseEventAdapter.
*/
@Test
public void testAddListener_AddExistingMulitFilteredListener() {
EventListener l = new TestEventListener();
nonMockedScel.put(Object.class, l);
// Object.class already exists but integer does not.
boolean addListener = nonMockedTestObject.addListener(l, Object.class, Integer.class);
assertTrue(addListener);
assertTrue(nonMockedScel.size() == 2);
assertTrue(nonMockedScel.containsEntry(Object.class, l));
assertTrue(nonMockedScel.containsEntry(Integer.class, l));
assertTrue(nonMockedAcl.isEmpty());
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test(expected = IllegalArgumentException.class)
public void testFireEvent_NullEvent() {
nonMockedTestObject.fireEvent(getNullEvent());
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_EmptyListeners() {
Event e = getMockEvent(String.class);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verifyNoMoreInteractions(e);
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_AllListener() {
Event e = getMockEvent(String.class);
EventListener l = mock(EventListener.class);
nonMockedAcl.add(l);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verify(l).processEvent(e);
verifyNoMoreInteractions(e, l);
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_ClassListenerEqual() {
Event e = getMockEvent(String.class);
EventListener l = mock(EventListener.class);
nonMockedScel.put(String.class, l);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verify(l).processEvent(e);
verifyNoMoreInteractions(e, l);
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_ClassListenerNotEqual() {
Event e = getMockEvent(String.class);
EventListener l = mock(EventListener.class);
nonMockedScel.put(Integer.class, l);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verifyNoMoreInteractions(e, l);
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_ListenerInBothFiredOnce() {
Event e = getMockEvent(String.class);
EventListener l = mock(EventListener.class);
nonMockedScel.put(String.class, l);
nonMockedAcl.add(l);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verify(l).processEvent(e);
verifyNoMoreInteractions(e, l);
}
/**
* Test of fireEvent method, of class BaseEventAdapter.
*/
@Test
public void testFireEvent_FiresParent() {
Event e = getMockEvent(String.class);
BaseEventAdapter e2 = mock(BaseEventAdapter.class);
when(e2.getParentAdapter()).thenReturn(null);
nonMockedTestObject.setParentAdapter(e2);
nonMockedTestObject.fireEvent(e);
verify(e).getSourceClass();
verifyNoMoreInteractions(e);
verify(e2).fireEvent(e);
}
/**
* Test of getParentAdapter method, of class BaseEventAdapter.
*/
@Test
public void testGetParentAdapter_EnsureDefaultIsNull() {
assertNull("Default parent is not null", nonMockedTestObject.getParentAdapter());
}
/**
* Test of setParentAdapter method, of class BaseEventAdapter.
*/
@Test
public void testSetParentAdapter_NullAdapter() {
nonMockedTestObject.setParentAdapter(null);
assertNull(nonMockedTestObject.getParentAdapter());
}
/**
* Test of setParentAdapter method, of class BaseEventAdapter.
*/
@Test(expected = IllegalArgumentException.class)
public void testSetParentAdapter_CyclicAdapter() {
nonMockedTestObject.setParentAdapter(nonMockedTestObject);
}
/**
* Test of setParentAdapter method, of class BaseEventAdapter.
*/
@Test
public void testSetParentAdapter_CyclicAdapter2() {
BaseEventAdapter e2 = mock(BaseEventAdapter.class);
when(e2.getParentAdapter()).thenReturn(nonMockedTestObject);
try {
nonMockedTestObject.setParentAdapter(e2);
fail("No exception thrown");
} catch (IllegalArgumentException e) {
verify(e2).getParentAdapter();
verifyNoMoreInteractions(e2);
}
}
/**
* Test of setParentAdapter method, of class BaseEventAdapter.
*/
@Test
public void testSetParentAdapter_ValidParent() {
BaseEventAdapter e2 = mock(BaseEventAdapter.class);
when(e2.getParentAdapter()).thenReturn(null); // No parent.
nonMockedTestObject.setParentAdapter(e2);
assertEquals("Wrong parent", e2, nonMockedTestObject.getParentAdapter());
verify(e2).getParentAdapter();
verifyNoMoreInteractions(e2);
}
/**
* Test of removeListener method, of class BaseEventAdapter.
*/
@Test
public void testRemoveListener_ExistingNonEqual() {
EventListener l = mock(EventListener.class);
EventListener otherListener = mock(EventListener.class);
nonMockedScel.put(Object.class, otherListener);
nonMockedScel.put(Object.class, l);
boolean result = nonMockedTestObject.removeListener(l);
assertTrue(result);
assertEquals(1, nonMockedScel.size());
assertTrue(nonMockedScel.containsEntry(Object.class, otherListener));
assertTrue(nonMockedAcl.isEmpty());
verifyNoMoreInteractions(l, otherListener);
}
/**
* Test of removeListener method, of class BaseEventAdapter.
*/
@Test
public void testRemoveListener_NonExisting() {
EventListener l = mock(EventListener.class);
EventListener otherListener = mock(EventListener.class);
nonMockedScel.put(Object.class, otherListener);
boolean result = nonMockedTestObject.removeListener(l);
assertFalse(result);
assertEquals(1, nonMockedScel.size());
assertTrue(nonMockedScel.containsEntry(Object.class, otherListener));
assertTrue(nonMockedAcl.isEmpty());
verifyNoMoreInteractions(l, otherListener);
}
/**
* Test of removeListener method, of class BaseEventAdapter.
*/
@Test
public void testRemoveListener_AddedInBoth() {
EventListener l = mock(EventListener.class);
nonMockedAcl.add(l);
nonMockedScel.put(Object.class, l);
boolean result = nonMockedTestObject.removeListener(l);
assertTrue(result);
assertTrue(nonMockedScel.isEmpty());
assertTrue(nonMockedAcl.isEmpty());
verifyNoMoreInteractions(l);
}
/**
* Test of removeListener method, of class BaseEventAdapter.
*/
@Test
public void testRemoveListener_AllEventListener() {
EventListener l = mock(EventListener.class);
nonMockedAcl.add(l);
boolean result = nonMockedTestObject.removeListener(l);
assertTrue(result);
assertTrue(nonMockedScel.isEmpty());
assertTrue(nonMockedAcl.isEmpty());
verifyNoMoreInteractions(l);
}
private EventListener getNullListener() {
return null;
}
private Event getNullEvent() {
return null;
}
private <T> Event getMockEvent(Class<? extends Object> source) {
Event e = mock(Event.class);
doReturn(source).when(e).getSourceClass();
return e;
}
}