Add test for PartContainer
[Sone.git] / src / test / java / net / pterodactylus / sone / text / PartContainerTest.java
1 package net.pterodactylus.sone.text;
2
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.is;
5 import static org.mockito.Mockito.mock;
6 import static org.mockito.Mockito.when;
7
8 import java.util.Iterator;
9 import java.util.NoSuchElementException;
10
11 import org.junit.Test;
12
13 /**
14  * Unit test for {@link PartContainer}.
15  *
16  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
17  */
18 public class PartContainerTest {
19
20         private final PartContainer container = new PartContainer();
21
22         @Test
23         public void emptyContainerHasSizeZero() {
24                 assertThat(container.size(), is(0));
25         }
26
27         @Test
28         public void containerWithSinglePartHasSizeOne() {
29                 container.add(mock(Part.class));
30                 assertThat(container.size(), is(1));
31         }
32
33         @Test
34         public void containerWithSinglePartCanReturnPart() {
35                 Part part = mock(Part.class);
36                 container.add(part);
37                 assertThat(container.getPart(0), is(part));
38         }
39
40         @Test
41         public void containerIsEmptyAfterPartIsAddedAndRemoved() {
42                 container.add(mock(Part.class));
43                 container.removePart(0);
44                 assertThat(container.size(), is(0));
45         }
46
47         @Test
48         public void containerContainsSecondPartIfFirstPartIsRemoved() {
49                 container.add(mock(Part.class));
50                 Part part = mock(Part.class);
51                 container.add(part);
52                 container.removePart(0);
53                 assertThat(container.getPart(0), is(part));
54         }
55
56         @Test
57         public void textOfContainerPartIsTextOfPartsConcatenated() {
58                 container.add(createPartWithText("first"));
59                 container.add(createPartWithText("second"));
60                 assertThat(container.getText(), is("firstsecond"));
61         }
62
63         private Part createPartWithText(String text) {
64                 Part part = mock(Part.class);
65                 when(part.getText()).thenReturn(text);
66                 return part;
67         }
68
69         @Test(expected = NoSuchElementException.class)
70         public void emptyContainerIteratorThrowsOnNext() {
71                 container.iterator().next();
72         }
73
74         @Test
75         public void iteratorIteratesPartsRecursivelyInCorrectOrder() {
76                 Part firstPart = mock(Part.class);
77                 PartContainer secondPart = new PartContainer();
78                 Part thirdPart = mock(Part.class);
79                 Part nestedFirstPart = mock(Part.class);
80                 Part nestedSecondPart = mock(Part.class);
81                 secondPart.add(nestedFirstPart);
82                 secondPart.add(nestedSecondPart);
83                 container.add(firstPart);
84                 container.add(secondPart);
85                 container.add(thirdPart);
86                 Iterator<Part> parts = container.iterator();
87                 assertThat(parts.next(), is(firstPart));
88                 assertThat(parts.next(), is(nestedFirstPart));
89                 assertThat(parts.next(), is(nestedSecondPart));
90                 assertThat(parts.next(), is(thirdPart));
91                 assertThat(parts.hasNext(), is(false));
92         }
93
94 }