public void PropagatesExceptions() { AFnImpl fn = new AFnImpl(); fn._fn0 = () => { throw new Exception("future exception"); }; Future f = new Future(fn); try { f.deref(); Assert.Fail("expected future exception"); } catch (Exception ex) { Expect(ex.Message, EqualTo("Future has an error")); Expect(ex.InnerException, Is.Not.Null); Expect(ex.InnerException.Message, EqualTo("future exception")); } // Same result for subsequent derefs. try { f.deref(); Assert.Fail("expected future exception"); } catch (Exception ex) { Expect(ex.Message, EqualTo("Future has an error")); Expect(ex.InnerException, Is.Not.Null); Expect(ex.InnerException.Message, EqualTo("future exception")); } }
public void CachesResultForSubsequentCalls() { int i = 0; AFnImpl fn = new AFnImpl(); fn._fn0 = () => Interlocked.Increment(ref i); Future f = new Future(fn); Expect(f.deref(), EqualTo(1)); Expect(f.deref(), EqualTo(1)); Expect(i, EqualTo(1)); }
public void DerefThrowsAfterCancellation() { AFnImpl fn = new AFnImpl(); fn._fn0 = () => { while (true); }; Future f = new Future(fn); f.cancel(); f.deref(); }
public void CancelFailsAfterSuccessfulCompletion() { AFnImpl fn = new AFnImpl(); fn._fn0 = () => { return 42; }; Future f = new Future(fn); Expect(f.deref(), EqualTo(42)); Expect(f.cancel(), EqualTo(false)); Expect(f.isCancelled(), EqualTo(false)); }
public void ComputesTheValueOnAnotherThread() { int workerID = Thread.CurrentThread.ManagedThreadId; AFnImpl fn = new AFnImpl(); fn._fn0 = () => { workerID = Thread.CurrentThread.ManagedThreadId; return 42; }; Future f = new Future(fn); Expect(f.deref(), EqualTo(42)); Expect(workerID, Not.EqualTo(Thread.CurrentThread.ManagedThreadId)); }