package com.googlecode.totallylazy.functions; import com.googlecode.totallylazy.Sequence; import org.junit.Test; import java.util.concurrent.Callable; import static com.googlecode.totallylazy.functions.Callables.returns; import static com.googlecode.totallylazy.Callers.callConcurrently; import static com.googlecode.totallylazy.functions.CountCalls0.counting; import static com.googlecode.totallylazy.functions.TimeReport.time; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; public class LazyCallableTest { @Test public void isVeryFast() throws Exception { System.out.println("base = " + TimeReport.time(1000, returns(1))); System.out.println("lazy = " + TimeReport.time(1000, Lazy.lazy(returns(1)))); } @Test public void isThreadSafe() throws Exception { CountCalls0<Integer> callable = CountCalls0.counting(); Function0<Integer> lazyCallable = callable.sleep(10).lazy(); Sequence<Integer> result = callConcurrently(lazyCallable, lazyCallable).realise(); assertThat(callable.count(), is(1)); assertThat(result.first(), is(0)); assertThat(result.second(), is(0)); } @Test public void onlyCallsUnderlyingCallableOnce() throws Exception { CountCalls0<Integer> callable = CountCalls0.counting(); Callable<Integer> lazyCallable = callable.lazy(); assertThat(lazyCallable.call(), is(0)); assertThat(lazyCallable.call(), is(0)); assertThat(callable.count(), is(1)); } }