package edu.berkeley.lipstick.testing;
import edu.berkeley.lipstick.util.WriteClock;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class WriteClockTest {
@Test
public void testGetValue() throws Exception {
WriteClock wc = new WriteClock();
assertEquals(0, wc.getValue("test"));
wc.incrementValue("test");
assertEquals(1, wc.getValue("test"));
}
@Test
public void testGetWriters() throws Exception {
WriteClock wc = new WriteClock();
assertEquals(0, wc.getWriters().size());
wc.incrementValue("test");
assertEquals(1, wc.getWriters().size());
assertTrue(wc.getWriters().contains("test"));
}
@Test
public void testMergeClock() throws Exception {
WriteClock wc1 = new WriteClock();
WriteClock wc2 = new WriteClock();
//<A:2, B:1>
wc1.incrementValue("A");
wc1.incrementValue("A");
wc1.incrementValue("B");
//<A:3, C:1>
wc2.incrementValue("A");
wc2.incrementValue("A");
wc2.incrementValue("A");
wc2.incrementValue("C");
wc1.mergeClock(wc2);
//shouldn't touch wc2
assertEquals(3, wc2.getValue("A"));
assertEquals(1, wc2.getValue("C"));
assertEquals(2, wc2.getWriters().size());
//Should have <A:3, B:1, C:1>
assertEquals(3, wc1.getValue("A"));
assertEquals(1, wc1.getValue("B"));
assertEquals(1, wc1.getValue("C"));
assertEquals(3, wc1.getWriters().size());
}
@Test
public void testHappensBefore() throws Exception {
WriteClock wc1 = new WriteClock();
WriteClock wc2 = new WriteClock();
WriteClock wc3 = new WriteClock();
//<A:2, B:1>
wc1.incrementValue("A");
wc1.incrementValue("A");
wc1.incrementValue("B");
//<A:3, C:1>
wc2.incrementValue("A");
wc2.incrementValue("A");
wc2.incrementValue("A");
wc2.incrementValue("C");
//<A:1, B:1>
wc3.incrementValue("A");
wc3.incrementValue("B");
assertFalse(wc1.happensBefore(wc2));
assertFalse(wc2.happensBefore(wc1));
assertTrue(wc3.happensBefore(wc1));
assertFalse(wc2.happensBefore(wc3));
assertFalse(wc3.happensBefore(wc3));
}
}