Bug 562079 - Add unit tests for RemoteEvaluations

Change-Id: I6237533602fb1f1b3f74e06bada54c2a9f172673
Signed-off-by: gayanper <gayanper@gmail.com>
diff --git a/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java b/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java
new file mode 100644
index 0000000..fe4c53c
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/java8/RemoteEvaluator.java
@@ -0,0 +1,23 @@
+import java.util.Arrays;
+import java.util.function.Predicate;
+
+public class RemoteEvaluator {
+	public static final Predicate<String> P_EMPTY = s -> s.isEmpty();
+	
+	public static void main(String[] args) {
+		(new RemoteEvaluator()).exec();
+	}
+
+	public void exec() {
+		(new Inner()).run();
+	}
+	
+	class Inner {
+		private final Predicate<String> Q_EMPTY = s -> s.isEmpty();
+
+		public void run() {
+			String y = "111";
+			Arrays.asList("111", "222", "aaa").stream().filter(a -> a.equals(y)).count();
+		}
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
index 537c152..45a356c 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugTest.java
@@ -475,6 +475,7 @@
 				cfgs.add(createLaunchConfiguration(jp, "Bug560392"));
 				cfgs.add(createLaunchConfiguration(jp, "Bug561715"));
 				cfgs.add(createLaunchConfiguration(jp, "Bug562056"));
+				cfgs.add(createLaunchConfiguration(jp, "RemoteEvaluator"));
 	    		loaded18 = true;
 	    		waitForBuild();
 	        }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java
new file mode 100644
index 0000000..4ea3845
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/eval/RemoteEvaluatorTests.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Gayan Perera 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:
+ *     Gayan Perera - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.eval;
+
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.debug.core.IJavaThread;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+
+public class RemoteEvaluatorTests extends AbstractDebugTest {
+	private IJavaThread javaThread;
+
+	public RemoteEvaluatorTests(String name) {
+		super(name);
+	}
+
+	public void testEvaluate_InInnerScope_FieldInOuterScope() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 20);
+
+		String code = "java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> RemoteEvaluator.P_EMPTY.test(v)).count()";
+		IValue value = evaluate(code);
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+
+	public void testEvaluate_InOuterScope_FieldInSameScope() throws Exception {
+		debugWithBreakpoint("RemoteEvaluator", 12);
+		IValue value = evaluate("java.util.Arrays.asList(\"a\", \"b\", \"ac\").stream().filter(v -> RemoteEvaluator.P_EMPTY.test(v)).count()");
+
+		assertNotNull("result is null", value);
+		assertEquals("count is not 0", "0", value.getValueString());
+	}
+
+	@Override
+	protected IJavaProject getProjectContext() {
+		return get18Project();
+	}
+
+	private void debugWithBreakpoint(String testClass, int lineNumber) throws Exception {
+		createLineBreakpoint(lineNumber, testClass);
+		javaThread = launchToBreakpoint(testClass);
+		assertNotNull("The program did not suspend", javaThread);
+	}
+
+	private IValue evaluate(String snippet) throws Exception {
+		return doEval(javaThread, snippet);
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		try {
+			terminateAndRemove(javaThread);
+		} finally {
+			super.tearDown();
+			removeAllBreakpoints();
+		}
+	}
+}