1/*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.collect;
18
19import com.google.common.base.Function;
20import com.google.common.testing.GcFinalization;
21import com.google.common.testing.NullPointerTester;
22
23import junit.framework.TestCase;
24
25import java.lang.ref.WeakReference;
26
27/**
28 * Unit test for {@link Interners}.
29 *
30 * @author Kevin Bourrillion
31 */
32public class InternersTest extends TestCase {
33
34  public void testStrong_simplistic() {
35    String canonical = "a";
36    String not = new String("a");
37
38    Interner<String> pool = Interners.newStrongInterner();
39    assertSame(canonical, pool.intern(canonical));
40    assertSame(canonical, pool.intern(not));
41  }
42
43  public void testStrong_null() {
44    Interner<String> pool = Interners.newStrongInterner();
45    try {
46      pool.intern(null);
47      fail();
48    } catch (NullPointerException ok) {}
49  }
50
51  public void testWeak_simplistic() {
52    String canonical = "a";
53    String not = new String("a");
54
55    Interner<String> pool = Interners.newWeakInterner();
56    assertSame(canonical, pool.intern(canonical));
57    assertSame(canonical, pool.intern(not));
58  }
59
60  public void testWeak_null() {
61    Interner<String> pool = Interners.newWeakInterner();
62    try {
63      pool.intern(null);
64      fail();
65    } catch (NullPointerException ok) {}
66  }
67
68  public void testWeak_afterGC() throws InterruptedException {
69    Integer canonical = new Integer(5);
70    Integer not = new Integer(5);
71
72    Interner<Integer> pool = Interners.newWeakInterner();
73    assertSame(canonical, pool.intern(canonical));
74
75    WeakReference<Integer> signal = new WeakReference<Integer>(canonical);
76    canonical = null;  // Hint to the JIT that canonical is unreachable
77
78    GcFinalization.awaitClear(signal);
79    assertSame(not, pool.intern(not));
80  }
81
82  public void testAsFunction_simplistic() {
83    String canonical = "a";
84    String not = new String("a");
85
86    Function<String, String> internerFunction =
87        Interners.asFunction(Interners.<String>newStrongInterner());
88
89    assertSame(canonical, internerFunction.apply(canonical));
90    assertSame(canonical, internerFunction.apply(not));
91  }
92
93  public void testNullPointerExceptions() {
94    new NullPointerTester().testAllPublicStaticMethods(Interners.class);
95  }
96}
97