1 package com.atlassian.johnson;
2
3 import com.atlassian.johnson.event.Event;
4 import com.atlassian.johnson.event.EventType;
5 import org.hamcrest.FeatureMatcher;
6 import org.hamcrest.Matcher;
7 import org.junit.Before;
8 import org.junit.Test;
9
10 import javax.annotation.Nonnull;
11 import java.util.Collection;
12 import java.util.List;
13 import java.util.Optional;
14 import java.util.function.Predicate;
15
16 import static java.util.Arrays.stream;
17 import static java.util.Optional.empty;
18 import static java.util.stream.Collectors.toList;
19 import static org.hamcrest.Matchers.contains;
20 import static org.hamcrest.Matchers.equalTo;
21 import static org.hamcrest.Matchers.is;
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertFalse;
24 import static org.junit.Assert.assertThat;
25 import static org.junit.Assert.assertTrue;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.when;
28
29 public class DefaultJohnsonEventContainerTest {
30
31 private static final Predicate<Event> MATCH_NONE = event -> false;
32 private static final Predicate<Event> MATCH_ALL = event -> true;
33
34 @Nonnull
35 private static Event eventWithProgress(boolean hasProgress) {
36 final Event event = mock(Event.class);
37 when(event.hasProgress()).thenReturn(hasProgress);
38 return event;
39 }
40
41 @Nonnull
42 private static List<Matcher<? super Event>> eventsWithDescriptions(final String... descriptions) {
43 return stream(descriptions).map(DefaultJohnsonEventContainerTest::eventWithDescription).collect(toList());
44 }
45
46 @Nonnull
47 private static Matcher<? super Event> eventWithDescription(final String description) {
48 return new FeatureMatcher<Event, String>(equalTo(description), "an Event with description", "description") {
49 @Override
50 protected String featureValueOf(Event actual) {
51 return actual.getDesc();
52 }
53 };
54 }
55
56 private DefaultJohnsonEventContainer container;
57
58 @Before
59 public void setUp() {
60 container = new DefaultJohnsonEventContainer();
61 }
62
63 @Test
64 public void containerShouldAddAndRemoveEvents() {
65
66 assertFalse(container.hasEvents());
67
68
69 final Event event = new Event(new EventType("systemic", "Systemic Anomaly"), "There is an anomaly in the matrix");
70 container.addEvent(event);
71 assertTrue(container.hasEvents());
72 final Collection<Event> containerEvents = container.getEvents();
73 assertEquals(1, containerEvents.size());
74 assertTrue(containerEvents.contains(event));
75
76
77 container.removeEvent(event);
78 assertFalse(container.hasEvents());
79 assertEquals(0, container.getEvents().size());
80 }
81
82 @Test
83 public void eventsReturnedInOrderOfAddition() {
84
85 for (int i = 0; i < 5; i++) {
86 container.addEvent(new Event(new EventType("", ""), Integer.toString(i)));
87 }
88
89
90 assertTrue(container.hasEvents());
91 assertThat(container.getEvents(), contains(eventsWithDescriptions("0", "1", "2", "3", "4")));
92 }
93
94 @Test(expected = UnsupportedOperationException.class)
95 public void returnedCollectionOfEventsShouldNotBeModifiable() {
96 container.getEvents().add(new Event(new EventType("", ""), ""));
97 }
98
99 @Test
100 public void getEventsMatchingPredicateShouldApplyThatPredicate() {
101
102 final Event eventWithProgress = eventWithProgress(true);
103 container.addEvent(eventWithProgress);
104 container.addEvent(eventWithProgress(false));
105
106
107 final Collection<Event> returnedEvents = container.getEvents(Event::hasProgress);
108
109
110 assertThat(returnedEvents, contains(eventWithProgress));
111 }
112
113 @Test
114 public void hasEventShouldReturnFalseWhenNoEventsMatchThePredicate() {
115
116 container.addEvent(mock(Event.class));
117
118
119 final boolean hasEvent = container.hasEvent(MATCH_NONE);
120
121
122 assertFalse(hasEvent);
123 }
124
125 @Test
126 public void hasEventShouldReturnTrueWhenAnEventMatchesThePredicate() {
127
128 container.addEvent(mock(Event.class));
129
130
131 final boolean hasEvent = container.hasEvent(MATCH_ALL);
132
133
134 assertTrue(hasEvent);
135 }
136
137 @Test
138 public void firstEventShouldBeEmptyWhenContainerIsEmpty() {
139
140 final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
141
142
143 assertThat(maybeEvent, is(empty()));
144 }
145
146 @Test
147 public void firstEventShouldBeNonEmptyWhenContainerIsNotEmpty() {
148
149 final Event event = mock(Event.class);
150 container.addEvent(event);
151
152
153 final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
154
155
156 assertThat(maybeEvent, is(Optional.of(event)));
157 }
158
159 @Test
160 public void firstEventShouldBeActualFirstEventWhenMultipleEventsArePresent() {
161
162 final Event event1 = mock(Event.class);
163 container.addEvent(event1);
164 container.addEvent(mock(Event.class));
165
166
167 final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
168
169
170 assertThat(maybeEvent, is(Optional.of(event1)));
171 }
172 }