package org.multiverse.collections;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.Stm;
import org.multiverse.api.StmUtils;
import org.multiverse.api.Txn;
import org.multiverse.api.callables.TxnVoidCallable;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class NaiveTxnStack_addAllTest {
private Stm stm;
@Before
public void setUp() {
stm = getGlobalStmInstance();
clearThreadLocalTxn();
}
@Test
public void whenNullCollectionAdded_thenNullPointerException() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
try {
stack.addAll(null);
fail();
} catch (NullPointerException expected) {
}
assertEquals("[]", stack.toString());
}
});
}
@Test
public void whenOneOfItemsIsNull() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
try {
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
List<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.add(null);
list.add("d");
try {
stack.addAll(list);
fail();
} catch (NullPointerException expected) {
}
assertEquals("[b, a]", stack.toString());
throw new NullPointerException();
}
});
fail();
} catch (NullPointerException expected) {
}
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
assertEquals("[]", stack.toString());
assertEquals(0, stack.size());
}
});
}
@Test
public void whenNonEmptyStackAndEmptyCollection() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
stack.push("1");
stack.push("2");
stack.addAll(new LinkedList<String>());
assertEquals("[2, 1]", stack.toString());
assertEquals(2, stack.size());
}
});
}
@Test
public void whenBothEmpty() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
stack.addAll(new LinkedList<String>());
assertEquals("[]", stack.toString());
assertEquals(0, stack.size());
}
});
}
@Test
public void whenEmptyStackEmptyAndNonEmptyCollection() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
List<String> list = Arrays.asList("1", "2");
stack.addAll(list);
assertEquals("[2, 1]", stack.toString());
assertEquals(2, stack.size());
}
});
}
@Test
public void whenBothNonEmpty() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
List<String> list = Arrays.asList("2", "1");
stack.add("4");
stack.add("3");
stack.addAll(list);
assertEquals("[1, 2, 3, 4]", stack.toString());
assertEquals(4, stack.size());
}
});
}
@Test
public void whenCapacityExceeded() {
final NaiveTxnStack<String> stack = new NaiveTxnStack<String>(stm, 2);
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
stack.add("1");
}
});
try {
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
List<String> c = Arrays.asList("2", "3");
try {
stack.addAll(c);
fail();
} catch (IllegalStateException expected) {
}
assertEquals("[2, 1]", stack.toString());
assertEquals(2, stack.size());
throw new IllegalStateException();
}
});
fail();
} catch (IllegalStateException expected) {
}
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
assertEquals(1, stack.size());
assertEquals("[1]", stack.toString());
}
});
}
}