package net.pterodactylus.sone.notify;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.emptyIterable;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import java.util.Arrays;
import net.pterodactylus.util.notify.NotificationListener;
import net.pterodactylus.util.template.Template;
import net.pterodactylus.util.template.TemplateContext;
import org.hamcrest.Matchers;
import org.junit.Test;
/**
* Unit test for {@link ListNotification}.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class ListNotificationTest {
private static final String ID = "notification-id";
private static final String KEY = "element-key";
private static final String OTHER_KEY = "other-key";
private final Template template = mock(Template.class);
private final TemplateContext templateInitialContext = mock(TemplateContext.class);
private ListNotification<Object> listNotification;
public ListNotificationTest() {
when(template.getInitialContext()).thenReturn(templateInitialContext);
listNotification = new ListNotification<Object>(ID, KEY, template);
}
@Test
public void creatingAListNotificationSetsEmptyIterableOnElementKeyInTemplateContext() {
verify(templateInitialContext).set(eq(KEY), argThat(emptyIterable()));
}
@Test
public void newListNotificationHasNoElement() {
assertThat(listNotification.getElements(), emptyIterable());
}
@Test
public void newListNotificationIsEmpty() {
assertThat(listNotification.isEmpty(), is(true));
}
@Test
public void listNotificationRetainsSetElements() {
listNotification.setElements(Arrays.asList("a", "b", "c"));
assertThat(listNotification.getElements(), Matchers.<Object>contains("a", "b", "c"));
}
@Test
public void listNotificationRetainsAddedElements() {
listNotification.add("a");
listNotification.add("b");
listNotification.add("c");
assertThat(listNotification.getElements(), Matchers.<Object>contains("a", "b", "c"));
}
@Test
public void listNotificationRemovesCorrectElement() {
listNotification.setElements(Arrays.asList("a", "b", "c"));
listNotification.remove("b");
assertThat(listNotification.getElements(), Matchers.<Object>contains("a", "c"));
}
@Test
public void removingTheLastElementDismissesTheNotification() {
NotificationListener notificationListener = mock(NotificationListener.class);
listNotification.addNotificationListener(notificationListener);
listNotification.add("a");
listNotification.remove("a");
verify(notificationListener).notificationDismissed(listNotification);
}
@Test
public void dismissingTheListNotificationRemovesAllElements() {
listNotification.setElements(Arrays.asList("a", "b", "c"));
listNotification.dismiss();
assertThat(listNotification.getElements(), emptyIterable());
}
@Test
public void listNotificationWithDifferentElementsIsNotEqual() {
ListNotification secondNotification = new ListNotification(ID, KEY, template);
listNotification.add("a");
secondNotification.add("b");
assertThat(listNotification, not(is(secondNotification)));
}
@Test
public void listNotificationWithDifferentKeyIsNotEqual() {
ListNotification secondNotification = new ListNotification(ID, OTHER_KEY, template);
assertThat(listNotification, not(is(secondNotification)));
}
@Test
public void copiedNotificationsHaveTheSameHashCode() {
ListNotification secondNotification = new ListNotification(listNotification);
listNotification.add("a");
secondNotification.add("a");
assertThat(listNotification.hashCode(), is(secondNotification.hashCode()));
}
@Test
public void listNotificationIsNotEqualToOtherObjects() {
assertThat(listNotification, not(is(new Object())));
}
}