test/tools/javac/StringsInSwitch/StringSwitches.java

Wed, 14 Nov 2018 10:18:25 -0800

author
diazhou
date
Wed, 14 Nov 2018 10:18:25 -0800
changeset 3762
7909abb85562
parent 1448
7d34e91f66bb
child 2525
2eb010b6cb22
permissions
-rw-r--r--

Added tag jdk8u201-b04 for changeset a7f48b9dfb82

darcy@430 1 /*
katleman@1448 2 * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
darcy@430 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
darcy@430 4 *
darcy@430 5 * This code is free software; you can redistribute it and/or modify it
darcy@430 6 * under the terms of the GNU General Public License version 2 only, as
darcy@430 7 * published by the Free Software Foundation.
darcy@430 8 *
darcy@430 9 * This code is distributed in the hope that it will be useful, but WITHOUT
darcy@430 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
darcy@430 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
darcy@430 12 * version 2 for more details (a copy is included in the LICENSE file that
darcy@430 13 * accompanied this code).
darcy@430 14 *
darcy@430 15 * You should have received a copy of the GNU General Public License version
darcy@430 16 * 2 along with this work; if not, write to the Free Software Foundation,
darcy@430 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
darcy@430 18 *
ohair@554 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 20 * or visit www.oracle.com if you need additional information or have any
ohair@554 21 * questions.
darcy@430 22 */
darcy@430 23
darcy@430 24 /*
darcy@430 25 * @test
darcy@1063 26 * @bug 6827009 7071246
darcy@430 27 * @summary Positive tests for strings in switch.
darcy@430 28 * @author Joseph D. Darcy
darcy@430 29 */
darcy@430 30
darcy@430 31 public class StringSwitches {
darcy@430 32
darcy@430 33 public static void main(String... args) {
darcy@430 34 int failures = 0;
darcy@430 35
darcy@430 36 failures += testPileup();
darcy@430 37 failures += testSwitchingTwoWays();
darcy@430 38 failures += testNamedBreak();
darcy@1063 39 failures += testExtraParens();
darcy@430 40
darcy@430 41 if (failures > 0) {
darcy@430 42 throw new RuntimeException();
darcy@430 43 }
darcy@430 44 }
darcy@430 45
darcy@430 46 /*
darcy@430 47 * A zero length string and all strings consisting only of the
darcy@430 48 * zero character \u0000 have a hash code of zero. This method
darcy@430 49 * maps such strings to the number of times \u0000 appears for 0
darcy@430 50 * through 6 occurrences.
darcy@430 51 */
darcy@430 52 private static int zeroHashes(String s) {
darcy@430 53 int result = Integer.MAX_VALUE;
darcy@430 54 switch(s) {
darcy@430 55 case "":
darcy@430 56 return 0;
darcy@430 57
darcy@430 58 case "\u0000":
darcy@430 59 result = 1; break;
darcy@430 60
darcy@430 61 case "\u0000\u0000":
darcy@430 62 return 2;
darcy@430 63
darcy@430 64 case "\u0000\u0000\u0000":
darcy@430 65 result = 3; break;
darcy@430 66
darcy@430 67 case "\u0000\u0000\u0000\u0000":
darcy@430 68 return 4;
darcy@430 69
darcy@430 70 case "\u0000\u0000\u0000\u0000\u0000":
darcy@430 71 result = 5; break;
darcy@430 72
darcy@430 73 case "\u0000\u0000\u0000\u0000\u0000\u0000":
darcy@430 74 return 6;
darcy@430 75
darcy@430 76 default:
darcy@430 77 result = -1;
darcy@430 78 }
darcy@430 79 return result;
darcy@430 80 }
darcy@430 81
darcy@430 82 private static int testPileup() {
darcy@430 83 int failures = 0;
darcy@430 84 String zero = "";
darcy@430 85 for(int i = 0; i <= 6; i++, zero += "\u0000") {
darcy@430 86 int result = zeroHashes(zero);
darcy@430 87 if (result != i) {
darcy@430 88 failures++;
darcy@430 89 System.err.printf("For string \"%s\" unexpectedly got %d instead of %d%n.",
darcy@430 90 zero, result, i);
darcy@430 91 }
darcy@430 92 }
darcy@430 93
darcy@430 94 if (zeroHashes("foo") != -1) {
darcy@430 95 failures++;
darcy@430 96 System.err.println("Failed to get -1 for input string.");
darcy@430 97 }
darcy@430 98
darcy@430 99 return failures;
darcy@430 100 }
darcy@430 101
darcy@430 102 /**
darcy@430 103 * Verify that a switch on an enum and a switch with the same
darcy@430 104 * structure on the string name of an enum compute equivalent
darcy@430 105 * values.
darcy@430 106 */
darcy@430 107 private static int testSwitchingTwoWays() {
darcy@430 108 int failures = 0;
darcy@430 109
darcy@430 110 for(MetaSynVar msv : MetaSynVar.values()) {
darcy@430 111 int enumResult = enumSwitch(msv);
darcy@430 112 int stringResult = stringSwitch(msv.name());
darcy@430 113
darcy@430 114 if (enumResult != stringResult) {
darcy@430 115 failures++;
darcy@430 116 System.err.printf("One value %s, computed 0x%x with the enum switch " +
darcy@430 117 "and 0x%x with the string one.%n",
darcy@430 118 msv, enumResult, stringResult);
darcy@430 119 }
darcy@430 120 }
darcy@430 121
darcy@430 122 return failures;
darcy@430 123 }
darcy@430 124
darcy@430 125 private static enum MetaSynVar {
darcy@430 126 FOO,
darcy@430 127 BAR,
darcy@430 128 BAZ,
darcy@430 129 QUX,
darcy@430 130 QUUX,
darcy@430 131 QUUUX,
darcy@430 132 MUMBLE,
darcy@430 133 FOOBAR;
darcy@430 134 }
darcy@430 135
darcy@430 136 private static int enumSwitch(MetaSynVar msv) {
darcy@430 137 int result = 0;
darcy@430 138 switch(msv) {
darcy@430 139 case FOO:
darcy@430 140 result |= (1<<0);
darcy@430 141 // fallthrough:
darcy@430 142
darcy@430 143 case BAR:
darcy@430 144 case BAZ:
darcy@430 145 result |= (1<<1);
darcy@430 146 break;
darcy@430 147
darcy@430 148 default:
darcy@430 149 switch(msv) {
darcy@430 150 case QUX:
darcy@430 151 result |= (1<<2);
darcy@430 152 break;
darcy@430 153
darcy@430 154 case QUUX:
darcy@430 155 result |= (1<<3);
darcy@430 156
darcy@430 157 default:
darcy@430 158 result |= (1<<4);
darcy@430 159 }
darcy@430 160 result |= (1<<5);
darcy@430 161 break;
darcy@430 162
darcy@430 163 case MUMBLE:
darcy@430 164 result |= (1<<6);
darcy@430 165 return result;
darcy@430 166
darcy@430 167 case FOOBAR:
darcy@430 168 result |= (1<<7);
darcy@430 169 break;
darcy@430 170 }
darcy@430 171 result |= (1<<8);
darcy@430 172 return result;
darcy@430 173 }
darcy@430 174
darcy@430 175 private static int stringSwitch(String msvName) {
darcy@430 176 int result = 0;
darcy@430 177 switch(msvName) {
darcy@430 178 case "FOO":
darcy@430 179 result |= (1<<0);
darcy@430 180 // fallthrough:
darcy@430 181
darcy@430 182 case "BAR":
darcy@430 183 case "BAZ":
darcy@430 184 result |= (1<<1);
darcy@430 185 break;
darcy@430 186
darcy@430 187 default:
darcy@430 188 switch(msvName) {
darcy@430 189 case "QUX":
darcy@430 190 result |= (1<<2);
darcy@430 191 break;
darcy@430 192
darcy@430 193 case "QUUX":
darcy@430 194 result |= (1<<3);
darcy@430 195
darcy@430 196 default:
darcy@430 197 result |= (1<<4);
darcy@430 198 }
darcy@430 199 result |= (1<<5);
darcy@430 200 break;
darcy@430 201
darcy@430 202 case "MUMBLE":
darcy@430 203 result |= (1<<6);
darcy@430 204 return result;
darcy@430 205
darcy@430 206 case "FOOBAR":
darcy@430 207 result |= (1<<7);
darcy@430 208 break;
darcy@430 209 }
darcy@430 210 result |= (1<<8);
darcy@430 211 return result;
darcy@430 212 }
darcy@430 213
darcy@430 214 private static int testNamedBreak() {
darcy@430 215 int failures = 0;
darcy@430 216 String[] testStrings = {"a", "b", "c", "d", "e"};
darcy@430 217 int[] testExpected = { 0b101011, 0b101, 0b100001, 0b101000, 0b10000};
darcy@430 218
darcy@430 219 for(int i = 0; i < testStrings.length; i++) {
darcy@430 220 int expected = testExpected[i];
darcy@430 221 int result = namedBreak(testStrings[i]);
darcy@430 222
darcy@430 223 if (result != expected) {
darcy@430 224 failures++;
darcy@430 225
darcy@430 226 System.err.printf("On input %s, got %d instead of %d.%n",
darcy@430 227 testStrings[i], result, expected);
darcy@430 228 }
darcy@430 229 }
darcy@430 230
darcy@430 231 return failures;
darcy@430 232 }
darcy@430 233
darcy@430 234 private static int namedBreak(String s) {
darcy@430 235 int result = 0;
darcy@430 236 outer: switch(s) {
darcy@430 237 case "a":
darcy@430 238 case "b":
darcy@430 239 case "c":
darcy@430 240 result |= (1<<0);
darcy@430 241 inner: switch(s + s) {
darcy@430 242 case "aa":
darcy@430 243 result |= (1<<1);
darcy@430 244 break inner;
darcy@430 245
darcy@430 246 case "cc":
darcy@430 247 break outer;
darcy@430 248
darcy@430 249 default:
darcy@430 250 result |= (1<<2);
darcy@430 251 return result;
darcy@430 252 }
darcy@430 253
darcy@430 254 case "d":
darcy@430 255 result |= (1<<3);
darcy@430 256 break outer;
darcy@430 257
darcy@430 258 default:
darcy@430 259 return result |= (1<<4);
darcy@430 260 }
darcy@430 261 result |= (1<<5);
darcy@430 262 return result;
darcy@430 263 }
darcy@1063 264
darcy@1063 265 private static int testExtraParens() {
darcy@1063 266 int failures = 1;
darcy@1063 267 String s = "first";
darcy@1063 268
darcy@1063 269 switch(s) {
darcy@1063 270 case (("first")):
darcy@1063 271 failures = 0;
darcy@1063 272 break;
darcy@1063 273 case ("second"):
darcy@1063 274 throw new RuntimeException("Should not be reached.");
darcy@1063 275 }
darcy@1063 276
darcy@1063 277 return failures;
darcy@1063 278 }
darcy@430 279 }

mercurial