package com.annimon.stream.function;
import static com.annimon.stream.test.hamcrest.CommonMatcher.hasOnlyPrivateConstructors;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* Tests {@code Consumer}.
*
* @see com.annimon.stream.function.Consumer
*/
public class ConsumerTest {
@Test
public void testAccept() {
IntHolder holder = new IntHolder(10);
increment.accept(holder);
assertEquals(11, holder.value);
increment.accept(holder);
assertEquals(12, holder.value);
mulBy2.accept(holder);
assertEquals(24, holder.value);
}
@Test
public void testAndThen() {
Consumer<IntHolder> consumer = Consumer.Util.andThen(increment, mulBy2);
IntHolder holder = new IntHolder(10);
// (10+1) * 2
consumer.accept(holder);
assertEquals(22, holder.value);
// (22+1) * 2
consumer.accept(holder);
assertEquals(46, holder.value);
}
@Test
public void testSafe() {
Consumer<OutputStream> consumer = Consumer.Util.safe(writer);
ByteArrayOutputStream baos = new ByteArrayOutputStream(5);
consumer.accept(baos);
consumer.accept(null);
consumer.accept(null);
consumer.accept(baos);
assertEquals(">>", baos.toString());
}
@Test
public void testSafeWithOnFailedConsumer() {
final ByteArrayOutputStream baos = new ByteArrayOutputStream(5);
Consumer<OutputStream> consumer = Consumer.Util.safe(writer, new Consumer<OutputStream>() {
@Override
public void accept(OutputStream os) {
baos.write('<');
}
});
consumer.accept(baos);
consumer.accept(baos);
consumer.accept(null);
consumer.accept(null);
assertEquals(">><<", baos.toString());
}
@Test
public void testPrivateConstructor() throws Exception {
assertThat(Consumer.Util.class, hasOnlyPrivateConstructors());
}
private static final Consumer<IntHolder> increment = new Consumer<IntHolder>() {
@Override
public void accept(IntHolder holder) {
holder.value++;
}
};
private static final Consumer<IntHolder> mulBy2 = new Consumer<IntHolder>() {
@Override
public void accept(IntHolder holder) {
holder.value *= 2;
}
};
private static final ThrowableConsumer<OutputStream, Throwable> writer
= new ThrowableConsumer<OutputStream, Throwable>() {
@Override
public void accept(OutputStream os) throws Throwable {
os.write('>');
}
};
static class IntHolder {
int value;
public IntHolder(int value) {
this.value = value;
}
}
}