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