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 }