package org.multiverse.collections;
import org.junit.Before;
import org.junit.Ignore;
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 org.multiverse.api.exceptions.RetryError;
import static org.junit.Assert.*;
import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance;
import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn;
public class NaiveTxnStack_popTest {
private Stm stm;
private NaiveTxnStack<String> stack;
@Before
public void setUp() {
stm = getGlobalStmInstance();
clearThreadLocalTxn();
stack = new NaiveTxnStack<String>(stm);
}
@Test
public void whenSingleItem() {
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
String item = "1";
stack.push(item);
String found = stack.pop();
assertSame(found, item);
assertEquals(0, stack.size());
assertEquals("[]", stack.toString());
}
});
}
@Test
public void whenMultipleItems() {
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
String item1 = "1";
String item2 = "2";
stack.push(item1);
stack.push(item2);
String found = stack.pop();
assertSame(found, item2);
assertEquals(1, stack.size());
assertEquals("[1]", stack.toString());
}
});
}
@Test
@Ignore
public void whenEmpty_thenRetryError() {
StmUtils.atomic(new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
try {
stack.pop();
fail();
} catch (RetryError retry) {
}
}
});
}
}