From 8c72d2da438d06885d48ffd3ade30b89a782b874 Mon Sep 17 00:00:00 2001 From: Alexander Kriegisch Date: Sun, 10 Dec 2023 16:55:33 +0700 Subject: [PATCH] Add tests for Java 21 unnamed patterns TODO: Activate after https://github.com/eclipse-jdt/eclipse.jdt.core/issues/893 is done. Signed-off-by: Alexander Kriegisch --- .../java21/UnnamedPatternsPreview1.java | 85 ++++++++++++++++++ .../java21/UnnamedPatternsPreview1Aspect.aj | 89 +++++++++++++++++++ .../ajc1921/Java21PreviewFeaturesTests.java | 22 +++++ .../aspectj/systemtest/ajc1921/ajc1921.xml | 41 +++++++++ 4 files changed, 237 insertions(+) create mode 100644 tests/features1921/java21/UnnamedPatternsPreview1.java create mode 100644 tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj diff --git a/tests/features1921/java21/UnnamedPatternsPreview1.java b/tests/features1921/java21/UnnamedPatternsPreview1.java new file mode 100644 index 000000000..badb34c5c --- /dev/null +++ b/tests/features1921/java21/UnnamedPatternsPreview1.java @@ -0,0 +1,85 @@ +import java.awt.*; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Examples taken from JEP 443 + */ +public class UnnamedPatternsPreview1 { + public static void main(String[] args) { + // An enhanced for loop with side effects + int acc = 0; + final int LIMIT = 2; + for (Order _ : List.of(new Order(), new Order(), new Order())) { + if (acc < LIMIT) + acc++; + } + System.out.println(acc); + + // The initialisation of a basic for loop can declare unnamed local variables + for (int i = 0, _ = sideEffect(); i < 2; i++) { + System.out.println(i); + } + + // An assignment statement, where the result of the expression on the right hand side is not needed + Queue q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var y = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, y)); + } + + // The same unnamed variable name '_' can be used in multiple assignment statements + q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var _ = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, 0)); + } + + // Unnamed variables can be used in one or multiple catch blocks + String s = "123xy"; + try { + int i = Integer.parseInt(s); + System.out.println(i); + } catch (NumberFormatException _) { + System.out.println("Bad number: " + s); + } catch (Exception _) { + System.out.println("Unexpected error"); + } + + // Try with resources + try (var _ = ScopedContext.acquire()) { + System.out.println("Doing something within scoped context"); + } + + // A lambda whose parameter is irrelevant + System.out.println( + Stream.of("one", "two", "three") + .collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA")) + ); + } + + static int sideEffect() { + System.out.println("side effect"); + return 42; + } + + static class Order {} + + static class ScopedContext implements AutoCloseable { + public static ScopedContext acquire() { + return new ScopedContext(); + } + + @Override + public void close() { + System.out.println("Closing scoped context"); + } + } +} diff --git a/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj b/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj new file mode 100644 index 000000000..d224a94fc --- /dev/null +++ b/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj @@ -0,0 +1,89 @@ +import java.awt.*; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Examples taken from JEP 443 + */ +public class UnnamedPatternsPreview1Aspect { + public static void main(String[] args) {} + + before() : execution(* main(String[])) { + System.out.println(thisJoinPoint); + + // An enhanced for loop with side effects + int acc = 0; + final int LIMIT = 2; + for (Order _ : List.of(new Order(), new Order(), new Order())) { + if (acc < LIMIT) + acc++; + } + System.out.println(acc); + + // The initialisation of a basic for loop can declare unnamed local variables + for (int i = 0, _ = sideEffect(); i < 2; i++) { + System.out.println(i); + } + + // An assignment statement, where the result of the expression on the right hand side is not needed + Queue q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var y = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, y)); + } + + // The same unnamed variable name '_' can be used in multiple assignment statements + q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var _ = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, 0)); + } + + // Unnamed variables can be used in one or multiple catch blocks + String s = "123xy"; + try { + int i = Integer.parseInt(s); + System.out.println(i); + } catch (NumberFormatException _) { + System.out.println("Bad number: " + s); + } catch (Exception _) { + System.out.println("Unexpected error"); + } + + // Try with resources + try (var _ = ScopedContext.acquire()) { + System.out.println("Doing something within scoped context"); + } + + // A lambda whose parameter is irrelevant + System.out.println( + Stream.of("one", "two", "three") + .collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA")) + ); + } + + static int sideEffect() { + System.out.println("side effect"); + return 42; + } + + static class Order {} + + static class ScopedContext implements AutoCloseable { + public static ScopedContext acquire() { + return new ScopedContext(); + } + + @Override + public void close() { + System.out.println("Closing scoped context"); + } + } +} diff --git a/tests/src/test/java/org/aspectj/systemtest/ajc1921/Java21PreviewFeaturesTests.java b/tests/src/test/java/org/aspectj/systemtest/ajc1921/Java21PreviewFeaturesTests.java index 5ef087602..bdde4b67e 100644 --- a/tests/src/test/java/org/aspectj/systemtest/ajc1921/Java21PreviewFeaturesTests.java +++ b/tests/src/test/java/org/aspectj/systemtest/ajc1921/Java21PreviewFeaturesTests.java @@ -24,6 +24,28 @@ public class Java21PreviewFeaturesTests extends XMLBasedAjcTestCaseForJava21Only runTest("string patterns aspect"); } + /** + * Still not implemented with the Java 21 release Eclipse 2023-12 (4.30), + * see GitHub issue 893. + *

+ * TODO: Activate after JDT Core implementation and merge. + */ + public void testUnnamedPatterns() { + //runTest("unnamed patterns"); + System.out.println("Unnamed patterns still are not implemented with the Java 21 release Eclipse 2023-12 (4.30)"); + } + + /** + * Still not implemented with the Java 21 release Eclipse 2023-12 (4.30), + * see GitHub issue 893. + *

+ * TODO: Activate after JDT Core implementation and merge. + */ + public void testUnnamedPatternsAspect() { + //runTest("unnamed patterns aspect"); + System.out.println("Unnamed patterns still are not implemented with the Java 21 release Eclipse 2023-12 (4.30)"); + } + public static Test suite() { return XMLBasedAjcTestCase.loadSuite(Java21PreviewFeaturesTests.class); } diff --git a/tests/src/test/resources/org/aspectj/systemtest/ajc1921/ajc1921.xml b/tests/src/test/resources/org/aspectj/systemtest/ajc1921/ajc1921.xml index a7b5d0d95..edb41fb31 100644 --- a/tests/src/test/resources/org/aspectj/systemtest/ajc1921/ajc1921.xml +++ b/tests/src/test/resources/org/aspectj/systemtest/ajc1921/ajc1921.xml @@ -259,4 +259,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.39.5