View Javadoc
1   package io.atlassian.fugue;
2   
3   import org.junit.Test;
4   
5   import java.lang.ref.ReferenceQueue;
6   import java.lang.ref.WeakReference;
7   import java.util.function.Function;
8   
9   import static io.atlassian.fugue.Functions.WeakMemoizer.weakMemoizer;
10  import static io.atlassian.fugue.Functions.weakMemoize;
11  import static org.junit.Assert.assertNotNull;
12  import static org.junit.Assert.assertNotSame;
13  import static org.junit.Assert.assertNull;
14  import static org.junit.Assert.assertSame;
15  
16  public class WeakMemoizerTest {
17  
18    static Function<Integer, String> supplier() {
19      return Functions.fromSupplier(() -> new String("test"));
20    }
21  
22    @Test public void callingTwiceReturnsSame() throws Exception {
23      final Function<Integer, String> memoizer = weakMemoize(supplier());
24      assertSame(memoizer.apply(1), memoizer.apply(1));
25    }
26  
27    @Test public void callingDifferentMemoizersReturnsDifferent() throws Exception {
28      assertNotSame(weakMemoizer(supplier()).apply(1), weakMemoizer(supplier()).apply(1));
29    }
30  
31    @Test public void lockReferenceNotNull() throws Exception {
32      final Functions.WeakMemoizer.MappedReference<String, String> ref = new Functions.WeakMemoizer.MappedReference<>("test", "value",
33        new ReferenceQueue<>());
34      assertNotNull(ref.getDescriptor());
35      assertNotNull(ref.get());
36    }
37  
38    @Test(expected = NullPointerException.class) public void referenceNullDescriptor() throws Exception {
39      new Functions.WeakMemoizer.MappedReference<String, String>(null, "value", new ReferenceQueue<>());
40    }
41  
42    @Test(expected = NullPointerException.class) public void referenceNullValue() throws Exception {
43      new Functions.WeakMemoizer.MappedReference<String, String>("ref", null, new ReferenceQueue<>());
44      assertNotSame(weakMemoizer(supplier()).apply(1), weakMemoize(supplier()).apply(1));
45    }
46  
47    @Test public void many() throws Exception {
48      final Function<Integer, String> memoizer = weakMemoize(supplier());
49  
50      final int size = 10000;
51      for (int i = 0; i < 10; i++) {
52        System.gc();
53        for (int j = 0; j < size; j++) {
54          assertSame(memoizer.apply(j), memoizer.apply(j));
55        }
56      }
57    }
58  
59    @Test public void losesReference() throws Exception {
60      final Function<Integer, String> memoizer = weakMemoize(supplier());
61  
62      final WeakReference<String> one = new WeakReference<>(memoizer.apply(1));
63      for (int i = 0; i < 10; i++) {
64        System.gc();
65      }
66      assertNotNull(memoizer.apply(1));
67      assertNull(one.get());
68    }
69  }