blob: 118d86c351796371caa1397c1b4e1380fdd5e3b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2020 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.text.tests.contentassist;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Rule;
import org.junit.Test;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
import org.eclipse.jdt.internal.ui.text.java.ContentAssistHistory;
import org.eclipse.jdt.internal.ui.text.java.ContentAssistHistory.RHSHistory;
/**
* @since 3.2
*/
public class ContentAssistHistoryTest {
private static final String LINKED_LIST= "java.util.LinkedList";
private static final String ARRAY_LIST= "java.util.ArrayList";
private static final String ITERABLE= "java.lang.Iterable";
private static final String LIST= "java.util.List";
private static final String COLLECTION= "java.util.Collection";
private static final String STRING_BUFFER= "java.lang.StringBuffer";
private static final String CHAR_SEQUENCE= "java.lang.CharSequence";
private static final String STRING= "java.lang.String";
private static IType fgStringT;
private static IType fgCharSequenceT;
private static IType fgStringBufferT;
private static IType fgCollectionT;
private static IType fgListT;
private static IType fgArrayListT;
private static IType fgLinkedListT;
@Rule
public ProjectTestSetup pts= new ProjectTestSetup() {
/*
* @see org.eclipse.jdt.ui.tests.core.ProjectTestSetup#setUp()
*/
@Override
protected void before() throws Throwable {
super.before();
IJavaProject project= getProject();
fgStringT= project.findType(STRING);
fgCharSequenceT= project.findType(CHAR_SEQUENCE);
fgStringBufferT= project.findType(STRING_BUFFER);
fgCollectionT= project.findType(COLLECTION);
fgListT= project.findType(LIST);
fgArrayListT= project.findType(ARRAY_LIST);
fgLinkedListT= project.findType(LINKED_LIST);
}
};
@Test
public void testContentAssistHistoryIntInt() {
try {
new ContentAssistHistory(-1, 1);
fail();
} catch (IllegalArgumentException e) {
}
try {
new ContentAssistHistory(1, 0);
fail();
} catch (IllegalArgumentException e) {
}
try {
new ContentAssistHistory(1, 1);
} catch (IllegalArgumentException e) {
fail();
}
}
@Test
public void testContentAssistHistory() {
try {
new ContentAssistHistory();
} catch (IllegalArgumentException e) {
fail();
}
}
@Test
public void testRememberArgumentChecking() throws Exception {
ContentAssistHistory history= new ContentAssistHistory();
try {
history.remember(null, null);
fail();
} catch (IllegalArgumentException e) {
}
try {
history.remember(null, fgStringT);
fail();
} catch (IllegalArgumentException e) {
}
try {
history.remember(fgStringT, null);
fail();
} catch (IllegalArgumentException e) {
}
try {
history.remember(fgStringT, fgStringT);
} catch (IllegalArgumentException e) {
fail();
}
}
@Test
public void testGetHistory() {
ContentAssistHistory history= new ContentAssistHistory();
assertTrue(history.getHistory(STRING).getTypes().isEmpty());
history.remember(fgCharSequenceT, fgStringT);
assertTrue(history.getHistory(STRING).getTypes().isEmpty());
assertEquals(list(STRING), history.getHistory(CHAR_SEQUENCE).getTypes());
history.remember(fgStringT, fgStringT);
assertTrue("history must not remember final left hand sides", history.getHistory(STRING).getTypes().isEmpty());
history.remember(fgCharSequenceT, fgStringBufferT);
assertTrue(history.getHistory(STRING).getTypes().isEmpty());
assertEquals(list(STRING, STRING_BUFFER), history.getHistory(CHAR_SEQUENCE).getTypes());
history.remember(fgStringT, fgStringT);
assertTrue(history.getHistory(STRING).getTypes().isEmpty());
assertEquals("order not correct", list(STRING_BUFFER, STRING), history.getHistory(CHAR_SEQUENCE).getTypes());
}
@Test
public void testHistoryCapSize() {
ContentAssistHistory history= new ContentAssistHistory(1, 1);
history.remember(fgCharSequenceT, fgStringT);
assertEqualMap(map(CHAR_SEQUENCE, list(STRING)), history.getEntireHistory());
history.remember(fgStringT, fgStringT);
assertEqualMap("adding final types must not modify the history", map(CHAR_SEQUENCE, list(STRING)), history.getEntireHistory());
history.remember(fgCharSequenceT, fgStringBufferT);
assertEqualMap(map(CHAR_SEQUENCE, list(STRING_BUFFER)), history.getEntireHistory());
history.remember(fgCharSequenceT, fgArrayListT);
assertEqualMap("adding types that are not related must not modify the history", map(CHAR_SEQUENCE, list(STRING_BUFFER)), history.getEntireHistory());
history.remember(fgListT, fgStringT);
assertEqualMap("adding types that are not related must not modify the history", map(CHAR_SEQUENCE, list(STRING_BUFFER)), history.getEntireHistory());
history.remember(fgCollectionT, fgArrayListT);
assertEqualMap(map(COLLECTION, list(ARRAY_LIST)), history.getEntireHistory());
}
@Test
public void testGetHistoryForHierarchy() {
ContentAssistHistory history= new ContentAssistHistory();
history.remember(fgListT, fgArrayListT);
assertEqualMap(map(LIST, list(ARRAY_LIST), COLLECTION, list(ARRAY_LIST), ITERABLE, list(ARRAY_LIST)), history.getEntireHistory());
}
@Test
public void testGetEntireHistory() {
ContentAssistHistory history= new ContentAssistHistory();
history.remember(fgListT, fgArrayListT);
history.remember(fgCollectionT, fgLinkedListT);
assertEqualMap(map(LIST, list(ARRAY_LIST), COLLECTION, list(ARRAY_LIST, LINKED_LIST), ITERABLE, list(ARRAY_LIST, LINKED_LIST)), history.getEntireHistory());
}
@Test
public void testReadOnlyEntireHistory() {
ContentAssistHistory history= new ContentAssistHistory();
history.remember(fgListT, fgArrayListT);
history.remember(fgCollectionT, fgLinkedListT);
Map<String, RHSHistory> map= history.getEntireHistory();
try {
map.clear();
fail();
} catch (UnsupportedOperationException x) {
}
try {
map.get(LIST).getTypes().clear();
fail();
} catch (UnsupportedOperationException x) {
}
}
@Test
public void testReadOnlyHistory() {
ContentAssistHistory history= new ContentAssistHistory();
history.remember(fgListT, fgArrayListT);
history.remember(fgCollectionT, fgLinkedListT);
List<String> set= history.getHistory(LIST).getTypes();
try {
set.clear();
fail();
} catch (UnsupportedOperationException x) {
}
}
@Test
public void testLoadStore() throws Exception {
ContentAssistHistory history= new ContentAssistHistory();
history.remember(fgListT, fgArrayListT);
history.remember(fgCharSequenceT, fgStringT);
Preferences prefs= new Preferences();
String key= "myKey";
ContentAssistHistory.store(history, prefs, key);
ContentAssistHistory loaded= ContentAssistHistory.load(prefs, key);
assertEqualMap(map(LIST, list(ARRAY_LIST), COLLECTION, list(ARRAY_LIST), ITERABLE, list(ARRAY_LIST), CHAR_SEQUENCE, list(STRING)), loaded.getEntireHistory());
}
private static void assertEqualMap(Map<String, List<String>> expected, Map<String, RHSHistory> actual) {
assertEqualMap("", expected, actual);
}
private static void assertEqualMap(String message, Map<String, List<String>> expected, Map<String, RHSHistory> actual) {
assertEquals(message, expected.size(), actual.size());
for (Map.Entry<String, List<String>> entry : expected.entrySet()) {
String type = entry.getKey();
assertEquals(message, entry.getValue(), actual.get(type).getTypes());
}
}
private Map<String, List<String>> map(String type, List<String> set) {
Map<String, List<String>> map= new HashMap<>();
map.put(type, set);
return map;
}
private Map<String, List<String>> map(String t1, List<String> s1, String t2, List<String> s2) {
Map<String, List<String>> map= map(t1, s1);
map.put(t2, s2);
return map;
}
private Map<String, List<String>> map(String t1, List<String> s1, String t2, List<String> s2, String t3, List<String> s3) {
Map<String, List<String>> map= map(t1, s1, t2, s2);
map.put(t3, s3);
return map;
}
private Map<String, List<String>> map(String t1, List<String> s1, String t2, List<String> s2, String t3, List<String> s3, String t4, List<String> s4) {
Map<String, List<String>> map= map(t1, s1, t2, s2, t3, s3);
map.put(t4, s4);
return map;
}
List<String> list(String param) {
List<String> list= new ArrayList<>();
list.add(param);
return list;
}
List<String> list(String p1, String p2) {
List<String> list= list(p1);
list.add(p2);
return list;
}
}