1 /* 2 * Copyright (c) 2003, 2004, 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 4812591 4705328 5019111 26 * @summary Test append and insert methods with CharSequence params 27 */ 28 29 import java.util.Random; 30 31 public class AppendCharSequence { 32 private static Random generator = new Random(); 33 34 public static void main(String[] args) throws Exception { 35 bash(); 36 checkNulls(); 37 checkOffsets(); 38 checkConstructor(); 39 } 40 41 // Sanity test of contents 42 private static void bash() throws Exception { 43 for (int i=0; i<1000; i++) { 44 StringBuffer sb1 = generateTestBuffer(0, 100); 45 StringBuffer sb2 = generateTestBuffer(0, 100); 46 StringBuffer sb3 = generateTestBuffer(0, 100); 47 StringBuffer sb4 = generateTestBuffer(0, 100); 48 StringBuffer sb5 = new StringBuffer(); 49 50 String s1 = sb1.toString(); 51 String s2 = sb2.toString(); 52 String s3 = sb3.toString(); 53 String s4 = sb4.toString(); 54 String s5 = null; 55 56 // append(CharSequence cs) 57 sb5.append((CharSequence)sb1); 58 s5 = sb1.toString(); 59 60 if (!sb5.toString().equals(s5)) 61 throw new RuntimeException("StringBuffer.append failure 1"); 62 63 // append (CharSequence cs, int start, int end) 64 int index = generator.nextInt(100); 65 int len = generator.nextInt(100); 66 while (index > sb2.length() - len) { 67 index = generator.nextInt(100); 68 len = generator.nextInt(100); 69 } 70 sb5.append((CharSequence)sb2, index, index + len); 71 s5 = s5 + sb2.toString().substring(index, index + len); 72 73 if (!sb5.toString().equals(s5)) 74 throw new RuntimeException("StringBuffer.append failure 2"); 75 76 // insert(int dstOffset, CharSequence cs) 77 index = generator.nextInt(100); 78 while (index > s5.length()) { 79 index = generator.nextInt(100); 80 } 81 sb5.insert(index, (CharSequence)sb3); 82 s5 = new StringBuffer(s5).insert(index, sb3).toString(); 83 84 if (!sb5.toString().equals(s5)) 85 throw new RuntimeException("StringBuffer.insert failure 1"); 86 87 // insert(int dstOffset, CharSequence s, int start, int end) 88 int index1 = generator.nextInt(100); 89 while (index1 > s5.length()) { 90 index1 = generator.nextInt(100); 91 } 92 int index2 = generator.nextInt(100); 93 len = generator.nextInt(100); 94 while (index2 > sb4.length() - len) { 95 index2 = generator.nextInt(100); 96 len = generator.nextInt(100); 97 } 98 sb5.insert(index1, (CharSequence)sb4, index2, index2 + len); 99 s5 = new StringBuffer(s5).insert(index1, s4.toCharArray(), 100 index2, len).toString(); 101 102 if (!sb5.toString().equals(s5)) 103 throw new RuntimeException("StringBuffer.insert failure 2"); 104 } 105 } 106 107 private static int getRandomIndex(int constraint1, int constraint2) { 108 int range = constraint2 - constraint1; 109 int x = generator.nextInt(range); 110 return constraint1 + x; 111 } 112 113 private static StringBuffer generateTestBuffer(int min, int max) { 114 StringBuffer aNewStringBuffer = new StringBuffer(); 115 int aNewLength = getRandomIndex(min, max); 116 for(int y=0; y<aNewLength; y++) { 117 int achar = generator.nextInt(30)+30; 118 char test = (char)(achar); 119 aNewStringBuffer.append(test); 120 } 121 return aNewStringBuffer; 122 } 123 124 // Check handling of null as "null" 125 private static void checkNulls() throws Exception { 126 StringBuffer sb1 = new StringBuffer(); 127 CharSequence cs = null; 128 sb1.append("test"); 129 sb1.append(cs); 130 if (!sb1.toString().equals("testnull")) 131 throw new RuntimeException("StringBuffer.append failure 3"); 132 133 sb1 = new StringBuffer(); 134 sb1.append("test", 0, 2); 135 sb1.append(cs, 0, 2); 136 if (!sb1.toString().equals("tenu")) 137 throw new RuntimeException("StringBuffer.append failure 4"); 138 139 sb1 = new StringBuffer("test"); 140 sb1.insert(2, cs); 141 if (!sb1.toString().equals("tenullst")) 142 throw new RuntimeException("StringBuffer.insert failure 3"); 143 144 sb1 = new StringBuffer("test"); 145 sb1.insert(2, cs, 0, 2); 146 if (!sb1.toString().equals("tenust")) 147 throw new RuntimeException("StringBuffer.insert failure 4"); 148 } 149 150 // Test the bounds checking 151 private static void checkOffsets() throws Exception { 152 153 // append (CharSeqeunce cs, int start, int end) 154 for (int i=0; i<100; i++) { 155 StringBuffer sb = generateTestBuffer(0, 80); 156 CharSequence cs = (CharSequence)generateTestBuffer(0, 80); 157 int index = 0; 158 int len = 0; 159 while (index <= cs.length() - len) { 160 index = generator.nextInt(100) - 50; 161 len = generator.nextInt(100) - 50; 162 if (index < 0) 163 break; 164 if (len < 0) 165 break; 166 } 167 try { 168 sb.append(cs, index, index + len); 169 throw new RuntimeException("Append bounds checking failure"); 170 } catch (IndexOutOfBoundsException e) { 171 // Correct result 172 } 173 } 174 175 // insert(int dstOffset, CharSequence cs) 176 for (int i=0; i<100; i++) { 177 StringBuffer sb = new StringBuffer("test1"); 178 CharSequence cs = (CharSequence)new StringBuffer("test2"); 179 int index = 0; 180 while (index <= sb.length()) { 181 index = generator.nextInt(100) - 50; 182 if (index < 0) 183 break; 184 } 185 try { 186 sb.insert(index, cs); 187 throw new RuntimeException("Insert bounds checking failure"); 188 } catch (IndexOutOfBoundsException e) { 189 // Correct result 190 } 191 } 192 193 // insert(int dstOffset, CharSequence s, int start, int end) 194 for (int i=0; i<100; i++) { 195 StringBuffer sb = new StringBuffer("test1"); 196 CharSequence cs = (CharSequence)new StringBuffer("test2"); 197 int index1 = 0; 198 while (index1 <= sb.length()) { 199 index1 = generator.nextInt(100) - 50; 200 if (index1 < 0) 201 break; 202 } 203 int index2 = 0; 204 int len = 0; 205 while (index2 < sb.length() - len) { 206 index2 = generator.nextInt(100) - 50; 207 len = generator.nextInt(100) - 50; 208 if (index2 < 0) 209 break; 210 if (len < 0) 211 break; 212 } 213 try { 214 sb.insert(index1, cs, index2, index2 + len); 215 throw new RuntimeException("Insert bounds checking failure"); 216 } catch (IndexOutOfBoundsException e) { 217 // Correct result 218 } 219 } 220 } 221 222 // Test the CharSequence constructor 223 private static void checkConstructor() throws Exception { 224 for (int i=0; i<100; i++) { 225 StringBuffer sb = generateTestBuffer(0, 100); 226 CharSequence cs = (CharSequence)sb; 227 StringBuffer sb2 = new StringBuffer(cs); 228 if (!sb.toString().equals(sb2.toString())) { 229 throw new RuntimeException("CharSequence constructor failure"); 230 } 231 } 232 } 233 234 }