package com.annimon.stream.internal; import java.io.Closeable; import java.io.IOException; import org.junit.Test; import static com.annimon.stream.test.hamcrest.CommonMatcher.hasOnlyPrivateConstructors; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; public class ComposeTest { @Test public void testPrivateConstructor() { assertThat(Compose.class, hasOnlyPrivateConstructors()); } @Test public void testComposeRunnables() { final int[] counter = new int[] { 0 }; final Runnable runnable = new Runnable() { @Override public void run() { counter[0]++; } }; Runnable composed = Compose.runnables(runnable, runnable); composed.run(); assertThat(counter[0], is(2)); } @Test public void testComposeRunnablesWithExceptionOnFirst() { final int[] counter = new int[] { 0 }; final Runnable runnable1 = new Runnable() { @Override public void run() { counter[0]++; throw new IllegalStateException("ok"); } }; final Runnable runnable2 = new Runnable() { @Override public void run() { counter[0]++; } }; Runnable composed = Compose.runnables(runnable1, runnable2); try { composed.run(); } catch (IllegalStateException ex) { assertThat(ex.getMessage(), is("ok")); } assertThat(counter[0], is(2)); } @Test public void testComposeRunnablesWithExceptionOnBoth() { final int[] counter = new int[] { 0 }; final Runnable runnable1 = new Runnable() { @Override public void run() { counter[0]++; throw new IllegalStateException("1"); } }; final Runnable runnable2 = new Runnable() { @Override public void run() { counter[0]++; throw new IllegalArgumentException("2"); } }; Runnable composed = Compose.runnables(runnable1, runnable2); try { composed.run(); } catch (IllegalStateException ex1) { assertThat(ex1.getMessage(), is("1")); } catch (IllegalArgumentException ex2) { fail(); } assertThat(counter[0], is(2)); } @Test public void testComposeRunnablesWithError() { final int[] counter = new int[] { 0 }; final Runnable runnable1 = new Runnable() { @Override public void run() { counter[0]++; throw new AssertionError("1"); } }; final Runnable runnable2 = new Runnable() { @Override public void run() { counter[0]++; throw new AssertionError("2"); } }; Runnable composed = Compose.runnables(runnable1, runnable2); try { composed.run(); } catch (AssertionError error) { assertThat(error.getMessage(), is("1")); } assertThat(counter[0], is(2)); } @Test public void testComposeCloseables() { final int[] counter = new int[] { 0 }; final Closeable closeable = new Closeable() { @Override public void close() throws IOException { counter[0]++; } }; Runnable composed = Compose.closeables(closeable, closeable); composed.run(); assertThat(counter[0], is(2)); } @Test public void testComposeCloseablesWithExceptionOnFirst() { final int[] counter = new int[] { 0 }; final Closeable closeable1 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new IllegalStateException("ok"); } }; final Closeable closeable2 = new Closeable() { @Override public void close() throws IOException { counter[0]++; } }; Runnable composed = Compose.closeables(closeable1, closeable2); try { composed.run(); } catch (IllegalStateException ex) { assertThat(ex.getMessage(), is("ok")); } assertThat(counter[0], is(2)); } @Test public void testComposeCloseablesWithExceptionOnSecond() { final int[] counter = new int[] { 0 }; final Closeable closeable1 = new Closeable() { @Override public void close() throws IOException { counter[0]++; } }; final Closeable closeable2 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new IllegalArgumentException("ok"); } }; Runnable composed = Compose.closeables(closeable1, closeable2); try { composed.run(); } catch (IllegalArgumentException ex) { assertThat(ex.getMessage(), is("ok")); } assertThat(counter[0], is(2)); } @Test public void testComposeCloseablesWithWrappedExceptionOnSecond() { final int[] counter = new int[] { 0 }; final Closeable closeable1 = new Closeable() { @Override public void close() throws IOException { counter[0]++; } }; final Closeable closeable2 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new IOException("ok"); } }; Runnable composed = Compose.closeables(closeable1, closeable2); try { composed.run(); } catch (RuntimeException ex) { assertThat(ex.getCause(), instanceOf(IOException.class)); assertThat(ex.getCause().getMessage(), is("ok")); } assertThat(counter[0], is(2)); } @Test public void testComposeCloseablesWithError() { final int[] counter = new int[] { 0 }; final Closeable closeable1 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new AssertionError("1"); } }; final Closeable closeable2 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new AssertionError("2"); } }; Runnable composed = Compose.closeables(closeable1, closeable2); try { composed.run(); } catch (AssertionError error) { assertThat(error.getMessage(), is("1")); } assertThat(counter[0], is(2)); } @Test public void testComposeCloseablesWithErrorOnSecond() { final int[] counter = new int[] { 0 }; final Closeable closeable1 = new Closeable() { @Override public void close() throws IOException { counter[0]++; } }; final Closeable closeable2 = new Closeable() { @Override public void close() throws IOException { counter[0]++; throw new AssertionError("ok"); } }; Runnable composed = Compose.closeables(closeable1, closeable2); try { composed.run(); } catch (AssertionError ex) { assertThat(ex.getMessage(), is("ok")); } assertThat(counter[0], is(2)); } }