blob: 1a35ce407b1174618bc83ea926bca0e61df08a0d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Jesper Steen 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 Steen Møller - initial API and implementation
*******************************************************************************/
import java.util.Objects;
import java.util.function.Function;
public class FunctionalCaptureTest18 {
FunctionalCaptureTest18(int field) {
publicField = field;
}
public static void main(String[] args) {
new FunctionalCaptureTest18(1).runAssertions(1);
}
static <I, O> O assertFunctionalExpression(Function<I, O> functional, I input, O expected) {
O result = functional.apply(input);
if (!Objects.equals(result, expected)) {
throw new RuntimeException("Expected " + expected + ", got " + result);
}
return result;
}
@Override
public int hashCode() {
return 1992;
}
@Override
public boolean equals(Object obj) {
if (this == obj || obj == null)
return false;
return getClass() == obj.getClass();
}
final public int publicField;
private int privateField = 2;
public static int publicStaticField = 3;
private static int privateStaticField = 4;
public Integer publicMethod() {
return 5;
}
private Integer privateMethod() {
return 6;
}
public int publicArgMethod(int i) {
return i + 6;
}
private int privateArgMethod(int i) {
return i + 7;
}
public static int publicStaticMethod(int i) {
return i - 8;
}
private static int privateStaticMethod(int i) {
return i - 9;
}
public void runAssertions(int parameter /* = 1 */) {
int localConstI = -3;
System.out.println("Go!");
/* CHECK EXPRESSIONS BELOW */
/* Nothing captured */
assertFunctionalExpression(n -> -3, 42, -3);
assertFunctionalExpression(n -> n / 2 - 7, 10, -2);
/* Capture locals */
/* But not yet on project's types */
assertFunctionalExpression(n -> n + localConstI, 2, -1);
assertFunctionalExpression(n -> n - parameter, parameter, 0);
/* Capture instance fields */
/* But not yet on enclosing instance's instance fields */
assertFunctionalExpression(n -> n - publicField, 2, 1);
assertFunctionalExpression(n -> n - this.publicField, 2, 1);
assertFunctionalExpression(n -> n - privateField, 4, 2);/* SKIP */
assertFunctionalExpression(n -> n - this.privateField, 4, 2);/* SKIP */
/* Capture static fields */
/* But not yet on non-public fields */
assertFunctionalExpression(n -> n - publicStaticField, 6, 3);
assertFunctionalExpression(n -> n - privateStaticField, 8, 4);/* SKIP */
/* Evaluate unbound method references */
/* But not yet on project's non-public methods */
assertFunctionalExpression(FunctionalCaptureTest18::publicMethod, this, 5);
assertFunctionalExpression(FunctionalCaptureTest18::privateMethod, this, 6);/* SKIP */
/* Evaluate instance method references */
assertFunctionalExpression("Hello, "::concat, "World", "Hello, World");
/* But not yet this-references */
assertFunctionalExpression(this::publicArgMethod, 1, 7);
assertFunctionalExpression(this::privateArgMethod, 1, 8);/* SKIP */
/* Evaluate static method references */
assertFunctionalExpression(Integer::valueOf, "16", 16);
assertFunctionalExpression(FunctionalCaptureTest18::publicStaticMethod, 17, 9);
/* But not yet on project's non-public methods */
assertFunctionalExpression(FunctionalCaptureTest18::privateStaticMethod, 19, 10);/* SKIP */
/* Capture methods */
assertFunctionalExpression(s -> Integer.valueOf(s, 16), "0B", 11);
/* But not yet directlt on the instance */
assertFunctionalExpression(obj -> obj.publicMethod() + 7, this, 12);
assertFunctionalExpression(obj -> this.publicMethod() + 8, this, 13);
assertFunctionalExpression(obj -> publicMethod() + 8, this, 13);
assertFunctionalExpression(obj -> obj.privateMethod() + 8, this, 14);/* SKIP */
assertFunctionalExpression(obj -> this.privateMethod() + 9, this, 15);/* SKIP */
assertFunctionalExpression(obj -> privateMethod() + 9, this, 15);/* SKIP */
/* Constructor references */
assertFunctionalExpression(String::new, new char[] { 'a','b','c' }, "abc");
assertFunctionalExpression(FunctionalCaptureTest18::new, 42, new FunctionalCaptureTest18(42));
/* END OF TESTS */
System.out.println("OK");
}
}