package org.threadly.concurrent;
import static org.junit.Assert.*;
import static org.threadly.TestConstants.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import org.threadly.ThreadlyTestUtil;
import org.threadly.test.concurrent.TestRunnable;
import org.threadly.util.SuppressedStackRuntimeException;
@SuppressWarnings("javadoc")
public class RunnableChainTest {
@BeforeClass
public static void setupClass() {
ThreadlyTestUtil.setIgnoreExceptionHandler();
}
private static final int FAIL_INDEX = 2;
@Test
public void constructorTest() {
new RunnableChain(false, null).run();
new RunnableChain(true, null).run();
}
@Test
public void exceptionStopsChainTest() {
List<TestRunnable> list = new ArrayList<>(TEST_QTY);
for (int i = 0; i < TEST_QTY; i++) {
list.add(new ChainRunnable(i == FAIL_INDEX));
}
RunnableChain chain = new RunnableChain(true, list);
try {
chain.run();
} catch (RuntimeException expected) {
// ignore expected exception
}
for (int i = 0; i < TEST_QTY; i++) {
TestRunnable tr = list.get(i);
if (i > FAIL_INDEX) {
assertEquals(0, tr.getRunCount());
} else {
assertEquals(1, tr.getRunCount());
}
}
}
@Test
public void runAllProvidedTest() {
List<TestRunnable> list = new ArrayList<>(TEST_QTY);
for (int i = 0; i < TEST_QTY; i++) {
list.add(new ChainRunnable(i == FAIL_INDEX));
}
RunnableChain chain = new RunnableChain(false, list);
try {
chain.run();
} catch (RuntimeException expected) {
// ignore expected exception
}
for (int i = 0; i < TEST_QTY; i++) {
TestRunnable tr = list.get(i);
assertEquals(1, tr.getRunCount());
}
}
private class ChainRunnable extends TestRunnable {
private final boolean fail;
private ChainRunnable(boolean fail) {
this.fail = fail;
}
@Override
public void handleRunStart() {
if (fail) {
throw new SuppressedStackRuntimeException("Test failure exception");
}
}
}
}