package denominator.common;
import denominator.model.rdata.TXTData;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Iterator;
import denominator.common.PeekingIteratorTest.TrueThenDone;
import static denominator.common.Util.and;
import static denominator.common.Util.concat;
import static denominator.common.Util.equal;
import static denominator.common.Util.filter;
import static denominator.common.Util.join;
import static denominator.common.Util.nextOrNull;
import static denominator.common.Util.peekingIterator;
import static denominator.common.Util.slurp;
import static denominator.common.Util.split;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class UtilTest {
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Test
public void slurpDoesntScrewWithWhitespance() throws IOException {
assertThat(slurp(new StringReader(" foo\n"))).isEqualTo(" foo\n");
}
@Test
public void slurpsLargerThan2KCharBuffer() throws IOException {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 2001; i++) {
builder.append('a');
}
String twoK1 = builder.toString();
assertThat(slurp(new StringReader(twoK1))).isEqualTo(twoK1);
}
@Test
public void joinNadaReturnsEmpty() {
assertThat(join(';', (Object[]) null)).isEmpty();
assertThat(join(';', new Object[]{})).isEmpty();
}
@Test
public void equalTest() {
assertTrue(equal(null, null));
assertTrue(equal("1", "1"));
assertFalse(equal(null, "1"));
assertFalse(equal("1", null));
assertFalse(equal("1", "2"));
}
@Test
public void joinMultiple() {
assertThat(join(';', "one", 2)).isEqualTo("one;2");
}
@Test
public void splitNull() {
thrown.expect(NullPointerException.class);
thrown.expectMessage("toSplit");
split(';', null);
}
@Test
public void splitMiss() {
assertThat(split(';', "one,2")).containsExactly("one,2");
}
@Test
public void splitWin() {
assertThat(split(';', "one;2;2")).containsExactly("one", "2", "2");
}
@Test
public void splitEmpty() {
assertThat(split(';', "one;;2")).containsExactly("one", null, "2");
assertThat(split(';', ";;")).containsExactly(null, null, null);
}
@Test
public void testNextOrNull() {
PeekingIterator<Boolean> it = TrueThenDone.INSTANCE.iterator();
assertTrue(it.next());
assertThat(nextOrNull(it)).isNull();
}
@Test
public void peekingIteratorWhenPresent() {
PeekingIterator<Boolean> it = peekingIterator(Arrays.asList(true).iterator());
assertTrue(it.peek());
assertThat(it).containsExactly(true);
}
@Test
public void peekingIteratorWhenAbsent() {
PeekingIterator<Object> it = peekingIterator(Arrays.asList().iterator());
assertThat(it).isEmpty();
}
@Test
public void concatIteratorsWhenPresent() {
Iterator<Boolean>
it =
concat(TrueThenDone.INSTANCE.iterator(), TrueThenDone.INSTANCE.iterator());
assertThat(it).containsExactly(true, true);
}
@Test
public void concatIteratorsWhenAbsent() {
Iterator<Boolean> first = TrueThenDone.INSTANCE.iterator();
first.next();
Iterator<Boolean> second = TrueThenDone.INSTANCE.iterator();
second.next();
Iterator<Boolean> it = concat(first, second);
assertThat(it).isEmpty();
}
@Test
public void concatIteratorsWhenFirstIsEmpty() {
Iterator<Boolean> first = TrueThenDone.INSTANCE.iterator();
first.next();
Iterator<Boolean> it = concat(first, TrueThenDone.INSTANCE.iterator());
assertThat(it).containsExactly(true);
}
@Test
public void concatIterablesWhenPresent() {
Iterator<Boolean> it = concat(Arrays.asList(Arrays.asList(true), Arrays.asList(true)));
assertThat(it).containsExactly(true, true);
}
@Test
public void concatIterablesWhenAbsent() {
Iterator<Object> it = concat(Arrays.asList(Arrays.asList(), Arrays.asList()));
assertThat(it).isEmpty();
}
@Test
public void concatIterablesWhenFirstIsEmpty() {
Iterator<Boolean>
it =
concat(Arrays.asList(Arrays.<Boolean>asList(), Arrays.asList(true)));
assertThat(it).containsExactly(true);
}
@Test
public void filterRetains() {
Iterator<String> it = filter(Arrays.asList("waffles", "poo", "pancakes", "eggs").iterator(),
new Filter<String>() {
@Override
public boolean apply(String breakfast) {
return "pancakes".equals(breakfast);
}
});
assertThat(it).containsExactly("pancakes");
}
@Test
public void andFilter() {
Filter<String> startsWithP = new Filter<String>() {
@Override
public boolean apply(String breakfast) {
return breakfast.startsWith("p");
}
};
Filter<String> notPoo = new Filter<String>() {
@Override
public boolean apply(String breakfast) {
return !"poo".equals(breakfast);
}
};
assertTrue(and(startsWithP, notPoo).apply("pancakes"));
assertFalse(and(startsWithP, notPoo).apply("poo"));
}
@Test
public void toMapDoesntSplitTXT() {
assertThat(Util.toMap("TXT", "ONE TWO THREE")).isEqualTo(TXTData.create("ONE TWO THREE"));
}
}