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 }