blob: 92a65bb3151f2f054680558daea14bd75628aecf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2021 jkubitz and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* jkubitz - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler;
import java.util.List;
import java.util.function.Supplier;
import org.eclipse.jdt.core.tests.junit.extension.TestCase;
import org.eclipse.jdt.internal.core.util.DeduplicationUtil;
import junit.framework.Test;
import junit.framework.TestSuite;
public class DeduplicationUtilTest extends TestCase {
public DeduplicationUtilTest(String testName) {
super(testName);
}
public static Test suite() {
TestSuite suite = new TestSuite(DeduplicationUtilTest.class.getPackageName());
suite.addTest(new TestSuite(DeduplicationUtilTest.class));
return suite;
}
public void testDeduplication() {
assertDeduplicationString("aNeverUsedBefore".toCharArray());
assertDeduplicationCharArray("aNeverUsedBefore");
assertDeduplicationObject(() -> List.of("aNeverUsedBefore"));
assertDeduplicationString("bNeverUsedBefore".toCharArray());
assertDeduplicationCharArray("bNeverUsedBefore");
assertDeduplicationObject(() -> List.of("bNeverUsedBefore"));
}
private void assertDeduplicationString(char[] stringTemplate) {
// do not change order of weak/strong test,
{ // test weak behaviour:
String a = new String(stringTemplate);
String b = new String(stringTemplate);
assertNotSame(a, b);
String expected = DeduplicationUtil.intern(b);
assertSame(b, expected);
b = null;
expected = null;
forceGc();
String actual = DeduplicationUtil.intern(a);
assertSame(a, actual); // i.e. actual != expected since "expected" was garbage collected.
}
{ // test strong:
String a = new String(stringTemplate);
String b = new String(stringTemplate);
assertNotSame(a, b);
String actual = DeduplicationUtil.intern(a);
String expected = DeduplicationUtil.intern(b);
assertSame(expected, actual);
}
}
private void assertDeduplicationCharArray(String charArrayTemplate) {
{ // weak
char[] a = charArrayTemplate.toCharArray();
char[] b = charArrayTemplate.toCharArray();
assertNotSame(a, b);
char[] expected = DeduplicationUtil.intern(b);
assertSame(b, expected);
b = null;
expected = null;
forceGc();
char[] actual = DeduplicationUtil.intern(a);
assertSame(a, actual);
}
{ // strong
char[] a = charArrayTemplate.toCharArray();
char[] b = charArrayTemplate.toCharArray();
assertNotSame(a, b);
char[] actual = DeduplicationUtil.intern(a);
char[] expected = DeduplicationUtil.intern(b);
assertSame(expected, actual);
}
}
private void assertDeduplicationObject(Supplier<Object> supplier) {
{ // weak
Object a = supplier.get();
Object b = supplier.get();
assertNotSame(a, b);
Object expected = DeduplicationUtil.internObject(b);
assertSame(b, expected);
b = null;
expected = null;
forceGc();
Object actual = DeduplicationUtil.internObject(a);
assertSame(a, actual);
}
{ // strong
Object a = supplier.get();
Object b = supplier.get();
assertNotSame(a, b);
Object actual = DeduplicationUtil.internObject(a);
Object expected = DeduplicationUtil.internObject(b);
assertSame(expected, actual);
}
}
private void forceGc() {
System.gc();
System.runFinalization();
try {
// give gc some time to run
Thread.sleep(500);
} catch (InterruptedException e) {
// don't care
}
}
}