1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package libcore.libcore.internal;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertTrue;
22 
23 import java.util.Arrays;
24 import libcore.internal.Java21LanguageFeatures;
25 
26 import org.junit.Test;
27 import org.junit.Ignore;
28 import org.junit.runner.RunWith;
29 import org.junit.runners.JUnit4;
30 
31 @RunWith(JUnit4.class)
32 public class Java21LanguageFeaturesTest {
33 
34     @Test
testPatternMatchingSwitch()35     public void testPatternMatchingSwitch() {
36         Java21LanguageFeatures.Shape s = new Java21LanguageFeatures.Triangle(6, 10);
37         assertEquals(30, Java21LanguageFeatures.calculateApproximateArea(s));
38 
39         s = new Java21LanguageFeatures.Rectangle(4, 5);
40         assertEquals(20, Java21LanguageFeatures.calculateApproximateArea(s));
41 
42         s = new Java21LanguageFeatures.Circle(5);
43         assertEquals(75, Java21LanguageFeatures.calculateApproximateArea(s));
44 
45         s = new Blob();
46         assertEquals(0, Java21LanguageFeatures.calculateApproximateArea(s));
47     }
48 
49     private static class Blob extends Java21LanguageFeatures.Shape {
50     }
51 
52     @Test
testPatternMatchingSwitchWithNull()53     public void testPatternMatchingSwitchWithNull() {
54         assertEquals("404", Java21LanguageFeatures.isDroid(null));
55         assertEquals("Yes", Java21LanguageFeatures.isDroid("Android"));
56         assertEquals("Yes", Java21LanguageFeatures.isDroid("Marvin"));
57         assertEquals("No", Java21LanguageFeatures.isDroid("Snoopy"));
58     }
59 
60     @Test
testPatternMatchingSwitchCaseRefinement()61     public void testPatternMatchingSwitchCaseRefinement() {
62         assertEquals("404", Java21LanguageFeatures.isDroidIgnoreCase(null));
63         assertEquals("Yes", Java21LanguageFeatures.isDroidIgnoreCase("Android"));
64         assertEquals("Yes", Java21LanguageFeatures.isDroidIgnoreCase("MARVIN"));
65         assertEquals("No", Java21LanguageFeatures.isDroidIgnoreCase("Snoopy"));
66     }
67 
68     @Test
testPatternMatchingSwitchWithEnum()69     public void testPatternMatchingSwitchWithEnum() {
70         assertFalse(Java21LanguageFeatures.hasManySides(
71                 Java21LanguageFeatures.PointyShapeType.TRIANGLE));
72         assertTrue(Java21LanguageFeatures.hasManySides(
73                 Java21LanguageFeatures.PointyShapeType.RECTANGLE));
74         assertFalse(Java21LanguageFeatures.hasManySides(
75                 Java21LanguageFeatures.RoundedShapeType.CIRCLE));
76     }
77 
78     @Test
testRecordPatterns()79     public void testRecordPatterns() {
80         assertEquals(5, Java21LanguageFeatures.getX(new Java21LanguageFeatures.Point(5, 10)));
81         assertEquals(0, Java21LanguageFeatures.getX(Integer.valueOf(5)));
82     }
83 
84     @Test
testRecordPatternsWithTypeInference()85     public void testRecordPatternsWithTypeInference() {
86         assertEquals(10, Java21LanguageFeatures.getY(new Java21LanguageFeatures.Point(5, 10)));
87         assertEquals(0, Java21LanguageFeatures.getY(Integer.valueOf(10)));
88     }
89 
90     @Test
testNestedRecordPatterns()91     public void testNestedRecordPatterns() {
92         final var pointOne = new Java21LanguageFeatures.Point(5, 10);
93         final var pointTwo = new Java21LanguageFeatures.Point(5, 20);
94         final var pointThree = new Java21LanguageFeatures.Point(10, 20);
95 
96         var line = new Java21LanguageFeatures.Line(pointOne, pointTwo);
97         assertTrue(Java21LanguageFeatures.isLineVertical(line));
98 
99         line = new Java21LanguageFeatures.Line(pointOne, pointThree);
100         assertFalse(Java21LanguageFeatures.isLineVertical(line));
101 
102         assertFalse(Java21LanguageFeatures.isLineVertical(Integer.valueOf(5)));
103     }
104 
105     @Test
testSwitchRecordPatterns()106     public void testSwitchRecordPatterns() {
107         final var five = new Java21LanguageFeatures.PairableInt(5);
108         final var ten = new Java21LanguageFeatures.PairableInt(10);
109         final var str = new Java21LanguageFeatures.PairableString("5");
110 
111         var pair = new Java21LanguageFeatures.Pair(five, ten);
112         assertFalse(Java21LanguageFeatures.isFirstItemLarger(pair));
113 
114         pair = new Java21LanguageFeatures.Pair(ten, five);
115         assertTrue(Java21LanguageFeatures.isFirstItemLarger(pair));
116 
117         pair = new Java21LanguageFeatures.Pair(str, five);
118         assertFalse(Java21LanguageFeatures.isFirstItemLarger(pair));
119 
120         pair = new Java21LanguageFeatures.Pair(five, str);
121         assertFalse(Java21LanguageFeatures.isFirstItemLarger(pair));
122     }
123 
124     @Test
testSwitchRecordPatternsTypeInference()125     public void testSwitchRecordPatternsTypeInference() {
126         var pair = new Java21LanguageFeatures.AnyPair<Integer, Integer>(
127                 Integer.valueOf(2), Integer.valueOf(3));
128         assertEquals(5, Java21LanguageFeatures.sumOfMembers(pair));
129     }
130 
131     @Test
testComplexSwitchPatterns()132     public void testComplexSwitchPatterns() {
133         Java21LanguageFeatures.Blob blob;
134         Object result;
135 
136         blob = Java21LanguageFeatures.SquishyBlob.SMALL;
137         result = Java21LanguageFeatures.getMainCharacteristic(blob);
138         assertEquals(Java21LanguageFeatures.SquishyBlob.SMALL, result);
139 
140         blob = Java21LanguageFeatures.SquishyBlob.MEDIUM;
141         result = Java21LanguageFeatures.getMainCharacteristic(blob);
142         assertEquals(Java21LanguageFeatures.SquishyBlob.MEDIUM, result);
143 
144         blob = Java21LanguageFeatures.SquishyBlob.LARGE;
145         result = Java21LanguageFeatures.getMainCharacteristic(blob);
146         assertEquals(Java21LanguageFeatures.SquishyBlob.LARGE, result);
147 
148         blob = new Java21LanguageFeatures.MultiBlob(Java21LanguageFeatures.RoundedShapeType.CIRCLE,
149                 Java21LanguageFeatures.Color.RED, Integer.valueOf(5));
150         result = Java21LanguageFeatures.getMainCharacteristic(blob);
151         assertEquals(Java21LanguageFeatures.RoundedShapeType.CIRCLE, result);
152 
153         blob = new Java21LanguageFeatures.MultiBlob(Java21LanguageFeatures.PointyShapeType.TRIANGLE,
154                 Java21LanguageFeatures.Color.RED, Integer.valueOf(5));
155         result = Java21LanguageFeatures.getMainCharacteristic(blob);
156         assertEquals(Java21LanguageFeatures.Color.RED, result);
157 
158         blob = new Java21LanguageFeatures.MultiBlob(Java21LanguageFeatures.PointyShapeType.TRIANGLE,
159                 Java21LanguageFeatures.Color.BLUE, Integer.valueOf(5));
160         result = Java21LanguageFeatures.getMainCharacteristic(blob);
161         assertEquals(Integer.valueOf(5), result);
162 
163         blob = new Java21LanguageFeatures.MultiBlob(Java21LanguageFeatures.PointyShapeType.TRIANGLE,
164                 Java21LanguageFeatures.Color.BLUE, Integer.valueOf(10));
165         result = Java21LanguageFeatures.getMainCharacteristic(blob);
166         assertEquals(Integer.valueOf(10), result);
167 
168         blob = new Java21LanguageFeatures.GeometricBlob(20);
169         result = Java21LanguageFeatures.getMainCharacteristic(blob);
170         assertEquals(Integer.valueOf(20), result);
171 
172         blob = new Java21LanguageFeatures.GeometricBlob(2000);
173         result = Java21LanguageFeatures.getMainCharacteristic(blob);
174         assertEquals(Integer.valueOf(1000), result);
175     }
176 }
177