Home | History | Annotate | Download | only in number
      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