package org.threadly.concurrent;
import static org.junit.Assert.*;
import static org.threadly.TestConstants.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import org.junit.Test;
import org.threadly.test.concurrent.TestRunnable;
@SuppressWarnings("javadoc")
public class ContainerHelperTest {
@Test
public void removeRunnableFromCollectionTest() {
List<TestRunnableContainer> testRunnables = new ArrayList<>(TEST_QTY);
for (int i = 0; i < TEST_QTY; i++) {
testRunnables.add(new TestRunnableContainer(new TestRunnable()));
}
Runnable toRemove = testRunnables.get(TEST_QTY / 2).r;
assertTrue(ContainerHelper.remove(testRunnables, toRemove));
}
@Test
public void removeCallableFromCollectionTest() {
List<TestRunnableContainer> testRunnables = new ArrayList<>(TEST_QTY);
Callable<?> toRemove = null;
for (int i = 0; i < TEST_QTY; i++) {
TestCallable tc = new TestCallable();
if (TEST_QTY / 2 == i) {
toRemove = tc;
}
testRunnables.add(new TestRunnableContainer(new TestCallableContainer(tc)));
}
assertTrue(ContainerHelper.remove(testRunnables, toRemove));
}
@Test
public void twoDifferentRunnableTest() {
assertFalse(ContainerHelper.isContained(new TestRunnable(), new TestRunnable()));
}
@Test
public void sameRunnableTest() {
TestRunnable tr = new TestRunnable();
assertTrue(ContainerHelper.isContained(tr, tr));
}
@Test
public void containedRunnableTest() {
TestRunnable tr = new TestRunnable();
assertTrue(ContainerHelper.isContained(new TestRunnableContainer(tr), tr));
}
@Test
public void containedCallableTest() {
TestCallable tc = new TestCallable();
assertTrue(ContainerHelper.isContained(new TestCallableContainer(tc), tc));
}
@Test
public void notContainedCallableTest() {
TestCallable tc = new TestCallable();
assertFalse(ContainerHelper.isContained(new TestRunnableContainer(new TestRunnable()), tc));
assertFalse(ContainerHelper.isContained(new TestRunnable(), tc));
}
@Test
public void getContainedRunnablesTest() {
List<TestRunnableContainer> containers = new ArrayList<>(TEST_QTY);
for (int i = 0; i < TEST_QTY; i++) {
containers.add(new TestRunnableContainer(new TestRunnable()));
}
List<Runnable> resultList = ContainerHelper.getContainedRunnables(containers);
assertEquals(containers.size(), resultList.size());
Iterator<TestRunnableContainer> it = containers.iterator();
while (it.hasNext()) {
assertTrue(resultList.contains(it.next().r));
}
}
private static class TestRunnableContainer extends DoNothingRunnable
implements RunnableContainer {
private final Runnable r;
private TestRunnableContainer(Runnable r) {
this.r = r;
}
@Override
public Runnable getContainedRunnable() {
return r;
}
}
@SuppressWarnings("rawtypes")
private static class TestCallableContainer extends DoNothingRunnable
implements CallableContainer, Runnable {
private final Callable<?> c;
private TestCallableContainer(Callable<?> c) {
this.c = c;
}
@Override
public Callable<?> getContainedCallable() {
return c;
}
}
}