package net.pterodactylus.sone.text;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.junit.Test;
/**
* Unit test for {@link PartContainer}.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class PartContainerTest {
private final PartContainer container = new PartContainer();
@Test
public void emptyContainerHasSizeZero() {
assertThat(container.size(), is(0));
}
@Test(expected = NullPointerException.class)
public void canNotAddNullPart() {
container.add(null);
}
@Test
public void containerWithSinglePartHasSizeOne() {
container.add(mock(Part.class));
assertThat(container.size(), is(1));
}
@Test
public void containerWithSinglePartCanReturnPart() {
Part part = mock(Part.class);
container.add(part);
assertThat(container.getPart(0), is(part));
}
@Test
public void containerIsEmptyAfterPartIsAddedAndRemoved() {
container.add(mock(Part.class));
container.removePart(0);
assertThat(container.size(), is(0));
}
@Test
public void containerContainsSecondPartIfFirstPartIsRemoved() {
container.add(mock(Part.class));
Part part = mock(Part.class);
container.add(part);
container.removePart(0);
assertThat(container.getPart(0), is(part));
}
@Test
public void textOfContainerPartIsTextOfPartsConcatenated() {
container.add(createPartWithText("first"));
container.add(createPartWithText("second"));
assertThat(container.getText(), is("firstsecond"));
}
private Part createPartWithText(String text) {
Part part = mock(Part.class);
when(part.getText()).thenReturn(text);
return part;
}
@Test(expected = NoSuchElementException.class)
public void emptyContainerIteratorThrowsOnNext() {
container.iterator().next();
}
@Test
public void iteratorIteratesPartsRecursivelyInCorrectOrder() {
Part firstPart = mock(Part.class);
PartContainer secondPart = new PartContainer();
Part thirdPart = mock(Part.class);
Part nestedFirstPart = mock(Part.class);
Part nestedSecondPart = mock(Part.class);
secondPart.add(nestedFirstPart);
secondPart.add(nestedSecondPart);
container.add(firstPart);
container.add(secondPart);
container.add(thirdPart);
Iterator<Part> parts = container.iterator();
assertThat(parts.next(), is(firstPart));
assertThat(parts.next(), is(nestedFirstPart));
assertThat(parts.next(), is(nestedSecondPart));
assertThat(parts.next(), is(thirdPart));
assertThat(parts.hasNext(), is(false));
}
}