blob: 1284fc32eceb7e789233a6c3a34d1f5cc4a2fe87 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2020 Jesper S. Møller 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:
* Jesper S. Møller - initial API and implementation
* Jesper Steen Møller - bug 426903: [1.8] Cannot evaluate super call to default method
* Jesper S. Møller - bug 430839: [1.8] Cannot inspect static method of interface
*******************************************************************************/
package org.eclipse.jdt.debug.tests.eval;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
/**
* Group of tests that evaluate operations involving generics
*
* @since 3.8
*/
public class Java8Tests extends AbstractDebugTest {
/**
* @param name
*/
public Java8Tests(String name) {
super(name);
}
@Override
protected IJavaProject getProjectContext() {
return get18Project();
}
/**
* Evaluates a generified snippet with a simple single
* generic statement
*
* @throws Exception
*/
public void testEvalDefaultMethod() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTest18";
createLineBreakpoint(22, type);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "strings.stream()";
doEval(thread, snippet);
}
finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet in the context of interface method generic statement
*
* @throws Exception
*/
public void testEvalInterfaceMethod() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTestIntf18";
IJavaLineBreakpoint bp = createLineBreakpoint(26, "", "EvalTestIntf18.java", "Intf18");
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "a + 2";
doEval(thread, snippet);
}
finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet in the context of interface method generic statement
*
* @throws Exception
*/
public void testBugEvalIntfSuperDefault() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalIntfSuperDefault";
IJavaLineBreakpoint bp = createLineBreakpoint(29, "", "EvalIntfSuperDefault.java", "EvalIntfSuperDefault");
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "B.super.getOne()";
String result = doEval(thread, snippet).getValueString();
assertEquals("2", result);
}
finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a static method on an object generic statement
*
* @throws Exception
*/
public void testEvalStatictMethod() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTest18";
createLineBreakpoint(22, type);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "java.util.stream.Stream.of(1,2,3).count()";
IValue three = doEval(thread, snippet);
assertEquals("3", three.getValueString());
}
finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet containing a lambda
*
* @throws Exception
*/
public void testEvalLambda() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTest18";
IJavaLineBreakpoint bp = createLineBreakpoint(28, type);
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "l.stream().filter(i -> i > 2).count()";
IValue result = doEval(thread, snippet);
assertEquals("2", result.getValueString());
} finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet containing a lambda referencing a variable in a loop
*
* @throws Exception
*/
public void testEvalLambdaInLoop() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTest18";
IJavaLineBreakpoint bp = createLineBreakpoint(31, type);
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "l.stream().filter(j -> j > i+1).count()";
IValue result = doEval(thread, snippet);
assertEquals("2", result.getValueString());
} finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet containing a method reference
*
* @throws Exception
*/
public void testEvalMethodReference() throws Exception {
IJavaThread thread = null;
try {
String type = "EvalTest18";
IJavaLineBreakpoint bp = createLineBreakpoint(28, type);
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
String snippet = "l.stream().mapToInt(Integer::bitCount).sum()";
IValue result = doEval(thread, snippet);
assertEquals("5", result.getValueString());
} finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
/**
* Evaluates a snippet containing a method reference
*
* @throws Exception
*/
public void testContextEvaluations() throws Exception {
IJavaThread thread = null;
try {
String type = "FunctionalCaptureTest18";
ICompilationUnit cu = getType(type).getCompilationUnit();
String[] lines = new String(cu.getBuffer().getCharacters()).split("\n");
int i = 0;
for (; i < lines.length; ++i) {
if (lines[i].contains("/* CHECK EXPRESSIONS BELOW */")) break;
}
assertTrue("Missing source marker", i < lines.length);
IJavaLineBreakpoint bp = createLineBreakpoint(i, type);
assertNotNull("should have created breakpoint", bp);
thread = launchToBreakpoint(type);
assertNotNull("The program did not suspend", thread);
for (; i < lines.length; ++i) {
String line = lines[i];
if (line.contains("/* END OF TESTS */")) break;
if (line.trim().startsWith("/") || line.trim().isEmpty()) continue; // Comment, just skip it
if (line.contains("/* SKIP */")) continue;
int lastSemicolon = line.lastIndexOf(';');
assertTrue(lastSemicolon > 1);
String snippet = line.substring(0, lastSemicolon).trim();
//System.out.println("*******************: " + snippet);
IValue result = doEval(thread, snippet);
assertNotNull(result);
//System.out.println(">>>>>>>>>>>>>>>>>>>: " + result.getReferenceTypeName());
}
} finally {
removeAllBreakpoints();
terminateAndRemove(thread);
}
}
}