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 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 // non-mutating methods 203 204 // Reset to known value 205 sb = new StringBuffer(original); 206 a = sb.toString(); 207 b = sb.toString(); 208 checkEqual(a, b); 209 210 int l = sb.length(); 211 b = sb.toString(); 212 checkEqual(a, b); 213 214 int cap = sb.capacity(); 215 b = sb.toString(); 216 checkEqual(a, b); 217 218 sb.ensureCapacity(100); 219 b = sb.toString(); 220 checkEqual(a, b); 221 222 sb.trimToSize(); 223 b = sb.toString(); 224 checkEqual(a, b); 225 226 char c = sb.charAt(1); 227 b = sb.toString(); 228 checkEqual(a, b); 229 230 int cp = sb.codePointAt(1); 231 b = sb.toString(); 232 checkEqual(a, b); 233 234 cp = sb.codePointBefore(2); 235 b = sb.toString(); 236 checkEqual(a, b); 237 238 int count = sb.codePointCount(0,1); 239 b = sb.toString(); 240 checkEqual(a, b); 241 242 count = sb.offsetByCodePoints(0, 1); 243 b = sb.toString(); 244 checkEqual(a, b); 245 246 sb.getChars(0, 1, new char[2], 0); 247 b = sb.toString(); 248 checkEqual(a, b); 249 250 String sub = sb.substring(0); 251 b = sb.toString(); 252 checkEqual(a, b); 253 254 CharSequence cs = sb.subSequence(0,1); 255 b = sb.toString(); 256 checkEqual(a, b); 257 258 sub = sb.substring(0, 3); 259 b = sb.toString(); 260 checkEqual(a, b); 261 262 int index = sb.indexOf("rig"); 263 b = sb.toString(); 264 checkEqual(a, b); 265 266 index = sb.indexOf("rig", 2); 267 b = sb.toString(); 268 checkEqual(a, b); 269 270 index = sb.lastIndexOf("rig"); 271 b = sb.toString(); 272 checkEqual(a, b); 273 274 index = sb.lastIndexOf("rig", 3); 275 b = sb.toString(); 276 checkEqual(a, b); 277 278 279 } 280 281 private static void checkEqual(String s1, String s2) { 282 if (!s1.equals(s2)) 283 throw new RuntimeException("Unmatched strings: s1 = " 284 + s1 + " s2 = " + s2); 285 } 286 private static void checkUnequal(String s1, String s2) { 287 if (s1.equals(s2)) 288 throw new RuntimeException("Unexpected matched strings: " + s1); 289 } 290 291 }