package org.mapdb;
import junit.framework.TestCase;
public class AtomicStringTest extends TestCase {
DB db;
Atomic.String ai;
@Override
protected void setUp() throws Exception {
db = DBMaker.memoryDB().make();
ai = db.atomicString("test", "test").create();
}
@Override
protected void tearDown() throws Exception {
db.close();
}
/*
* constructor initializes to given value
*/
public void testConstructor() {
assertEquals("test", ai.get());
}
/*
* default constructed initializes to empty string
*/
public void testConstructor2() {
Atomic.String ai = db.atomicString("test2").create();
assertEquals(null, ai.get());
}
/*
* get returns the last value set
*/
public void testGetSet() {
assertEquals("test", ai.get());
ai.set("test2");
assertEquals("test2", ai.get());
ai.set("test3");
assertEquals("test3", ai.get());
}
/*
* compareAndSet succeeds in changing value if equal to expected else fails
*/
public void testCompareAndSet(){
assertTrue(ai.compareAndSet("test", "test2"));
assertTrue(ai.compareAndSet("test2", "test3"));
assertEquals("test3", ai.get());
assertFalse(ai.compareAndSet("test2", "test4"));
assertNotSame("test5", ai.get());
assertTrue(ai.compareAndSet("test3", "test5"));
assertEquals("test5", ai.get());
}
/*
* compareAndSet in one thread enables another waiting for value
* to succeed
*/
public void testCompareAndSetInMultipleThreads() throws InterruptedException {
Thread t = new Thread(new Runnable() {
public void run() {
while(!ai.compareAndSet("test2", "test3")) Thread.yield();
}});
t.start();
assertTrue(ai.compareAndSet("test", "test2"));
t.join(0);
assertFalse(t.isAlive());
assertEquals(ai.get(), "test3");
}
/*
* getAndSet returns previous value and sets to given value
*/
public void testGetAndSet(){
assertEquals("test", ai.getAndSet("test2"));
assertEquals("test2", ai.getAndSet("test3"));
assertEquals("test3", ai.getAndSet("test4"));
}
/*
* toString returns current value.
*/
public void testToString() {
assertEquals(ai.toString(), ai.get());
assertEquals(ai.toString(), "test");
}
}