1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // 2017 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 package android.icu.dev.test.number; 5 6 import static org.junit.Assert.assertEquals; 7 import static org.junit.Assert.assertFalse; 8 import static org.junit.Assert.assertNotEquals; 9 import static org.junit.Assert.assertTrue; 10 11 import java.text.FieldPosition; 12 import java.text.Format.Field; 13 14 import org.junit.Test; 15 16 import android.icu.impl.number.NumberStringBuilder; 17 import android.icu.text.NumberFormat; 18 import android.icu.testsharding.MainTestShard; 19 20 /** @author sffc */ 21 @MainTestShard 22 public class NumberStringBuilderTest { 23 private static final String[] EXAMPLE_STRINGS = { 24 "", 25 "xyz", 26 "The quick brown fox jumps over the lazy dog", 27 "", 28 "mixed and ASCII", 29 "with combining characters like ", 30 "A very very very very very very very very very very long string to force heap" 31 }; 32 33 @Test 34 public void testInsertAppendCharSequence() { 35 36 StringBuilder sb1 = new StringBuilder(); 37 NumberStringBuilder sb2 = new NumberStringBuilder(); 38 for (String str : EXAMPLE_STRINGS) { 39 NumberStringBuilder sb3 = new NumberStringBuilder(); 40 sb1.append(str); 41 sb2.append(str, null); 42 sb3.append(str, null); 43 assertCharSequenceEquals(sb1, sb2); 44 assertCharSequenceEquals(sb3, str); 45 46 StringBuilder sb4 = new StringBuilder(); 47 NumberStringBuilder sb5 = new NumberStringBuilder(); 48 sb4.append(""); 49 sb4.append(str); 50 sb4.append("xx"); 51 sb5.append("xx", null); 52 sb5.insert(2, str, null); 53 assertCharSequenceEquals(sb4, sb5); 54 55 int start = Math.min(1, str.length()); 56 int end = Math.min(10, str.length()); 57 sb4.insert(3, str, start, end); 58 sb5.insert(3, str, start, end, null); 59 assertCharSequenceEquals(sb4, sb5); 60 61 sb4.append(str.toCharArray()); 62 sb5.append(str.toCharArray(), null); 63 assertCharSequenceEquals(sb4, sb5); 64 65 sb4.insert(4, str.toCharArray()); 66 sb5.insert(4, str.toCharArray(), null); 67 assertCharSequenceEquals(sb4, sb5); 68 69 sb4.append(sb4.toString()); 70 sb5.append(new NumberStringBuilder(sb5)); 71 assertCharSequenceEquals(sb4, sb5); 72 } 73 } 74 75 @Test 76 public void testInsertAppendCodePoint() { 77 int[] cases = {0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff}; 78 79 StringBuilder sb1 = new StringBuilder(); 80 NumberStringBuilder sb2 = new NumberStringBuilder(); 81 for (int cas : cases) { 82 NumberStringBuilder sb3 = new NumberStringBuilder(); 83 sb1.appendCodePoint(cas); 84 sb2.appendCodePoint(cas, null); 85 sb3.appendCodePoint(cas, null); 86 assertCharSequenceEquals(sb1, sb2); 87 assertEquals(Character.codePointAt(sb3, 0), cas); 88 89 StringBuilder sb4 = new StringBuilder(); 90 NumberStringBuilder sb5 = new NumberStringBuilder(); 91 sb4.append(""); 92 sb4.appendCodePoint(cas); // Java StringBuilder has no insertCodePoint() 93 sb4.append("xx"); 94 sb5.append("xx", null); 95 sb5.insertCodePoint(2, cas, null); 96 assertCharSequenceEquals(sb4, sb5); 97 } 98 } 99 100 @Test 101 public void testCopy() { 102 for (String str : EXAMPLE_STRINGS) { 103 NumberStringBuilder sb1 = new NumberStringBuilder(); 104 sb1.append(str, null); 105 NumberStringBuilder sb2 = new NumberStringBuilder(sb1); 106 assertCharSequenceEquals(sb1, sb2); 107 assertTrue(sb1.contentEquals(sb2)); 108 109 sb1.append("12345", null); 110 assertNotEquals(sb1.length(), sb2.length()); 111 assertFalse(sb1.contentEquals(sb2)); 112 } 113 } 114 115 @Test 116 public void testFields() { 117 for (String str : EXAMPLE_STRINGS) { 118 NumberStringBuilder sb = new NumberStringBuilder(); 119 sb.append(str, null); 120 sb.append(str, NumberFormat.Field.CURRENCY); 121 Field[] fields = sb.toFieldArray(); 122 assertEquals(str.length() * 2, fields.length); 123 for (int i = 0; i < str.length(); i++) { 124 assertEquals(null, fields[i]); 125 assertEquals(null, sb.fieldAt(i)); 126 assertEquals(NumberFormat.Field.CURRENCY, fields[i + str.length()]); 127 assertEquals(NumberFormat.Field.CURRENCY, sb.fieldAt(i + str.length())); 128 } 129 130 // Very basic FieldPosition test. More robust tests happen in NumberFormatTest. 131 // Let NumberFormatTest also take care of AttributedCharacterIterator material. 132 FieldPosition fp = new FieldPosition(NumberFormat.Field.CURRENCY); 133 sb.populateFieldPosition(fp, 0); 134 assertEquals(str.length(), fp.getBeginIndex()); 135 assertEquals(str.length() * 2, fp.getEndIndex()); 136 137 if (str.length() > 0) { 138 sb.insertCodePoint(2, 100, NumberFormat.Field.INTEGER); 139 fields = sb.toFieldArray(); 140 assertEquals(str.length() * 2 + 1, fields.length); 141 assertEquals(fields[2], NumberFormat.Field.INTEGER); 142 } 143 144 sb.append(new NumberStringBuilder(sb)); 145 sb.append(sb.toCharArray(), sb.toFieldArray()); 146 int numNull = 0; 147 int numCurr = 0; 148 int numInt = 0; 149 Field[] oldFields = fields; 150 fields = sb.toFieldArray(); 151 for (int i = 0; i < sb.length(); i++) { 152 assertEquals(oldFields[i % oldFields.length], fields[i]); 153 if (fields[i] == null) { 154 numNull++; 155 } else if (fields[i] == NumberFormat.Field.CURRENCY) { 156 numCurr++; 157 } else if (fields[i] == NumberFormat.Field.INTEGER) { 158 numInt++; 159 } else { 160 throw new AssertionError("Encountered unknown field in " + str); 161 } 162 } 163 assertEquals(str.length() * 4, numNull); 164 assertEquals(numNull, numCurr); 165 assertEquals(str.length() > 0 ? 4 : 0, numInt); 166 167 NumberStringBuilder sb2 = new NumberStringBuilder(); 168 sb2.append(sb); 169 assertTrue(sb.contentEquals(sb2)); 170 assertTrue(sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray())); 171 172 sb2.insertCodePoint(0, 50, NumberFormat.Field.FRACTION); 173 assertTrue(!sb.contentEquals(sb2)); 174 assertTrue(!sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray())); 175 } 176 } 177 178 @Test 179 public void testUnlimitedCapacity() { 180 NumberStringBuilder builder = new NumberStringBuilder(); 181 // The builder should never fail upon repeated appends. 182 for (int i = 0; i < 1000; i++) { 183 assertEquals(builder.length(), i); 184 builder.appendCodePoint('x', null); 185 assertEquals(builder.length(), i + 1); 186 } 187 } 188 189 @Test 190 public void testCodePoints() { 191 NumberStringBuilder nsb = new NumberStringBuilder(); 192 assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint()); 193 assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint()); 194 assertEquals("Length is 0 on empty string", 0, nsb.codePointCount()); 195 196 nsb.append("q", null); 197 assertEquals("First is q", 'q', nsb.getFirstCodePoint()); 198 assertEquals("Last is q", 'q', nsb.getLastCodePoint()); 199 assertEquals("0th is q", 'q', nsb.codePointAt(0)); 200 assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1)); 201 assertEquals("Code point count is 1", 1, nsb.codePointCount()); 202 203 // is two char16s 204 nsb.append("", null); 205 assertEquals("First is still q", 'q', nsb.getFirstCodePoint()); 206 assertEquals("Last is space ship", 128640, nsb.getLastCodePoint()); 207 assertEquals("1st is space ship", 128640, nsb.codePointAt(1)); 208 assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1)); 209 assertEquals("Before 3rd is space ship", 128640, nsb.codePointBefore(3)); 210 assertEquals("Code point count is 2", 2, nsb.codePointCount()); 211 } 212 213 private static void assertCharSequenceEquals(CharSequence a, CharSequence b) { 214 assertEquals(a.toString(), b.toString()); 215 216 assertEquals(a.length(), b.length()); 217 for (int i = 0; i < a.length(); i++) { 218 assertEquals(a.charAt(i), b.charAt(i)); 219 } 220 221 int start = Math.min(2, a.length()); 222 int end = Math.min(12, a.length()); 223 if (start != end) { 224 assertCharSequenceEquals(a.subSequence(start, end), b.subSequence(start, end)); 225 } 226 } 227 } 228