1 /* 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* @test 25 * @bug 8013395 8014814 26 * @summary Test StringBuffer.toString caching 27 */ 28 29 public class ToStringCache { 30 31 // we can't test that we actually use a cached value (the benchmarks 32 // verify that) but we have to test that the cache is cleared when 33 // expected 34 35 public static void main(String[] args) throws Exception { 36 String original = "The original String"; 37 38 StringBuffer sb = new StringBuffer(original); 39 40 String a = sb.toString(); 41 checkEqual(a, original); 42 43 String b = sb.toString(); 44 checkEqual(a, b); 45 46 // mutating methods 47 48 sb.setLength(12); 49 b = sb.toString(); 50 checkUnequal(a, b); 51 a = b; 52 53 sb.setCharAt(0, 'X'); 54 b = sb.toString(); 55 checkUnequal(a, b); 56 a = b; 57 58 sb.append(new Character('X')); 59 b = sb.toString(); 60 checkUnequal(a, b); 61 a = b; 62 63 sb.append("More text"); 64 b = sb.toString(); 65 checkUnequal(a, b); 66 a = b; 67 68 sb.append(sb); 69 b = sb.toString(); 70 checkUnequal(a, b); 71 a = b; 72 73 sb.append(new StringBuilder("Build")); 74 b = sb.toString(); 75 checkUnequal(a, b); 76 a = b; 77 78 sb.append(new StringBuilder("Build2"), 0, 1); 79 b = sb.toString(); 80 checkUnequal(a, b); 81 a = b; 82 83 sb.append(new char[] { 'a', 'b' }); 84 b = sb.toString(); 85 checkUnequal(a, b); 86 a = b; 87 88 sb.append(true); 89 b = sb.toString(); 90 checkUnequal(a, b); 91 a = b; 92 93 sb.append('c'); 94 b = sb.toString(); 95 checkUnequal(a, b); 96 a = b; 97 98 sb.append(23); 99 b = sb.toString(); 100 checkUnequal(a, b); 101 a = b; 102 103 sb.appendCodePoint(Character.codePointAt(new char[] { 'X'}, 0)); 104 b = sb.toString(); 105 checkUnequal(a, b); 106 a = b; 107 108 sb.append(1L); 109 b = sb.toString(); 110 checkUnequal(a, b); 111 a = b; 112 113 sb.append(1.0f); 114 b = sb.toString(); 115 checkUnequal(a, b); 116 a = b; 117 118 sb.append(1.0d); 119 b = sb.toString(); 120 checkUnequal(a, b); 121 a = b; 122 123 sb.delete(0, 5); 124 b = sb.toString(); 125 checkUnequal(a, b); 126 a = b; 127 128 sb.deleteCharAt(0); 129 b = sb.toString(); 130 checkUnequal(a, b); 131 a = b; 132 133 sb.replace(0,2, "123"); 134 b = sb.toString(); 135 checkUnequal(a, b); 136 a = b; 137 138 sb.insert(0, new char[] { 'a', 'b', 'c'}, 0, 3); 139 b = sb.toString(); 140 checkUnequal(a, b); 141 a = b; 142 143 sb.insert(0, new Object()); 144 b = sb.toString(); 145 checkUnequal(a, b); 146 a = b; 147 148 sb.insert(0, "abc"); 149 b = sb.toString(); 150 checkUnequal(a, b); 151 a = b; 152 153 sb.insert(0, new char[] { 'a', 'b', 'c' }); 154 b = sb.toString(); 155 checkUnequal(a, b); 156 a = b; 157 158 sb.insert(0, new StringBuilder("Build")); 159 b = sb.toString(); 160 checkUnequal(a, b); 161 a = b; 162 163 sb.insert(0, new StringBuilder("Build"), 0, 1); 164 b = sb.toString(); 165 checkUnequal(a, b); 166 a = b; 167 168 sb.insert(0, false); 169 b = sb.toString(); 170 checkUnequal(a, b); 171 a = b; 172 173 sb.insert(0, 'X'); 174 b = sb.toString(); 175 checkUnequal(a, b); 176 a = b; 177 178 sb.insert(0, 1); 179 b = sb.toString(); 180 checkUnequal(a, b); 181 a = b; 182 183 sb.insert(0, 1L); 184 b = sb.toString(); 185 checkUnequal(a, b); 186 a = b; 187 188 sb.insert(0, 1.0f); 189 b = sb.toString(); 190 checkUnequal(a, b); 191 a = b; 192 193 sb.insert(0, 1.0d); 194 b = sb.toString(); 195 checkUnequal(a, b); 196 a = b; 197 198 sb.reverse(); 199 b = sb.toString(); 200 checkUnequal(a, b); 201 202 // Extra checks that append(null) works correctly 203 204 sb.append((String)null); 205 b = sb.toString(); 206 checkUnequal(a, b); 207 a = b; 208 209 sb.append((StringBuffer)null); 210 b = sb.toString(); 211 checkUnequal(a, b); 212 a = b; 213 214 sb.append((StringBuilder)null); 215 b = sb.toString(); 216 checkUnequal(a, b); 217 a = b; 218 219 sb.append((CharSequence)null); 220 b = sb.toString(); 221 checkUnequal(a, b); 222 a = b; 223 224 // non-mutating methods 225 226 // Reset to known value 227 sb = new StringBuffer(original); 228 a = sb.toString(); 229 b = sb.toString(); 230 checkEqual(a, b); 231 232 int l = sb.length(); 233 b = sb.toString(); 234 checkEqual(a, b); 235 236 int cap = sb.capacity(); 237 b = sb.toString(); 238 checkEqual(a, b); 239 240 sb.ensureCapacity(100); 241 b = sb.toString(); 242 checkEqual(a, b); 243 244 sb.trimToSize(); 245 b = sb.toString(); 246 checkEqual(a, b); 247 248 char c = sb.charAt(1); 249 b = sb.toString(); 250 checkEqual(a, b); 251 252 int cp = sb.codePointAt(1); 253 b = sb.toString(); 254 checkEqual(a, b); 255 256 cp = sb.codePointBefore(2); 257 b = sb.toString(); 258 checkEqual(a, b); 259 260 int count = sb.codePointCount(0,1); 261 b = sb.toString(); 262 checkEqual(a, b); 263 264 count = sb.offsetByCodePoints(0, 1); 265 b = sb.toString(); 266 checkEqual(a, b); 267 268 sb.getChars(0, 1, new char[2], 0); 269 b = sb.toString(); 270 checkEqual(a, b); 271 272 String sub = sb.substring(0); 273 b = sb.toString(); 274 checkEqual(a, b); 275 276 CharSequence cs = sb.subSequence(0,1); 277 b = sb.toString(); 278 checkEqual(a, b); 279 280 sub = sb.substring(0, 3); 281 b = sb.toString(); 282 checkEqual(a, b); 283 284 int index = sb.indexOf("rig"); 285 b = sb.toString(); 286 checkEqual(a, b); 287 288 index = sb.indexOf("rig", 2); 289 b = sb.toString(); 290 checkEqual(a, b); 291 292 index = sb.lastIndexOf("rig"); 293 b = sb.toString(); 294 checkEqual(a, b); 295 296 index = sb.lastIndexOf("rig", 3); 297 b = sb.toString(); 298 checkEqual(a, b); 299 300 } 301 302 private static void checkEqual(String s1, String s2) { 303 if (!s1.equals(s2)) 304 throw new RuntimeException("Unmatched strings: s1 = " 305 + s1 + " s2 = " + s2); 306 } 307 private static void checkUnequal(String s1, String s2) { 308 if (s1.equals(s2)) 309 throw new RuntimeException("Unexpected matched strings: " + s1); 310 } 311 }