Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>tags/V1_9_20
short MINOR_18 = 0; | short MINOR_18 = 0; | ||||
short MAJOR_19 = 63; | short MAJOR_19 = 63; | ||||
short MINOR_19 = 0; | short MINOR_19 = 0; | ||||
// short MAJOR_20 = 64; | |||||
// short MINOR_20 = 0; | |||||
short MAJOR_20 = 64; | |||||
short MINOR_20 = 0; | |||||
// short MAJOR_21 = 65; | |||||
// short MINOR_21 = 0; | |||||
int PREVIEW_MINOR_VERSION = 65535; | int PREVIEW_MINOR_VERSION = 65535; | ||||
static final String[] TARGET_INPUTS = new String[] { | static final String[] TARGET_INPUTS = new String[] { | ||||
"1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "9", | "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "9", | ||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19" | |||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" | |||||
}; | }; | ||||
static final String[] SOURCE_INPUTS = new String[] { | static final String[] SOURCE_INPUTS = new String[] { | ||||
"1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "9", | "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "9", | ||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19" | |||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" | |||||
}; | }; | ||||
static final String[] COMPLIANCE_INPUTS = new String[] { | static final String[] COMPLIANCE_INPUTS = new String[] { | ||||
"-1.3", "-1.4", "-1.5", "-1.6", "-1.7", "-1.8", "-1.9", "-9", | "-1.3", "-1.4", "-1.5", "-1.6", "-1.7", "-1.8", "-1.9", "-9", | ||||
"-10", "-11", "-12", "-13", "-14", "-15", "-16", "-17", "-18", "-19" | |||||
"-10", "-11", "-12", "-13", "-14", "-15", "-16", "-17", "-18", "-19", "-20" | |||||
}; | }; | ||||
private static final ICommandEditor COMMAND_EDITOR; | private static final ICommandEditor COMMAND_EDITOR; |
@Override | @Override | ||||
public void setUp() throws Exception { | public void setUp() throws Exception { | ||||
// Activate this block after upgrading to JDT Core Java 20 | // Activate this block after upgrading to JDT Core Java 20 | ||||
/* | |||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
"These tests need a Java 19 level AspectJ compiler " + | "These tests need a Java 19 level AspectJ compiler " + | ||||
"(e.g. because they use version-specific preview features). " + | "(e.g. because they use version-specific preview features). " + | ||||
"This compiler does not support preview features of a previous version anymore." | "This compiler does not support preview features of a previous version anymore." | ||||
); | ); | ||||
*/ | |||||
// Activate this block before upgrading to JDT Core Java 20 | // Activate this block before upgrading to JDT Core Java 20 | ||||
/* | |||||
if (!LangUtil.is19VMOrGreater() || LangUtil.is20VMOrGreater()) { | if (!LangUtil.is19VMOrGreater() || LangUtil.is20VMOrGreater()) { | ||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
"These tests should be run on Java 19 only " + | "These tests should be run on Java 19 only " + | ||||
); | ); | ||||
} | } | ||||
super.setUp(); | super.setUp(); | ||||
*/ | |||||
} | } | ||||
} | } |
/* ******************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. | |||||
* This program and the accompanying materials are made available | |||||
* under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
* ******************************************************************/ | |||||
package org.aspectj.testing; | |||||
import org.aspectj.util.LangUtil; | |||||
/** | |||||
* Makes sure tests are running on the right level of JDK. | |||||
* | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public abstract class XMLBasedAjcTestCaseForJava20Only extends XMLBasedAjcTestCase { | |||||
@Override | |||||
public void setUp() throws Exception { | |||||
// Activate this block after upgrading to JDT Core Java 21 | |||||
/* | |||||
throw new IllegalStateException( | |||||
"These tests need a Java 20 level AspectJ compiler " + | |||||
"(e.g. because they use version-specific preview features). " + | |||||
"This compiler does not support preview features of a previous version anymore." | |||||
); | |||||
*/ | |||||
// Activate this block before upgrading to JDT Core Java 21 | |||||
if (!LangUtil.is20VMOrGreater() || LangUtil.is21VMOrGreater()) { | |||||
throw new IllegalStateException( | |||||
"These tests should be run on Java 20 only " + | |||||
"(e.g. because they use version-specific preview features)" | |||||
); | |||||
} | |||||
super.setUp(); | |||||
} | |||||
} |
/* ******************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. | |||||
* This program and the accompanying materials are made available | |||||
* under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
* ******************************************************************/ | |||||
package org.aspectj.testing; | |||||
import org.aspectj.util.LangUtil; | |||||
/** | |||||
* Makes sure tests are running on the right level of JDK. | |||||
* | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public abstract class XMLBasedAjcTestCaseForJava20OrLater extends XMLBasedAjcTestCase { | |||||
@Override | |||||
public void setUp() throws Exception { | |||||
if (!LangUtil.is20VMOrGreater()) | |||||
throw new IllegalStateException("These tests should be run on Java 20 or later"); | |||||
super.setUp(); | |||||
} | |||||
} |
/** | /** | ||||
* This was not working as expected in ECJ after the initial Java 19 merge the JDT Core main line, | |||||
* This was not working as expected in ECJ after the initial Java 19 merge from the JDT Core main line, | |||||
* see https://github.com/eclipse-jdt/eclipse.jdt.core/issues/450. | * see https://github.com/eclipse-jdt/eclipse.jdt.core/issues/450. | ||||
*/ | */ | ||||
public class RecordPatternsPreview1Error { | public class RecordPatternsPreview1Error { |
doSomething(p2); | doSomething(p2); | ||||
} | } | ||||
public static void doSomething(Pair pair) { | |||||
public static void doSomething(Pair<I> pair) { | |||||
System.out.println(pair.toString().replaceAll("@[0-9a-f]+", "@000")); | System.out.println(pair.toString().replaceAll("@[0-9a-f]+", "@000")); | ||||
} | } | ||||
before(Pair pair) : execution(* doSomething(Pair)) && args(pair) { | |||||
before(Pair<I> pair) : execution(* doSomething(Pair)) && args(pair) { | |||||
switch (pair) { | switch (pair) { | ||||
case Pair<I>(I i, C c) -> System.out.println("x"); | case Pair<I>(I i, C c) -> System.out.println("x"); | ||||
case Pair<I>(I i, D d) -> System.out.println("y"); | case Pair<I>(I i, D d) -> System.out.println("y"); | ||||
// TODO: Remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 | |||||
// has been fixed. But even with the default clause, it generates wrong byte code and throws runtime error: | |||||
// NoSuchMethodError: 'I Pair.x()' | |||||
// TODO: Remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed | |||||
default -> System.out.println("z"); | default -> System.out.println("z"); | ||||
} | } | ||||
case Pair<I>(C c, I i) -> System.out.println("a"); | case Pair<I>(C c, I i) -> System.out.println("a"); | ||||
case Pair<I>(D d, C c) -> System.out.println("b"); | case Pair<I>(D d, C c) -> System.out.println("b"); | ||||
case Pair<I>(D d1, D d2) -> System.out.println("c"); | case Pair<I>(D d1, D d2) -> System.out.println("c"); | ||||
// TODO: remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 | |||||
// has been fixed. But even with the default clause, it generates wrong byte code and throws runtime error: | |||||
// NoSuchMethodError: 'I Pair.x()' | |||||
// TODO: remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed | |||||
default -> System.out.println("d"); | default -> System.out.println("d"); | ||||
} | } | ||||
} | } |
switch (p2) { | switch (p2) { | ||||
case Pair<I>(I i, C c) -> System.out.println("x"); | case Pair<I>(I i, C c) -> System.out.println("x"); | ||||
case Pair<I>(I i, D d) -> System.out.println("y"); | case Pair<I>(I i, D d) -> System.out.println("y"); | ||||
// TODO: Remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed | |||||
default -> System.out.println("z"); | |||||
} | } | ||||
switch (p2) { | switch (p2) { | ||||
case Pair<I>(C c, I i) -> System.out.println("a"); | case Pair<I>(C c, I i) -> System.out.println("a"); | ||||
case Pair<I>(D d, C c) -> System.out.println("b"); | case Pair<I>(D d, C c) -> System.out.println("b"); | ||||
case Pair<I>(D d1, D d2) -> System.out.println("c"); | case Pair<I>(D d1, D d2) -> System.out.println("c"); | ||||
// TODO: remove redundant default clause when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed | |||||
default -> System.out.println("d"); | |||||
} | } | ||||
} | } | ||||
} | } |
/** | |||||
* This used to work up to preview 3 (Java 19), but no longer in preview 4 (Java 20). | |||||
* Now, the default case seems to need to be the last one in the list. | |||||
* | |||||
* Javac says 4x: "this case label is dominated by a preceding case label" | |||||
* | |||||
* ECJ/AJC says 11x: "This case label is dominated by one of the preceding case label" (yes, "label" singular) | |||||
* See https://github.com/eclipse-jdt/eclipse.jdt.core/issues/919. | |||||
*/ | |||||
public class SwitchPatternPreview4Error { | |||||
static void defaultCanAppearBeforePattern(Integer i) { | |||||
switch (i) { | |||||
case null -> System.out.println("value unavailable: " + i); | |||||
case -1, 1 -> System.out.println("absolute value 1: " + i); | |||||
default -> System.out.println("other integer: " + i); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + i); | |||||
} | |||||
} | |||||
static void defaultCanAppearBeforeNull(Integer i) { | |||||
switch (i) { | |||||
case -1, 1 -> System.out.println("absolute value 1: " + i); | |||||
default -> System.out.println("other integer: " + i); | |||||
case null -> System.out.println("value unavailable: " + i); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + i); | |||||
} | |||||
} | |||||
static void defaultCanAppearBeforeConstantLabel(Integer i) { | |||||
switch (i) { | |||||
case null -> System.out.println("value unavailable: " + i); | |||||
default -> System.out.println("other integer: " + i); | |||||
case -1, 1 -> System.out.println("absolute value 1: " + i); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + i); | |||||
} | |||||
} | |||||
} |
import java.util.List; | |||||
import java.util.Locale; | |||||
/** | |||||
* Inspired by examples in https://openjdk.org/jeps/427 | |||||
*/ | |||||
public class SwitchPatternPreview4OK { | |||||
public static void main(String[] args) { | |||||
System.out.println(formatterPatternSwitch(null)); | |||||
System.out.println(formatterPatternSwitch(123)); | |||||
System.out.println(formatterPatternSwitch(999L)); | |||||
System.out.println(formatterPatternSwitch(12.34)); | |||||
System.out.println(formatterPatternSwitch("foo")); | |||||
System.out.println(formatterPatternSwitch(List.of(123, "foo", 999L, 12.34))); | |||||
System.out.println(testCircle(new Rectangle())); | |||||
System.out.println(testCircle(new Circle(5))); | |||||
System.out.println(testCircle(new Circle(6))); | |||||
System.out.println(testSealedCoverage(new A())); | |||||
System.out.println(testSealedCoverage(new B())); | |||||
System.out.println(testSealedCoverage(new C(5))); | |||||
// constantLabelMustAppearBeforePattern(-1); | |||||
// constantLabelMustAppearBeforePattern(0); | |||||
// constantLabelMustAppearBeforePattern(42); | |||||
// constantLabelMustAppearBeforePattern(-99); | |||||
// constantLabelMustAppearBeforePattern(Integer.valueOf(123)); | |||||
// constantLabelMustAppearBeforePattern(null); | |||||
constantLabelMustAppearBeforePatternInteger(-1); | |||||
constantLabelMustAppearBeforePatternInteger(0); | |||||
constantLabelMustAppearBeforePatternInteger(42); | |||||
constantLabelMustAppearBeforePatternInteger(-99); | |||||
constantLabelMustAppearBeforePatternInteger(Integer.valueOf(123)); | |||||
constantLabelMustAppearBeforePatternInteger(null); | |||||
// System.out.println(testGenericSealedExhaustive(new E<Integer>())); | |||||
} | |||||
static String formatterPatternSwitch(Object o) { | |||||
return switch (o) { | |||||
case null -> "null"; | |||||
case Integer i -> String.format("int %d", i); | |||||
case Long l -> String.format("long %d", l); | |||||
case Double d -> String.format(Locale.ENGLISH, "double %f", d); | |||||
case String s -> String.format("String %s", s); | |||||
default -> o.toString(); | |||||
}; | |||||
} | |||||
static class Shape {} | |||||
static class Rectangle extends Shape {} | |||||
static class Circle extends Shape { | |||||
private final double radius; | |||||
public Circle(double radius) { this.radius = radius; } | |||||
double calculateArea() { return Math.PI * radius * radius; } | |||||
} | |||||
static String testCircle(Shape s) { | |||||
return switch (s) { | |||||
case Circle c when (c.calculateArea() > 100) -> "Large circle"; | |||||
case Circle c -> "Small circle"; | |||||
default -> "Non-circle"; | |||||
}; | |||||
} | |||||
sealed interface S permits A, B, C {} | |||||
final static class A implements S {} | |||||
final static class B implements S {} | |||||
static record C(int i) implements S {} // Implicitly final | |||||
static String testSealedCoverage(S s) { | |||||
return switch (s) { | |||||
case A a -> "Sealed sub-class A"; | |||||
case B b -> "Sealed sub-class B"; | |||||
case C c -> "Sealed sub-record C"; | |||||
}; | |||||
} | |||||
/** | |||||
* According to an example from JEP 420, this should work, but it does not, neither with Javac nor ECJ. | |||||
* | |||||
* See: | |||||
* https://openjdk.java.net/jeps/420#1b--Dominance-of-pattern-labels | |||||
* https://bugs.openjdk.java.net/browse/JDK-8273326 | |||||
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=579355 | |||||
* | |||||
* TODO: reactivate when implemented or move to preview 5 with Java 21, Eclipse 4.28. | |||||
*/ | |||||
/* | |||||
static String constantLabelMustAppearBeforePattern(Object o) { | |||||
switch (o) { | |||||
case null -> System.out.println("value unavailable: " + o); | |||||
case -1, 1 -> System.out.println("special case:" + o); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + o); | |||||
case Integer i -> System.out.println("other integer: " + o); | |||||
default -> System.out.println("non-integer: " + o); | |||||
} | |||||
return o == null ? "null" : o.toString(); | |||||
} | |||||
*/ | |||||
static String constantLabelMustAppearBeforePatternInteger(Integer i) { | |||||
switch (i) { | |||||
case null -> System.out.println("value unavailable: " + i); | |||||
case -1, 1 -> System.out.println("absolute value 1: " + i); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + i); | |||||
default -> System.out.println("other integer: " + i); | |||||
} | |||||
return i == null ? "null" : i.toString(); | |||||
} | |||||
static void nullCanAppearAfterConstantLabel(Integer i) { | |||||
switch (i) { | |||||
case -1, 1 -> System.out.println("absolute value 1: " + i); | |||||
case null -> System.out.println("value unavailable: " + i); | |||||
case Integer value when value > 0 -> System.out.println("positive integer: " + i); | |||||
default -> System.out.println("other integer: " + i); | |||||
} | |||||
} | |||||
/** | |||||
* According to an example from JEP 420, this should work with preview 2 (Java 18), and it does with Javac, | |||||
* but not with ECJ for Java 18, 19 and 20. | |||||
* | |||||
* See: | |||||
* https://openjdk.java.net/jeps/420#2--Exhaustiveness-of-switch-expressions-and-statements | |||||
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=579360 | |||||
* https://github.com/eclipse-jdt/eclipse.jdt.core/issues/587 | |||||
* | |||||
* TODO: reactivate when implemented or move to preview 5 with Java 21. | |||||
*/ | |||||
/* | |||||
sealed interface I<T> permits D, E {} | |||||
final static class D<X> implements I<String> {} | |||||
final static class E<Y> implements I<Y> {} | |||||
static int testGenericSealedExhaustive(I<Integer> i) { | |||||
return switch (i) { | |||||
// Exhaustive as no D case possible! | |||||
case E<Integer> bi -> 42; | |||||
}; | |||||
} | |||||
*/ | |||||
} |
suite.addTest(Ajc1919TestsJava.suite()); | suite.addTest(Ajc1919TestsJava.suite()); | ||||
} | } | ||||
// Do not run tests using a previous compiler's preview features anymore. They would all fail. | // Do not run tests using a previous compiler's preview features anymore. They would all fail. | ||||
// TODO: Comment out the following block when upgrading JDT Core to Java 20 | |||||
/* | |||||
if (LangUtil.is19VMOrGreater() && !LangUtil.is20VMOrGreater()) { | if (LangUtil.is19VMOrGreater() && !LangUtil.is20VMOrGreater()) { | ||||
suite.addTest(Java19PreviewFeaturesTests.suite()); | suite.addTest(Java19PreviewFeaturesTests.suite()); | ||||
} | } | ||||
*/ | |||||
return suite; | return suite; | ||||
} | } | ||||
} | } |
/******************************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. This program and the accompanying materials | |||||
* are made available under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution, and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
*******************************************************************************/ | |||||
package org.aspectj.systemtest.ajc1920; | |||||
import junit.framework.Test; | |||||
import org.aspectj.testing.XMLBasedAjcTestCase; | |||||
import org.aspectj.testing.XMLBasedAjcTestCaseForJava20OrLater; | |||||
/** | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public class Ajc1920TestsJava extends XMLBasedAjcTestCaseForJava20OrLater { | |||||
public void testDummyJava20() { | |||||
//runTest("dummy Java 20"); | |||||
} | |||||
public static Test suite() { | |||||
return XMLBasedAjcTestCase.loadSuite(Ajc1920TestsJava.class); | |||||
} | |||||
@Override | |||||
protected java.net.URL getSpecFile() { | |||||
return getClassResource("ajc1920.xml"); | |||||
} | |||||
} |
/******************************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. This program and the accompanying materials | |||||
* are made available under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution, and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
*******************************************************************************/ | |||||
package org.aspectj.systemtest.ajc1920; | |||||
import junit.framework.Test; | |||||
import junit.framework.TestSuite; | |||||
import org.aspectj.util.LangUtil; | |||||
/** | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public class AllTestsAspectJ1920 { | |||||
public static Test suite() { | |||||
TestSuite suite = new TestSuite("AspectJ 1.9.20 tests"); | |||||
suite.addTest(Bugs1920Tests.suite()); | |||||
if (LangUtil.is20VMOrGreater()) { | |||||
suite.addTest(SanityTestsJava20.suite()); | |||||
suite.addTest(Ajc1920TestsJava.suite()); | |||||
} | |||||
// Do not run tests using a previous compiler's preview features anymore. They would all fail. | |||||
// TODO: Comment out the following block when upgrading JDT Core to Java 20 | |||||
if (LangUtil.is20VMOrGreater() && !LangUtil.is21VMOrGreater()) { | |||||
suite.addTest(Java20PreviewFeaturesTests.suite()); | |||||
} | |||||
return suite; | |||||
} | |||||
} |
/******************************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. This program and the accompanying materials | |||||
* are made available under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution, and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
*******************************************************************************/ | |||||
package org.aspectj.systemtest.ajc1920; | |||||
import junit.framework.Test; | |||||
import org.aspectj.testing.XMLBasedAjcTestCase; | |||||
/** | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public class Bugs1920Tests extends XMLBasedAjcTestCase { | |||||
public void testDummyJava20() { | |||||
//runTest("dummy Java 20"); | |||||
} | |||||
public static Test suite() { | |||||
return XMLBasedAjcTestCase.loadSuite(Bugs1920Tests.class); | |||||
} | |||||
@Override | |||||
protected java.net.URL getSpecFile() { | |||||
return getClassResource("ajc1920.xml"); | |||||
} | |||||
} |
/******************************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. This program and the accompanying materials | |||||
* are made available under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution, and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
*******************************************************************************/ | |||||
package org.aspectj.systemtest.ajc1920; | |||||
import junit.framework.Test; | |||||
import org.aspectj.apache.bcel.Constants; | |||||
import org.aspectj.testing.XMLBasedAjcTestCase; | |||||
import org.aspectj.testing.XMLBasedAjcTestCaseForJava20Only; | |||||
/** | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public class Java20PreviewFeaturesTests extends XMLBasedAjcTestCaseForJava20Only { | |||||
public void testSwitchPatternMatchingPreview4Java() { | |||||
runTest("switch pattern matching preview 4 java"); | |||||
checkVersion("SwitchPatternPreview4OK", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
} | |||||
public void testSwitchPatternMatchingPreview4Error() { | |||||
runTest("switch pattern matching preview 4 error"); | |||||
} | |||||
public void testSwitchPatternMatchingPreview3Aspect() { | |||||
runTest("switch pattern matching preview 3 aspect"); | |||||
checkVersion("SwitchPatternPreview3Aspect", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
checkVersion("Application", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
checkVersion("Shape", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
checkVersion("S", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
} | |||||
public void testSwitchPatternMatchingCaseLabelDominatedByPrecedingError() { | |||||
runTest("switch pattern matching error"); | |||||
} | |||||
public void testSwitchPatternMatchingPreview3Error1() { | |||||
runTest("switch pattern matching preview 3 error 1"); | |||||
} | |||||
public void testSwitchPatternMatchingPreview3Error2() { | |||||
runTest("switch pattern matching preview 3 error 2"); | |||||
} | |||||
public void testRecordPatternsPreview1OK() { | |||||
// https://github.com/eclipse-jdt/eclipse.jdt.core/issues/450 | |||||
runTest("record patterns"); | |||||
} | |||||
public void testRecordPatternsPreview1Error() { | |||||
// https://github.com/eclipse-jdt/eclipse.jdt.core/issues/450 (fixed for preview 2 in Eclipse 2033-03, 4.27) | |||||
runTest("record patterns error"); | |||||
checkVersion("RecordPatternsPreview1Error", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
checkVersion("Box", Constants.MAJOR_20, Constants.PREVIEW_MINOR_VERSION); | |||||
} | |||||
public void testRecordPatternsPreview1ExhaustivenessOK1() { | |||||
// Falsely throws 'An enhanced switch statement should be exhaustive; a default label expected' twice, | |||||
// see https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 | |||||
// TODO: Remove redundant default clauses when fixed upstream | |||||
System.out.println("TODO: fully activate when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed"); | |||||
runTest("record patterns exhaustiveness 1"); | |||||
} | |||||
public void testRecordPatternsPreview1Aspect() { | |||||
runTest("record patterns aspect"); | |||||
} | |||||
public void testRecordPatternsPreview1ExhaustivenessAspect() { | |||||
// Falsely throws 'An enhanced switch statement should be exhaustive; a default label expected' twice, | |||||
// see https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 | |||||
// TODO: Remove redundant default clauses when fixed upstream | |||||
System.out.println("TODO: fully activate when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed"); | |||||
runTest("record patterns exhaustiveness aspect"); | |||||
} | |||||
public void testRecordPatternsPreview1ExhaustivenessError() { | |||||
// See https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 | |||||
runTest("record patterns exhaustiveness error"); | |||||
} | |||||
public void testRecordPatternsPreview1ExhaustivenessOK2() { | |||||
// Falsely throws 'An enhanced switch statement should be exhaustive; a default label expected', | |||||
// see https://github.com/eclipse-jdt/eclipse.jdt.core/issues/398 | |||||
// TODO: activate when fixed | |||||
System.out.println("TODO: activate when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/398 has been fixed"); | |||||
//runTest("record patterns exhaustiveness 2"); | |||||
} | |||||
public static Test suite() { | |||||
return XMLBasedAjcTestCase.loadSuite(Java20PreviewFeaturesTests.class); | |||||
} | |||||
@Override | |||||
protected java.net.URL getSpecFile() { | |||||
return getClassResource("ajc1920.xml"); | |||||
} | |||||
} |
/******************************************************************************* | |||||
* Copyright (c) 2022 Contributors | |||||
* All rights reserved. This program and the accompanying materials | |||||
* are made available under the terms of the Eclipse Public License v 2.0 | |||||
* which accompanies this distribution, and is available at | |||||
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt | |||||
*******************************************************************************/ | |||||
package org.aspectj.systemtest.ajc1920; | |||||
import junit.framework.Test; | |||||
import org.aspectj.testing.XMLBasedAjcTestCase; | |||||
import org.aspectj.testing.XMLBasedAjcTestCaseForJava20OrLater; | |||||
/* | |||||
* Some very trivial tests that help verify things are OK. | |||||
* These are a copy of the earlier Sanity Tests created for 1.6 but these supply the -20 option | |||||
* to check code generation and modification with that version specified. | |||||
* | |||||
* @author Alexander Kriegisch | |||||
*/ | |||||
public class SanityTestsJava20 extends XMLBasedAjcTestCaseForJava20OrLater { | |||||
public static final int bytecode_version_for_JDK_level = 64; | |||||
// Incredibly trivial test programs that check the compiler works at all (these are easy-ish to debug) | |||||
public void testSimpleJava_A() { | |||||
runTest("simple - a"); | |||||
} | |||||
public void testSimpleJava_B() { | |||||
runTest("simple - b"); | |||||
} | |||||
public void testSimpleCode_C() { | |||||
runTest("simple - c"); | |||||
} | |||||
public void testSimpleCode_D() { | |||||
runTest("simple - d"); | |||||
} | |||||
public void testSimpleCode_E() { | |||||
runTest("simple - e"); | |||||
} | |||||
public void testSimpleCode_F() { | |||||
runTest("simple - f"); | |||||
} | |||||
public void testSimpleCode_G() { | |||||
runTest("simple - g"); | |||||
} | |||||
public void testSimpleCode_H() { | |||||
runTest("simple - h", true); | |||||
} | |||||
public void testSimpleCode_I() { | |||||
runTest("simple - i"); | |||||
} | |||||
public void testVersionCorrect1() { | |||||
runTest("simple - j"); | |||||
checkVersion("A", bytecode_version_for_JDK_level, 0); | |||||
} | |||||
public void testVersionCorrect2() { | |||||
runTest("simple - k"); | |||||
checkVersion("A", bytecode_version_for_JDK_level, 0); | |||||
} | |||||
public void testVersionCorrect4() { | |||||
runTest("simple - m"); | |||||
// Must be 49.0 when -1.5 is specified | |||||
checkVersion("A", 49, 0); | |||||
} | |||||
public static Test suite() { | |||||
return XMLBasedAjcTestCase.loadSuite(SanityTestsJava20.class); | |||||
} | |||||
@Override | |||||
protected java.net.URL getSpecFile() { | |||||
return getClassResource("sanity-tests-20.xml"); | |||||
} | |||||
} |
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd"[]> | |||||
<!-- | |||||
Java 20: no new final language features, only preview/incubator ones: | |||||
- "JEP 432: Record Patterns (Second Preview)" (###) | |||||
- "JEP 433: Pattern Matching for switch (Fourth Preview)" (###) | |||||
- "JEP 429: Scoped Values (Incubator)" (API only) | |||||
- "JEP 436: Virtual Threads (Second Preview)" (API only) | |||||
- "JEP 437: Structured Concurrency (Second Incubator)" (API only) | |||||
--> | |||||
<suite> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features1920/java20" vm="20" title="switch pattern matching preview 4 java"> | |||||
<compile files="SwitchPatternPreview4OK.java" options="--enable-preview -20" /> | |||||
<run class="SwitchPatternPreview4OK" vmargs="--enable-preview"> | |||||
<message></message> | |||||
<stdout> | |||||
<line text="null" /> | |||||
<line text="int 123" /> | |||||
<line text="long 999" /> | |||||
<line text="double 12.340000" /> | |||||
<line text="String foo" /> | |||||
<line text="[123, foo, 999, 12.34]" /> | |||||
<line text="Non-circle" /> | |||||
<line text="Small circle" /> | |||||
<line text="Large circle" /> | |||||
<line text="Sealed sub-class A" /> | |||||
<line text="Sealed sub-class B" /> | |||||
<line text="Sealed sub-record C" /> | |||||
<line text="absolute value 1: -1" /> | |||||
<line text="other integer: 0" /> | |||||
<line text="positive integer: 42" /> | |||||
<line text="other integer: -99" /> | |||||
<line text="positive integer: 123" /> | |||||
<line text="value unavailable: null" /> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features1920/java20" vm="20" title="switch pattern matching preview 4 error"> | |||||
<compile files="SwitchPatternPreview4Error.java" options="--enable-preview -20"> | |||||
<!-- TODO: Add correct compiler error message, as soon as JDT Core supports it --> | |||||
<message kind="error" file="SwitchPatternPreview4Error.java" text="This case label is dominated by one of the preceding case label"/> | |||||
</compile> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="switch pattern matching preview 3 aspect"> | |||||
<compile files="SwitchPatternPreview3Aspect.aj" options="--enable-preview -20" /> | |||||
<run class="Application" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="null" /> | |||||
<line text="int 123" /> | |||||
<line text="long 999" /> | |||||
<line text="double 12.340000" /> | |||||
<line text="String foo" /> | |||||
<line text="[123, foo, 999, 12.34]" /> | |||||
<line text="Non-circle" /> | |||||
<line text="Small circle" /> | |||||
<line text="Large circle" /> | |||||
<line text="Sealed sub-class A" /> | |||||
<line text="Sealed sub-class B" /> | |||||
<line text="Sealed sub-record C" /> | |||||
<line text="absolute value 1: -1" /> | |||||
<line text="other integer: 0" /> | |||||
<line text="positive integer: 42" /> | |||||
<line text="other integer: -99" /> | |||||
<line text="positive integer: 123" /> | |||||
<line text="value unavailable: null" /> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features198/java17" vm="20" title="switch pattern matching error"> | |||||
<compile files="SwitchPatternError.java" options="--enable-preview -20"> | |||||
<!-- TODO: Add correct compiler error message, as soon as JDT Core supports it --> | |||||
<message kind="error" file="SwitchPatternError.java" text="This case label is dominated by one of the preceding case label"/> | |||||
</compile> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="switch pattern matching preview 3 error 1"> | |||||
<compile files="SwitchPatternPreview3Error1.java" options="--enable-preview -20"> | |||||
<!-- TODO: Add correct compiler error message, as soon as JDT Core supports it --> | |||||
<message kind="error" file="SwitchPatternPreview3Error1.java" text="This case label is dominated by one of the preceding case label"/> | |||||
</compile> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 17, 18, 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="switch pattern matching preview 3 error 2"> | |||||
<compile files="SwitchPatternPreview3Error2.java" options="--enable-preview -20"> | |||||
<!-- TODO: Add correct compiler error message, as soon as JDT Core supports it --> | |||||
<message kind="error" file="SwitchPatternPreview3Error2.java" text="This case label is dominated by one of the preceding case label"/> | |||||
</compile> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns"> | |||||
<compile files="RecordPatternsPreview1OK.java" options="--enable-preview -20"/> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns error"> | |||||
<compile files="RecordPatternsPreview1Error.java" options="--enable-preview -20"> | |||||
<!-- https://github.com/eclipse-jdt/eclipse.jdt.core/issues/450 (fixed for preview 2 in Eclipse 2033-03, 4.27) --> | |||||
<!-- | |||||
<message kind="error" file="RecordPatternsPreview1Error.java" text="Raw types are not allowed in record patterns"/> | |||||
<message kind="error" file="RecordPatternsPreview1Error.java" text="Raw types are not allowed in record patterns"/> | |||||
--> | |||||
</compile> | |||||
<run class="RecordPatternsPreview1Error" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="I'm a box"/> | |||||
<line text="I'm a box"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns exhaustiveness 1"> | |||||
<compile files="RecordPatternsPreview1ExhaustivenessOK1.java" options="--enable-preview -20"/> | |||||
<run class="RecordPatternsPreview1ExhaustivenessOK1" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="y"/> | |||||
<line text="a"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns exhaustiveness aspect"> | |||||
<compile files="RecordPatternsPreview1ExhaustivenessAspect.aj" options="--enable-preview -20"/> | |||||
<!-- TODO: Remove redundant default clauses when https://github.com/eclipse-jdt/eclipse.jdt.core/issues/455 has been fixed --> | |||||
<run class="RecordPatternsPreview1ExhaustivenessAspect" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="y"/> | |||||
<line text="a"/> | |||||
<line text="Pair[x=C@000, y=D@000]"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns aspect"> | |||||
<compile files="RecordPatternsPreview1Aspect.aj" options="--enable-preview -20"/> | |||||
<run class="RecordPatternsPreview1Aspect" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="9"/> | |||||
<line text="14"/> | |||||
<line text="Doing something with Point[x=2, y=7]"/> | |||||
<line text="Upper-left color: RED"/> | |||||
<line text="Upper-left color: RED"/> | |||||
<line text="Upper-left x coordinate: 1"/> | |||||
<line text="Doing something with Rectangle[upperLeft=ColoredPoint[p=Point[x=1, y=6], c=RED], lowerRight=ColoredPoint[p=Point[x=4, y=6], c=BLUE]]"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns exhaustiveness error"> | |||||
<compile files="RecordPatternsPreview1ExhaustivenessError.java" options="--enable-preview -20"> | |||||
<message kind="error" file="RecordPatternsPreview1ExhaustivenessError.java" text="An enhanced switch statement should be exhaustive; a default label expected"/> | |||||
</compile> | |||||
</ajc-test> | |||||
<!-- Java ?? final, Java 19, 20 preview --> | |||||
<ajc-test dir="features1919/java19" vm="20" title="record patterns exhaustiveness 2"> | |||||
<compile files="RecordPatternsPreview1ExhaustivenessOK2.java" options="--enable-preview -20"/> | |||||
<run class="RecordPatternsPreview1ExhaustivenessOK2" vmargs="--enable-preview"> | |||||
<stdout> | |||||
<line text="Bob 12"/> | |||||
</stdout> | |||||
</run> | |||||
</ajc-test> | |||||
</suite> |
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd"[]> | |||||
<suite> | |||||
<!-- empty class --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - a"> | |||||
<compile files="SimpleA.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- class with one method --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - b"> | |||||
<compile files="SimpleB.java" options="-20"/> | |||||
<run class="SimpleB"/> | |||||
</ajc-test> | |||||
<!-- empty aspect --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - c"> | |||||
<compile files="SimpleC.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- simple before --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - d"> | |||||
<compile files="SimpleD.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- simple itd field --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - e"> | |||||
<compile files="SimpleE.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- aspect with main calling a static method --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - f"> | |||||
<compile files="SimpleF.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- pertarget --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - g"> | |||||
<compile files="SimpleG.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- generic ctor itds --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - h"> | |||||
<compile files="SimpleH.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- overriding generic itd methods --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - i"> | |||||
<compile files="SimpleI.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- check class file version is 64.0 (Java 20) --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - j"> | |||||
<compile files="SimpleJ.java" options="-20"/> | |||||
</ajc-test> | |||||
<!-- check class file version is 64.0 (Java 20) --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - k"> | |||||
<compile files="SimpleJ.java" options="-source 20"/> | |||||
</ajc-test> | |||||
<!-- check class file version is 49.0 --> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - m"> | |||||
<compile files="SimpleJ.java" options="-1.5"/> | |||||
</ajc-test> | |||||
<ajc-test dir="bugs160/simplejava" title="simple - n"> | |||||
<compile files="SimpleN.java" options="-20"/> | |||||
</ajc-test> | |||||
</suite> |
return 20 <= vmVersion; | return 20 <= vmVersion; | ||||
} | } | ||||
public static boolean is21VMOrGreater() { | |||||
return 21 <= vmVersion; | |||||
} | |||||
/** | /** | ||||
* Shorthand for "if null, throw IllegalArgumentException" | * Shorthand for "if null, throw IllegalArgumentException" | ||||
* | * |