View Javadoc

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          // no events at the start!
66          assertFalse(container.hasEvents());
67  
68          // add an event and check it exists
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          // now remove the event and check it's gone
77          container.removeEvent(event);
78          assertFalse(container.hasEvents());
79          assertEquals(0, container.getEvents().size());
80      }
81  
82      @Test
83      public void eventsReturnedInOrderOfAddition() {
84          // Set up
85          for (int i = 0; i < 5; i++) {
86              container.addEvent(new Event(new EventType("", ""), Integer.toString(i)));
87          }
88  
89          // Invoke and check
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         // Set up
102         final Event eventWithProgress = eventWithProgress(true);
103         container.addEvent(eventWithProgress);
104         container.addEvent(eventWithProgress(false));
105 
106         // Invoke
107         final Collection<Event> returnedEvents = container.getEvents(Event::hasProgress);
108 
109         // Check
110         assertThat(returnedEvents, contains(eventWithProgress));
111     }
112 
113     @Test
114     public void hasEventShouldReturnFalseWhenNoEventsMatchThePredicate() {
115         // Set up
116         container.addEvent(mock(Event.class));
117 
118         // Invoke
119         final boolean hasEvent = container.hasEvent(MATCH_NONE);
120 
121         // Check
122         assertFalse(hasEvent);
123     }
124 
125     @Test
126     public void hasEventShouldReturnTrueWhenAnEventMatchesThePredicate() {
127         // Set up
128         container.addEvent(mock(Event.class));
129 
130         // Invoke
131         final boolean hasEvent = container.hasEvent(MATCH_ALL);
132 
133         // Check
134         assertTrue(hasEvent);
135     }
136 
137     @Test
138     public void firstEventShouldBeEmptyWhenContainerIsEmpty() {
139         // Invoke
140         final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
141 
142         // Check
143         assertThat(maybeEvent, is(empty()));
144     }
145 
146     @Test
147     public void firstEventShouldBeNonEmptyWhenContainerIsNotEmpty() {
148         // Set up
149         final Event event = mock(Event.class);
150         container.addEvent(event);
151 
152         // Invoke
153         final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
154 
155         // Check
156         assertThat(maybeEvent, is(Optional.of(event)));
157     }
158 
159     @Test
160     public void firstEventShouldBeActualFirstEventWhenMultipleEventsArePresent() {
161         // Set up
162         final Event event1 = mock(Event.class);
163         container.addEvent(event1);
164         container.addEvent(mock(Event.class));
165 
166         // Invoke
167         final Optional<Event> maybeEvent = container.firstEvent(MATCH_ALL);
168 
169         // Check
170         assertThat(maybeEvent, is(Optional.of(event1)));
171     }
172 }