package io.trane.future; import static org.junit.Assert.assertEquals; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; public class LocalTest { Local<Integer> l = Local.apply(); @Test public void getEmpty() { assertEquals(Optional.empty(), l.get()); } @Test public void getEmptyFreshThread() throws InterruptedException { AtomicReference<Optional<Integer>> result = new AtomicReference<>(); Thread t = new Thread() { @Override public void run() { result.set(l.get()); } }; t.start(); t.join(); assertEquals(Optional.empty(), result.get()); } @Test public void saveAndRestore() { l.update(1); assertEquals(Optional.of(1), l.get()); Optional<?>[] saved = Local.save(); l.update(2); assertEquals(Optional.of(2), l.get()); Local.restore(saved); l.update(1); assertEquals(Optional.of(1), l.get()); } @Test public void updateAndGet() { l.update(1); assertEquals(Optional.of(1), l.get()); } @Test public void setAndGetDefined() { l.set(Optional.of(1)); assertEquals(Optional.of(1), l.get()); } @Test public void setAndGetEmpty() { l.set(Optional.empty()); assertEquals(Optional.empty(), l.get()); } @Test public void setAndGetNull() { l.set(null); assertEquals(Optional.empty(), l.get()); } @Test public void letSuccess() { l.update(1); try { int result = l.let(2, () -> { assertEquals(Optional.of(2), l.get()); return 2; }); assertEquals(2, result); assertEquals(Optional.of(1), l.get()); } finally { assertEquals(Optional.of(1), l.get()); } } @Test(expected = IllegalStateException.class) public void letFailure() { l.update(1); try { l.let(2, () -> { assertEquals(Optional.of(2), l.get()); throw new IllegalStateException(); }); } finally { assertEquals(Optional.of(1), l.get()); } } @Test public void getFresh() { assertEquals(Optional.empty(), (Local.<Integer>apply()).get()); } @Test public void multipleLocals() { Local<Integer> l1 = Local.apply(); Local<Integer> l2 = Local.apply(); Local<Integer> l3 = Local.apply(); Local<Integer> l4 = Local.apply(); l1.set(Optional.of(1)); l2.set(Optional.of(2)); l3.set(Optional.of(3)); l4.set(Optional.of(4)); assertEquals(Optional.of(1), l1.get()); assertEquals(Optional.of(2), l2.get()); assertEquals(Optional.of(3), l3.get()); assertEquals(Optional.of(4), l4.get()); } }