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 }