Home | History | Annotate | Download | only in format
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 
      3 //  2016 and later: Unicode, Inc. and others.
      4 // License & terms of use: http://www.unicode.org/copyright.html#License
      5 /*
      6  *******************************************************************************
      7  * Copyright (C) 2001-2016, International Business Machines Corporation and    *
      8  * others. All Rights Reserved.                                                *
      9  *******************************************************************************
     10  */
     11 
     12 /**
     13  * Port From:   ICU4C v1.8.1 : format : DateIntervalFormatTest
     14  * Source File: $ICU4CRoot/source/test/intltest/dtifmtts.cpp
     15  **/
     16 
     17 package android.icu.dev.test.format;
     18 
     19 import java.text.FieldPosition;
     20 import java.text.ParseException;
     21 import java.text.ParsePosition;
     22 import java.util.ArrayList;
     23 import java.util.Date;
     24 import java.util.List;
     25 import java.util.ListIterator;
     26 import java.util.Locale;
     27 
     28 import org.junit.Test;
     29 import org.junit.runner.RunWith;
     30 import org.junit.runners.JUnit4;
     31 
     32 import android.icu.dev.test.TestFmwk;
     33 import android.icu.impl.Utility;
     34 import android.icu.text.DateFormat;
     35 import android.icu.text.DateIntervalFormat;
     36 import android.icu.text.DateIntervalInfo;
     37 import android.icu.text.DateIntervalInfo.PatternInfo;
     38 import android.icu.text.SimpleDateFormat;
     39 import android.icu.util.Calendar;
     40 import android.icu.util.DateInterval;
     41 import android.icu.util.Output;
     42 import android.icu.util.TimeZone;
     43 import android.icu.util.ULocale;
     44 import android.icu.testsharding.MainTestShard;
     45 
     46 @MainTestShard
     47 @RunWith(JUnit4.class)
     48 public class DateIntervalFormatTest extends TestFmwk {
     49 
     50     /**
     51      *
     52      */
     53     private static final ULocale SPANISH = new ULocale("es");
     54     /**
     55      *
     56      */
     57     private static final ULocale LA_SPANISH = new ULocale("es-419");
     58 
     59     /**
     60      * Test format
     61      */
     62     @Test
     63     public void TestFormat() {
     64         // first item is date pattern
     65         // followed by a group of locale/from_data/to_data/skeleton/interval_data
     66         String[] DATA = {
     67                 "yyyy MM dd HH:mm:ss",
     68                 // test root
     69                 "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
     70 
     71                 // test 'H' and 'h', using availableFormat in fallback
     72                 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
     73                 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
     74 
     75                 // test skeleton with both date and time
     76                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM \\u2013 Nov 20, 2007, 10:10 AM",
     77 
     78                 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 \\u2013 11:10 AM",
     79 
     80                 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
     81 
     82                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
     83 
     84                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
     85 
     86                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
     87 
     88                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
     89 
     90                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
     91 
     92                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
     93 
     94                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
     95 
     96                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
     97 
     98                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
     99 
    100                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
    101 
    102                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    103 
    104                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
    105 
    106                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
    107 
    108                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
    109 
    110                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    111 
    112                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
    113 
    114                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
    115 
    116                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007 \\u2013 2008",
    117 
    118                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
    119 
    120                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
    121 
    122                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
    123 
    124                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
    125 
    126                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 10/10/2008, 10:10 AM PT",
    127 
    128                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
    129 
    130                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 10/10/2008, 10 AM",
    131 
    132                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 10/10/2008, 10 AM PT",
    133 
    134                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 10/10/2008, 10 AM PDT",
    135 
    136                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    137 
    138                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    139 
    140                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
    141 
    142                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
    143 
    144                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 10/10/2008, 10:10:10 AM",
    145 
    146                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
    147 
    148                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
    149 
    150                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
    151 
    152                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
    153 
    154                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
    155 
    156                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October \\u2013 November 2007",
    157 
    158                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
    159 
    160                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
    161 
    162                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
    163 
    164                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
    165 
    166                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct \\u2013 Nov 2007",
    167 
    168                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
    169 
    170                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    171 
    172                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
    173 
    174                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10/10 \\u2013 11/10",
    175 
    176                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
    177 
    178                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
    179 
    180                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
    181 
    182                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
    183 
    184                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
    185 
    186                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10 \\u2013 11",
    187 
    188                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct \\u2013 Nov",
    189 
    190                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October \\u2013 November",
    191 
    192                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
    193 
    194                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 11/10/2007, 10:10 AM PT",
    195 
    196                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
    197 
    198                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 11/10/2007, 10 AM",
    199 
    200                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 11/10/2007, 10 AM PT",
    201 
    202                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 11/10/2007, 10 AM PST",
    203 
    204                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    205 
    206                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    207 
    208                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
    209 
    210                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
    211 
    212                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 11/10/2007, 10:10:10 AM",
    213 
    214                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
    215 
    216                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
    217 
    218                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
    219 
    220                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10 \\u2013 20, 2007",
    221 
    222                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10 \\u2013 20",
    223 
    224                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "November 2007",
    225 
    226                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
    227 
    228                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
    229 
    230 
    231                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10 \\u2013 20",
    232 
    233                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
    234 
    235                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
    236 
    237                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    238 
    239                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
    240 
    241                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
    242 
    243                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
    244                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
    245 
    246                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10 \\u2013 20",
    247                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
    248 
    249                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
    250 
    251                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
    252 
    253                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
    254 
    255                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT \\u2013 11/20/2007, 10:10 AM PT",
    256 
    257                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
    258 
    259                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST \\u2013 11/20/2007, 10 AM PST",
    260 
    261                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    262 
    263                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    264 
    265                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
    266 
    267                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM \\u2013 11/20/2007, 10:10:10 AM",
    268 
    269                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10 \\u2013 20, 2007",
    270 
    271                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
    272 
    273                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
    274 
    275                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
    276 
    277                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
    278 
    279                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
    280 
    281                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
    282 
    283 
    284                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
    285 
    286                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
    287 
    288                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
    289 
    290                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
    291 
    292                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMy", "Wed, 1/10/2007",
    293 
    294                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
    295 
    296                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
    297 
    298 
    299                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
    300 
    301                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
    302 
    303                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
    304 
    305                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
    306 
    307 
    308                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
    309 
    310                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
    311 
    312                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
    313 
    314 
    315                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
    316 
    317                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
    318 
    319                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "10 AM \\u2013 2 PM PT",
    320 
    321                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
    322 
    323                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
    324 
    325 
    326                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
    327 
    328                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
    329 
    330 
    331                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
    332 
    333                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
    334 
    335                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
    336 
    337                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
    338 
    339 
    340                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
    341 
    342 
    343                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
    344 
    345                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
    346 
    347                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
    348 
    349 
    350                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
    351 
    352                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
    353 
    354 
    355                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dM", "1/10",
    356 
    357 
    358                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
    359 
    360 
    361 
    362                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
    363 
    364 
    365                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMM", "Jan",
    366 
    367 
    368                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00 \\u2013 10:20 AM",
    369 
    370                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00 \\u2013 10:20 AM PT",
    371 
    372 
    373                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 AM",
    374 
    375 
    376                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 AM PST",
    377 
    378 
    379                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
    380 
    381                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00 \\u2013 10:20 AM",
    382 
    383                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00 \\u2013 10:20 AM PST",
    384 
    385                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hms", "10:00:10 AM \\u2013 10:20:10 AM",
    386 
    387                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMM", "January 10",
    388 
    389                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
    390 
    391                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMMy", "Wed, Jan 10, 2007",
    392 
    393                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
    394 
    395                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
    396                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dM", "1/10",
    397 
    398                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
    399 
    400                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
    401                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
    402 
    403                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Ed", "10 Wed",
    404 
    405                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
    406 
    407                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
    408 
    409                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMM", "Jan",
    410 
    411                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
    412 
    413                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
    414 
    415                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 AM PT",
    416 
    417                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
    418 
    419                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 AM",
    420 
    421 
    422                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 AM PST",
    423 
    424                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
    425 
    426                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hms", "10:10:10 AM \u2013 10:10:20 AM",
    427 
    428                 "en", "2007 01 01 22:00:00", "2007 01 01 23:00:00", "yMMMMdHm", "January 1, 2007, 22:00 \u2013 23:00",
    429 
    430                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
    431 
    432                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "2007/10/10 \\u4e0a\\u534810:10 \\u2013 2008/10/10 \\u4e0a\\u534810:10",
    433 
    434                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
    435 
    436                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "10\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
    437 
    438                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
    439 
    440                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "10\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f311\\u670810\\u65e5\\u661f\\u671f\\u516d",
    441 
    442                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007/10/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10 \\u2013 2007/11/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10",
    443 
    444                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
    445 
    446                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u81f320\\u65e5",
    447 
    448                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
    449 
    450                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket 6872<-6626)
    451 
    452                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
    453 
    454                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "11\\u670810\\u65e5\\u5468\\u516d\\u81f320\\u65e5\\u5468\\u4e8c",
    455 
    456                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
    457 
    458                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "2007/11/10 \\u2013 2007/11/20",
    459 
    460                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
    461 
    462                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007\u5E7411\u6708",
    463                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
    464 
    465                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10\\u201320\\u65e5",
    466 
    467                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
    468 
    469                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
    470 
    471                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket 6872<-6626 and others)
    472 
    473                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMM", "\\u5341\\u4E00\\u6708", // (fixed expected result per ticket 6872<-6626 and others)
    474 
    475                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007/11/10 GMT-8 \\u4e0a\\u534810:10 \\u2013 2007/11/20 GMT-8 \\u4e0a\\u534810:10",
    476 
    477                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6 \\u2013 2007/11/20 \\u4e0a\\u534810\\u65f6",
    478 
    479                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket 6872<-6626)
    480 
    481                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
    482 
    483                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F3\\u4E0B\\u53482:10",
    484 
    485                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
    486 
    487                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
    488 
    489                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
    490 
    491                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "GMT-8\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
    492 
    493                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "1\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    494 
    495                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
    496 
    497                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
    498 
    499                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "\\u4e0a\\u534810\\u65f6",
    500 
    501                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
    502 
    503                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket 6872<-6626)
    504 
    505                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
    506 
    507                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
    508 
    509                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 \\u2013 Freitag, 10. Okt. 2008",
    510 
    511                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "10. Okt. 2007 \\u2013 10. Okt. 2008",
    512 
    513                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 \\u2013 10. Okt. 2008",
    514 
    515                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt. 2007 \\u2013 Okt. 2008",
    516 
    517                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEdMMM", "Mi., 10. Okt. 2007 \\u2013 Fr., 10. Okt. 2008",
    518 
    519                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
    520 
    521                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.2007 \\u2013 10.10.2008",
    522 
    523                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10.10.2007 \\u2013 10.10.2008",
    524 
    525                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.2007 \\u2013 10.2008",
    526 
    527                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
    528 
    529                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10.10.2007 \\u2013 10.10.2008",
    530 
    531                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007\\u20132008",
    532 
    533                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.2007 \\u2013 10.2008",
    534 
    535                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Okt. 2007 \\u2013 Okt. 2008",
    536 
    537                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10.10.2007, 10:10 vorm. \\u2013 10.10.2008, 10:10 vorm.",
    538 
    539                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "jm", "10.10.2007, 10:10 \\u2013 10.10.2008, 10:10",
    540 
    541                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov. 2007",
    542 
    543                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "10. Okt. \\u2013 10. Nov. 2007",
    544 
    545                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt. \\u2013 10. Nov.",
    546 
    547                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt.\\u2013Nov. 2007",
    548 
    549                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov.",
    550 
    551                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Sa., 10.11.2007",
    552 
    553                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. \\u2013 10.11.",
    554 
    555                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.2007 \\u2013 11.2007",
    556 
    557                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Mi., 10.10. \\u2013 Sa., 10.11.",
    558 
    559                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. \\u2013 10.11.",
    560 
    561 
    562                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10.\\u201311.",
    563 
    564                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt.\\u2013Nov.",
    565 
    566                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "10.10.2007, 10:10 vorm. Los Angeles Zeit \\u2013 10.11.2007, 10:10 vorm. Los Angeles Zeit",
    567 
    568                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "jmv", "10.10.2007, 10:10 Los Angeles Zeit \\u2013 10.11.2007, 10:10 Los Angeles Zeit",
    569 
    570                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10.10.2007, 10:10:10 vorm. \\u2013 10.11.2007, 10:10:10 vorm.",
    571 
    572                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. \\u2013 Dienstag, 20. Nov. 2007",
    573 
    574                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.\\u201320. Nov. 2007",
    575 
    576                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "10.\\u201320. Nov.",
    577 
    578                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov. 2007",
    579 
    580                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. \\u2013 Dienstag, 20. Nov.",
    581 
    582                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.2007 \\u2013 Di., 20.11.2007",
    583 
    584                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "10.11.2007 \\u2013 20.11.2007",
    585 
    586                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. \\u2013 20.11.",
    587 
    588                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
    589 
    590                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sa., 10.11. \\u2013 Di., 20.11.",
    591 
    592                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.\\u201320.",
    593 
    594                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
    595 
    596                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
    597 
    598                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007, 10:10 vorm. Los Angeles Zeit \\u2013 20.11.2007, 10:10 vorm. Los Angeles Zeit",
    599 
    600                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "jmv", "10.11.2007, 10:10 Los Angeles Zeit \\u2013 20.11.2007, 10:10 Los Angeles Zeit",
    601 
    602                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
    603 
    604                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "10. Jan. 2007",
    605 
    606                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan.",
    607 
    608                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan. 2007",
    609 
    610                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
    611 
    612                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 vorm. \\u2013 2:10 nachm. GMT-8",
    613 
    614                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 Uhr vorm. \\u2013 2 Uhr nachm.",
    615 
    616                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
    617 
    618                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00\\u201310:20 vorm.",
    619 
    620                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00\\u201310:20 vorm. Los Angeles Zeit",
    621 
    622                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 vorm. GMT-8",
    623 
    624                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 Uhr vorm.",
    625 
    626                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "10 Uhr vorm. Los Angeles Zeit",
    627 
    628                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 Uhr vorm. GMT-8",
    629 
    630                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
    631 
    632                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 vorm.",
    633 
    634                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jm", "10:10",
    635 
    636                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. Los Angeles Zeit",
    637 
    638                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jmv", "10:10 Los Angeles Zeit",
    639 
    640                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. GMT-8",
    641 
    642                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jmz", "10:10 GMT-8",
    643 
    644                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 Uhr vorm.",
    645 
    646                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 Uhr vorm. Los Angeles Zeit",
    647 
    648                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 Uhr vorm. GMT-8",
    649 
    650                 // Thai (default calendar buddhist)
    651 
    652                 // Android patch: Force default Gregorian calendar.
    653 
    654                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2550 \\u2013 \\u0E27\\u0E31\\u0E19\\u0E2D\\u0E32\\u0E17\\u0E34\\u0E15\\u0E22\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2551",
    655 
    656 
    657                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
    658 
    659                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 \\u2013 \\u0E15.\\u0E04. 2551",
    660 
    661 
    662                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E2A. 10/10/2550 \\u2013 \\u0E2D\\u0E32. 10/10/2551",
    663 
    664                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/2550 \\u2013 10/10/2551",
    665 
    666 
    667                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/2550 \\u2013 10/2551",
    668 
    669                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E2A. 10/10/2550 \\u2013 \\u0E2D\\u0E32. 10/10/2551",
    670 
    671 
    672                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550\\u20132551",
    673 
    674                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/2550 \\u2013 10/2551",
    675 
    676 
    677                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. \\u2013 \\u0E27\\u0E31\\u0E19\\u0E2D\\u0E31\\u0E07\\u0E04\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48 10 \\u0E1E.\\u0E22. 2550",
    678 
    679 
    680                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
    681 
    682                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22. 2550",
    683 
    684                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 \\u2013 10/11",
    685 
    686                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/2550 \\u2013 11/2550",
    687 
    688 
    689                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 \\u2013 10/11",
    690 
    691                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "2550",
    692 
    693 
    694                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04. \\u2013 \\u0E1E.\\u0E22.",
    695 
    696                 // Android patch end.
    697         };
    698         expect(DATA, DATA.length);
    699     }
    700 
    701 
    702     private void expect(String[] data, int data_length) {
    703         int i = 1;
    704         while (i<data_length) {
    705             String locName = data[i++];
    706             ULocale loc = new ULocale(locName);
    707             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    708             // 'f'
    709             String datestr = data[i++];
    710             String datestr_2 = data[i++];
    711             Date date, date_2;
    712             try {
    713                 date = ref.parse(datestr);
    714                 date_2 = ref.parse(datestr_2);
    715             } catch ( ParseException e ) {
    716                 errln("parse exception" + e);
    717                 continue;
    718             }
    719             DateInterval dtitv = new DateInterval(date.getTime(),
    720                     date_2.getTime());
    721             String oneSkeleton = data[i++];
    722             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(
    723                     oneSkeleton, loc);
    724             String expected = data[i++];
    725             String formatted = dtitvfmt.format(dtitv);
    726             if ( !formatted.equals(Utility.unescape(expected)) )  {
    727                 errln("\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    728             }
    729         }
    730     }
    731 
    732 
    733     /*
    734      * Test format using user defined DateIntervalInfo
    735      */
    736     @Test
    737     public void TestFormatUserDII() {
    738         // first item is date pattern
    739         // followed by a group of locale/from_data/to_data/interval_data
    740         String[] DATA = {
    741                 "yyyy MM dd HH:mm:ss",
    742                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
    743 
    744                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
    745 
    746                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
    747 
    748                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
    749 
    750                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
    751 
    752                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
    753 
    754                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
    755 
    756 
    757                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
    758 
    759                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    760 
    761                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    762 
    763                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    764 
    765                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt. 2007 --- 10. Okt. 2008",
    766 
    767                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Okt. 10 - Nov. 2007",
    768 
    769                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov. 2007 --- 20. Nov. 2007",
    770 
    771                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan. 2007",
    772 
    773                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan. 2007",
    774 
    775                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10. Jan. 2007",
    776 
    777                 "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 oct. 2007 --- 10 oct. 2008",
    778 
    779                 "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct. 10 - nov. 2007",
    780 
    781                 "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 nov. 2007 --- 20 nov. 2007",
    782 
    783                 "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 ene. 2007",
    784 
    785                 "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 ene. 2007",
    786 
    787                 "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 ene. 2007",
    788         };
    789         expectUserDII(DATA, DATA.length);
    790     }
    791 
    792 
    793     private void expectUserDII(String[] data, int data_length) {
    794         int i = 1;
    795         while (i<data_length) {
    796             String locName = data[i++];
    797             ULocale loc = new ULocale(locName);
    798             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    799             // 'f'
    800             String datestr = data[i++];
    801             String datestr_2 = data[i++];
    802             Date date, date_2;
    803             try {
    804                 date = ref.parse(datestr);
    805                 date_2 = ref.parse(datestr_2);
    806             } catch ( ParseException e ) {
    807                 errln("parse exception" + e);
    808                 continue;
    809             }
    810             DateInterval dtitv = new DateInterval(date.getTime(),
    811                     date_2.getTime());
    812 
    813             DateIntervalInfo dtitvinf = new DateIntervalInfo();
    814             dtitvinf.setFallbackIntervalPattern("{0} --- {1}");
    815             dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "yyyy MMM d - MMM y");
    816             dtitvinf.setIntervalPattern("yMMMd", Calendar.HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm");
    817             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(
    818                     DateFormat.YEAR_ABBR_MONTH_DAY,
    819                     loc, dtitvinf);
    820             String expected = data[i++];
    821             String formatted = dtitvfmt.format(dtitv);
    822             if ( !formatted.equals(Utility.unescape(expected)) )  {
    823                 errln("userDII: \"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    824             }
    825         }
    826     }
    827 
    828 
    829 
    830     /*
    831      * Test format using user defined DateIntervalInfo
    832      */
    833     @Test
    834     public void TestFormatCLDR() {
    835         // first item is date pattern
    836         // followed by a group of locale/from_data/to_data/interval_data
    837         String[] DATA = {
    838                 "yyyy MM dd HH:mm:ss",
    839                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "all diff",
    840 
    841                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 diff Oct 10 - Nov 2007",
    842 
    843                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007 Nov 10 ~ 20",
    844 
    845                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
    846 
    847                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
    848 
    849                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
    850 
    851                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "all diff",
    852 
    853                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 diff 10\\u6708 10 - 11\\u6708 2007",
    854 
    855                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007 11\\u6708 10 ~ 20",
    856 
    857                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    858 
    859                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    860 
    861                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    862         };
    863         expectUserCLDR(DATA, DATA.length);
    864     }
    865 
    866 
    867     private void expectUserCLDR(String[] data, int data_length) {
    868         int i = 1;
    869         while (i<data_length) {
    870             String locName = data[i++];
    871             ULocale loc = new ULocale(locName);
    872             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    873             // 'f'
    874             String datestr = data[i++];
    875             String datestr_2 = data[i++];
    876             Date date, date_2;
    877             try {
    878                 date = ref.parse(datestr);
    879                 date_2 = ref.parse(datestr_2);
    880             } catch ( ParseException e ) {
    881                 errln("parse exception" + e);
    882                 continue;
    883             }
    884             DateInterval dtitv = new DateInterval(date.getTime(),
    885                     date_2.getTime());
    886 
    887             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("yyyyMMMdd", loc);
    888             //DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("yMd");
    889             //SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy 'year' MMM 'month' dd 'day'", loc);
    890             //dtitvfmt.setDateFormat(dtfmt);
    891             DateIntervalInfo dtitvinf = new DateIntervalInfo();
    892             dtitvinf.setFallbackIntervalPattern("{0} --- {1}");
    893             dtitvinf.setIntervalPattern("yMMMd", Calendar.YEAR, "'all diff'");
    894             dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "yyyy 'diff' MMM d - MMM y");
    895             dtitvinf.setIntervalPattern("yMMMd", Calendar.DATE, "yyyy MMM d ~ d");
    896             dtitvinf.setIntervalPattern("yMMMd", Calendar.HOUR_OF_DAY, "yyyy MMMd HH:mm ~ HH:mm");
    897             dtitvfmt.setDateIntervalInfo(dtitvinf);
    898             FieldPosition pos = new FieldPosition(0);
    899             StringBuffer str = new StringBuffer("");
    900             DateFormat dtfmt = dtitvfmt.getDateFormat();
    901             Calendar fromCalendar = (Calendar) dtfmt.getCalendar().clone();
    902             Calendar toCalendar = (Calendar) dtfmt.getCalendar().clone();
    903             fromCalendar.setTimeInMillis(dtitv.getFromDate());
    904             toCalendar.setTimeInMillis(dtitv.getToDate());
    905             dtitvfmt.format(fromCalendar, toCalendar, str, pos);
    906 
    907             String expected = data[i++];
    908             String formatted = dtitvfmt.format(dtitv).toString();
    909             if ( !formatted.equals(Utility.unescape(expected)) )  {
    910                 errln("CLDR: \"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    911             }
    912         }
    913     }
    914 
    915 
    916     /**
    917      * Stress test
    918      */
    919     @Test
    920     public void TestStress() {
    921         if (TestFmwk.getExhaustiveness() <= 5) {
    922             logln("INFO: Skipping test");
    923             return;
    924         }
    925 
    926         // test data.
    927         // The 1st is the format pattern,
    928         // Next are pairs in which the 1st in the pair is the earlier date
    929         // and the 2nd in the pair is the later date
    930         String[] DATA = {
    931                 "yyyy MM dd HH:mm:ss",
    932                 "2007 10 10 10:10:10", "2008 10 10 10:10:10",
    933                 "2007 10 10 10:10:10", "2007 11 10 10:10:10",
    934                 "2007 11 10 10:10:10", "2007 11 20 10:10:10",
    935                 "2007 01 10 10:00:10", "2007 01 10 14:10:10",
    936                 "2007 01 10 10:00:10", "2007 01 10 10:20:10",
    937                 "2007 01 10 10:10:10", "2007 01 10 10:10:20",
    938         };
    939 
    940 
    941         String[][] testLocale = {
    942                 {"en", "", ""},
    943                 {"zh", "", ""},
    944                 {"de", "", ""},
    945                 {"ar", "", ""},
    946                 {"en", "GB",  ""},
    947                 {"fr", "", ""},
    948                 {"it", "", ""},
    949                 {"nl", "", ""},
    950                 {"zh", "TW",  ""},
    951                 {"ja", "", ""},
    952                 {"pt", "BR", ""},
    953                 {"ru", "", ""},
    954                 {"tr", "", ""},
    955                 {"es", "", ""},
    956                 {"ko", "", ""},
    957                 //{"th", "", ""},
    958                 {"sv", "", ""},
    959                 {"pl", "", ""},
    960                 {"fi", "", ""},
    961                 {"da", "", ""},
    962                 {"pt", "PT", ""},
    963                 {"ro", "", ""},
    964                 {"hu", "", ""},
    965                 {"he", "", ""},
    966                 {"in", "", ""},
    967                 {"cs", "", ""},
    968                 {"el", "", ""},
    969                 {"no", "", ""},
    970                 {"vi", "", ""},
    971                 {"bg", "", ""},
    972                 {"hr", "", ""},
    973                 {"lt", "", ""},
    974                 {"sk", "", ""},
    975                 {"sl", "", ""},
    976                 {"sr", "", ""},
    977                 {"ca", "", ""},
    978                 {"lv", "", ""},
    979                 {"uk", "", ""},
    980                 {"hi", "", ""},
    981         };
    982 
    983         int localeIndex;
    984         for ( localeIndex = 0; localeIndex < testLocale.length; ++localeIndex) {
    985             stress(DATA, DATA.length, new Locale(testLocale[localeIndex][0],
    986                     testLocale[localeIndex][1], testLocale[localeIndex][2]),
    987                     testLocale[localeIndex][0]+testLocale[localeIndex][1]);
    988         }
    989     }
    990 
    991     private void stress(String[] data, int data_length, Locale loc, String locName) {
    992         String[] skeleton = {
    993                 "EEEEdMMMMy",
    994                 "dMMMMy",
    995                 "dMMMM",
    996                 "MMMMy",
    997                 "EEEEdMMMM",
    998                 "EEEdMMMy",
    999                 "dMMMy",
   1000                 "dMMM",
   1001                 "MMMy",
   1002                 "EEEdMMM",
   1003                 "EEEdMy",
   1004                 "dMy",
   1005                 "dM",
   1006                 "My",
   1007                 "EEEdM",
   1008                 "d",
   1009                 "EEEd",
   1010                 "y",
   1011                 "M",
   1012                 "MMM",
   1013                 "MMMM",
   1014                 "hm",
   1015                 "hmv",
   1016                 "hmz",
   1017                 "h",
   1018                 "hv",
   1019                 "hz",
   1020                 "EEddMMyyyy", // following could be normalized
   1021                 "EddMMy",
   1022                 "hhmm",
   1023                 "hhmmzz",
   1024                 "hms",  // following could not be normalized
   1025                 "dMMMMMy",
   1026                 "EEEEEdM",
   1027         };
   1028 
   1029         int i = 0;
   1030 
   1031         SimpleDateFormat ref = new SimpleDateFormat(data[i++], loc);
   1032 
   1033         while (i<data_length) {
   1034             // 'f'
   1035             String datestr = data[i++];
   1036             String datestr_2 = data[i++];
   1037             Date date;
   1038             Date date_2;
   1039             try {
   1040                 date = ref.parse(datestr);
   1041                 date_2 = ref.parse(datestr_2);
   1042             } catch ( ParseException e ) {
   1043                 errln("parse exception" + e);
   1044                 continue;
   1045             }
   1046             DateInterval dtitv = new DateInterval(date.getTime(), date_2.getTime());
   1047 
   1048             for ( int skeletonIndex = 0;
   1049                     skeletonIndex < skeleton.length;
   1050                     ++skeletonIndex ) {
   1051                 String oneSkeleton = skeleton[skeletonIndex];
   1052                 // need special handle of "Thai" since the default calendar
   1053                 // of "Thai" is "Budd", not "Gregorian".
   1054                 DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(oneSkeleton, loc);
   1055                 /*
   1056                 if ( locName.equals("th") ) {
   1057                     // reset calendar to be Gregorian
   1058                     GregorianCalendar gregCal = new GregorianCalendar(loc);
   1059                     DateFormat dformat = dtitvfmt.getDateFormat();
   1060                     DateFormat newOne = (DateFormat)dformat.clone();
   1061                     newOne.setCalendar(gregCal);
   1062                     dtitvfmt.setDateFormat(newOne);
   1063                 }
   1064                  */
   1065                 dtitvfmt.format(dtitv);
   1066             }
   1067 
   1068 
   1069             // test interval format by algorithm
   1070             for ( int style = DateFormat.FULL; style  < 4; ++style ) {
   1071                 SimpleDateFormat dtfmt = (SimpleDateFormat) DateFormat.getDateInstance(style, loc);
   1072                 FieldPosition pos = new FieldPosition(0);
   1073                 StringBuffer str = new StringBuffer("");
   1074                 Calendar fromCalendar = (Calendar) dtfmt.getCalendar().clone();
   1075                 Calendar toCalendar = (Calendar) dtfmt.getCalendar().clone();
   1076                 fromCalendar.setTimeInMillis(dtitv.getFromDate());
   1077                 toCalendar.setTimeInMillis(dtitv.getToDate());
   1078                 dtfmt.intervalFormatByAlgorithm(fromCalendar, toCalendar, str, pos);
   1079             }
   1080         }
   1081     }
   1082 
   1083     /*
   1084      * Ticket#6396 DateIntervalInfo of ICU4J 4.0d3 throw NullPointerException
   1085      */
   1086     @Test
   1087     public void TestT6396() {
   1088         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("th_TH"));
   1089         try {
   1090             // ticket#6396 reported toString() throws NullPointerException
   1091             String diiStr = dii.toString();
   1092             logln("new DateIntervalInfo(new ULocale(\"th_TH\")).toString() - " + diiStr);
   1093 
   1094             // equals also had the similar problem
   1095             DateIntervalInfo dii1 = (DateIntervalInfo)dii.clone();
   1096             if (!dii.equals(dii1)) {
   1097                 errln("FAIL: Cloned DateIntervalInfo is not equal to the source");
   1098             }
   1099         } catch (Exception e) {
   1100             errln("FAIL: Exception - " + e.getClass().getName());
   1101         }
   1102     }
   1103 
   1104     @Test
   1105     public void TestConstructor() {
   1106         DateIntervalInfo diiJapan = new DateIntervalInfo(ULocale.JAPAN);
   1107         DateIntervalInfo diiJapanJ = new DateIntervalInfo(Locale.JAPAN);
   1108 
   1109         assertEquals("DateIntervalInfo constructors", diiJapan, diiJapanJ);
   1110     }
   1111 
   1112     /* Tests the method
   1113      *      public boolean equals(Object a)
   1114      */
   1115     @Test
   1116     public void TestDateIntervalInfoEquals(){
   1117         // Tests when "if ( a instanceof PatternInfo )" is false
   1118         DateIntervalInfo diia = new DateIntervalInfo();
   1119         if(diia.equals("dummy")){
   1120             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1121                     "false for a String object.");
   1122         }
   1123         if(diia.equals(0)){
   1124             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1125                     "false for an Integer object.");
   1126         }
   1127         if(diia.equals(0.0)){
   1128             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1129                     "false for an Integer object.");
   1130         }
   1131         if(diia.equals(new Object())){
   1132             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1133                     "false for an Integer object.");
   1134         }
   1135     }
   1136 
   1137     /* Tests the method
   1138      *      public Object cloneAsThawed()
   1139      */
   1140     @Test
   1141     public void TestCloseAsThawed(){
   1142         DateIntervalInfo dii = new DateIntervalInfo();
   1143         try{
   1144             dii.cloneAsThawed();
   1145         } catch(Exception e){
   1146             errln("DateIntervalInfo.closeAsThawed() was not suppose to return " +
   1147                     "an exception.");
   1148         }
   1149     }
   1150 
   1151     /* Tests the method
   1152      *      public boolean isFrozen()
   1153      */
   1154     @Test
   1155     public void TestIsFrozen(){
   1156         DateIntervalInfo dii = new DateIntervalInfo();
   1157         if(dii.isFrozen() != false){
   1158             errln("DateIntervalInfo.isFrozen() is suppose to return false.");
   1159         }
   1160         dii.freeze();
   1161 
   1162         if(dii.isFrozen() != true){
   1163             errln("DateIntervalInfo.isFrozen() is suppose to return true.");
   1164         }
   1165     }
   1166 
   1167     /* Tests the method
   1168      *      public boolean clone()
   1169      */
   1170     @Test
   1171     public void TestClone(){
   1172         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("en_US"));
   1173         DateIntervalInfo dii_clone = (DateIntervalInfo) dii.clone();
   1174         dii_clone.freeze();
   1175 
   1176         // Tests when "if ( frozen )" is true
   1177         if(!dii.equals(dii_clone)){
   1178             errln("DateIntervalInfo.clone() is suppose to return true for " +
   1179                     "an original DateIntervalInfo object and a clone of the " +
   1180                     "original DateIntervalInfo object.");
   1181         }
   1182     }
   1183 
   1184     /* Tests the method
   1185      *      public void setFallbackIntervalPattern(String fallbackPattern)
   1186      */
   1187     @Test
   1188     public void TestSetFallbackIntervalPattern(){
   1189         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("en_US"));
   1190         // Tests when "if ( frozen )" is true
   1191         try{
   1192             dii.freeze();
   1193             dii.setFallbackIntervalPattern("");
   1194             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1195                     "was suppose to return an exception for a frozen object.");
   1196         } catch (Exception e){}
   1197 
   1198         // Tests when "if ( firstPatternIndex == -1 || secondPatternIndex == -1 )" is true
   1199         dii = dii.cloneAsThawed();
   1200         try{
   1201             dii.setFallbackIntervalPattern("");
   1202             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1203                     "was suppose to return an exception for a string object of ''.");
   1204         } catch(Exception e){}
   1205 
   1206         try{
   1207             dii.setFallbackIntervalPattern("0");
   1208             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1209                     "was suppose to return an exception for a string object of 0.");
   1210         } catch(Exception e){}
   1211 
   1212         // Tests when "if ( firstPatternIndex > secondPatternIndex )" is true
   1213         dii.setFallbackIntervalPattern("{1}{0}");
   1214         if(dii.getDefaultOrder() != true)
   1215             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1216                     "was suppose to change the variable 'fFirstDateInPtnIsLaterDate' " +
   1217                     "to true.");
   1218     }
   1219 
   1220     /* Tests the method
   1221      *      public PatternInfo getIntervalPattern(String skeleton, int field)
   1222      */
   1223     @Test
   1224     public void TestGetIntervalPattern(){
   1225         // Tests when "if ( field > MINIMUM_SUPPORTED_CALENDAR_FIELD )" is true
   1226         // MINIMUM_SUPPORTED_CALENDAR_FIELD = Calendar.SECOND;
   1227         DateIntervalInfo dii = new DateIntervalInfo();
   1228         try{
   1229             dii.getIntervalPattern("", Calendar.SECOND+1);
   1230             errln("DateIntervalInfo.getIntervalPattern(String,int) was suppose " +
   1231                     "to return an exception for the 'int field' parameter " +
   1232                     "when it exceeds MINIMUM_SUPPORTED_CALENDAR_FIELD.");
   1233         } catch(Exception e){}
   1234     }
   1235 
   1236     /* Tests the method
   1237      *      public void setIntervalPattern(String skeleton, int lrgDiffCalUnit, String intervalPattern)
   1238      */
   1239     @Test
   1240     public void TestSetIntervalPattern(){
   1241         DateIntervalInfo dii = new DateIntervalInfo();
   1242         // Tests when "if ( frozen )" is true
   1243         try{
   1244             dii.freeze();
   1245             dii.setIntervalPattern("", 0, "");
   1246             errln("DateIntervalInfo.setIntervalPattern(String,int,String) " +
   1247                     "was suppose to return an exception when the " +
   1248                     "DateIntervalInfo object is frozen.");
   1249         } catch(Exception e){}
   1250 
   1251         // Tests when "if ( lrgDiffCalUnit > MINIMUM_SUPPORTED_CALENDAR_FIELD )" is true
   1252         // MINIMUM_SUPPORTED_CALENDAR_FIELD = Calendar.SECOND;
   1253         try{
   1254             dii = dii.cloneAsThawed();
   1255             dii.setIntervalPattern("", Calendar.SECOND+1, "");
   1256             errln("DateIntervalInfo.setIntervalPattern(String,int,String) " +
   1257                     "was suppose to return an exception when the " +
   1258                     "variable 'lrgDiffCalUnit' is greater than " +
   1259                     "MINIMUM_SUPPORTED_CALENDAR_FIELD.");
   1260         } catch(Exception e){}
   1261     }
   1262 
   1263     @Test
   1264     public void TestSetIntervalPatternNoSideEffect() {
   1265         PatternInfo patternInfo = new DateIntervalInfo(ULocale.ENGLISH).getIntervalPattern("yMd", Calendar.DATE);
   1266         String expectedPattern = patternInfo.getFirstPart() + patternInfo.getSecondPart();
   1267         new DateIntervalInfo(ULocale.ENGLISH).setIntervalPattern(
   1268                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1269         patternInfo = new DateIntervalInfo(ULocale.ENGLISH).getIntervalPattern("yMd", Calendar.DATE);
   1270         String actualPattern = patternInfo.getFirstPart() + patternInfo.getSecondPart();
   1271         assertEquals(
   1272                 "setIntervalPattern should not have side effects",
   1273                 expectedPattern,
   1274                 actualPattern);
   1275     }
   1276 
   1277     @Test
   1278     public void TestGetSetTimeZone(){
   1279         DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("MMMdHHmm", Locale.ENGLISH);
   1280         long date1 = 1299090600000L; // 2011-Mar-02 1030 in US/Pacific, 2011-Mar-03 0330 in Asia/Tokyo
   1281         long date2 = 1299115800000L; // 2011-Mar-02 1730 in US/Pacific, 2011-Mar-03 1030 in Asia/Tokyo
   1282         DateInterval dtitv = new DateInterval(date1, date2);
   1283         TimeZone tzCalif = TimeZone.getFrozenTimeZone("US/Pacific");
   1284         TimeZone tzTokyo = TimeZone.getFrozenTimeZone("Asia/Tokyo");
   1285         String fmtCalif = "Mar 2, 10:30 \u2013 17:30"; // ICU4C result is "Mar 2, 10:30 \u2013 17:30" (does not duplicate day)
   1286         String fmtTokyo = "Mar 3, 03:30 \u2013 10:30"; // ICU4C result is "Mar 3, 03:30 \u2013 10:30" (does not duplicate day)
   1287 
   1288         StringBuffer buf = new StringBuffer();
   1289         FieldPosition pos = new FieldPosition(0);
   1290         dtitvfmt.setTimeZone(tzCalif);
   1291         dtitvfmt.format(dtitv, buf, pos);
   1292         if (!buf.toString().equals(fmtCalif)) {
   1293             errln("DateIntervalFormat for tzCalif, expect \"" + fmtCalif + "\", get \"" + buf + "\"");
   1294         }
   1295 
   1296         buf.setLength(0);
   1297         pos.setBeginIndex(0);
   1298         dtitvfmt.setTimeZone(tzTokyo);
   1299         dtitvfmt.format(dtitv, buf, pos);
   1300         if (!buf.toString().equals(fmtTokyo)) {
   1301             errln("DateIntervalFormat for tzTokyo, expect \"" + fmtTokyo + "\", get \"" + buf + "\"");
   1302         }
   1303 
   1304         if (!dtitvfmt.getTimeZone().equals(tzTokyo)) {
   1305             errln("DateIntervalFormat.getTimeZone() returns mismatch");
   1306         }
   1307     }
   1308 
   1309 
   1310     /* Tests the method
   1311      *      public int hashCode()
   1312      */
   1313     @Test
   1314     public void TestHashCode(){
   1315         // Tests when
   1316         //      "int hash = fIntervalPatternFirstPart != null ? fIntervalPatternFirstPart.hashCode() : 0;"
   1317         // is false
   1318         PatternInfo dp = new PatternInfo(null, null, false);
   1319         if(dp.hashCode() != 0){
   1320             errln("PatternInfo.hashCode() was suppose to return 0 for a null " +
   1321                     "paramter in the constructor.");
   1322         }
   1323     }
   1324 
   1325     /* Tests the method
   1326      *      public boolean equals(Object a)
   1327      * in PatternInfo
   1328      */
   1329     @Test
   1330     public void TestPattternInfoEquals(){
   1331         // Tests when "if ( a instanceof PatternInfo )" is false
   1332         PatternInfo pi = new PatternInfo("","", false);
   1333         if(pi.equals(new Object())){
   1334             errln("PatternInfo.equals(Object) is suppose to return false " +
   1335                     "when it is not an instance of PatternInfo.");
   1336         }
   1337         if(pi.equals("")){
   1338             errln("PatternInfo.equals(Object) is suppose to return false " +
   1339                     "when it is not an instance of PatternInfo.");
   1340         }
   1341         if(pi.equals(0)){
   1342             errln("PatternInfo.equals(Object) is suppose to return false " +
   1343                     "when it is not an instance of PatternInfo.");
   1344         }
   1345         if(pi.equals(0.0)){
   1346             errln("PatternInfo.equals(Object) is suppose to return false " +
   1347                     "when it is not an instance of PatternInfo.");
   1348         }
   1349     }
   1350 
   1351     @Test
   1352     public void TestDateIntervalCoverage() {
   1353         DateInterval di = new DateInterval(0, 1);
   1354 
   1355         if (di.equals("Test")) {
   1356             errln("Comparison test should fail.");
   1357         }
   1358 
   1359         if (di.toString() == null) {
   1360             errln("toString should not return null.");
   1361         }
   1362 
   1363         if (di.hashCode() != 1) {
   1364             errln("hasCode() should return 1.");
   1365         }
   1366     }
   1367 
   1368     @Test
   1369     public void testGetInstance_String_DateIntervalInfo() {
   1370         DateIntervalInfo dateIntervalInfo = new DateIntervalInfo(new ULocale("ca"));
   1371         DateIntervalFormat dateIntervalFormat = DateIntervalFormat.getInstance(
   1372                 DateFormat.YEAR_MONTH, Locale.ENGLISH, dateIntervalInfo);
   1373         Calendar from = Calendar.getInstance();
   1374         from.set(2000, Calendar.JANUARY, 1, 12, 0);
   1375         Calendar to = Calendar.getInstance();
   1376         to.set(2001, Calendar.FEBRUARY, 1, 12, 0);
   1377         DateInterval interval = new DateInterval(from.getTimeInMillis(), to.getTimeInMillis());
   1378         dateIntervalFormat.setTimeZone(from.getTimeZone());
   1379         // Month names are default (English), format is Catalan
   1380         assertEquals("Wrong date interval",
   1381                 "January de 2000  February de 2001", dateIntervalFormat.format(interval));
   1382     }
   1383 
   1384     @Test
   1385     public void testGetInstance_String_Locale_DateIntervalInfo() {
   1386         DateIntervalInfo dateIntervalInfo = new DateIntervalInfo(new ULocale("ca"));
   1387         DateIntervalFormat dateIntervalFormat = DateIntervalFormat.getInstance(
   1388                 DateFormat.YEAR_MONTH, Locale.GERMAN, dateIntervalInfo);
   1389         Calendar from = Calendar.getInstance();
   1390         from.set(2000, Calendar.JANUARY, 1, 12, 0);
   1391         Calendar to = Calendar.getInstance();
   1392         to.set(2001, Calendar.FEBRUARY, 1, 12, 0);
   1393         DateInterval interval = new DateInterval(from.getTimeInMillis(), to.getTimeInMillis());
   1394         dateIntervalFormat.setTimeZone(from.getTimeZone());
   1395         // Month names are German, format is Catalan
   1396         assertEquals("Wrong date interval",
   1397                 "Januar de 2000  Februar de 2001", dateIntervalFormat.format(interval));
   1398     }
   1399 
   1400     @Test(expected = UnsupportedOperationException.class)
   1401     public void testParseObject_notSupported() throws ParseException {
   1402         DateIntervalFormat.getInstance(DateFormat.YEAR_MONTH).parseObject("");
   1403     }
   1404 
   1405     @Test
   1406     public void TestDateIntervalFormatCoverage() throws Exception{
   1407         long date1 = 1299090600000L;
   1408         long date2 = 1299115800000L;
   1409         DateInterval dtitv = new DateInterval(date1, date2);
   1410         DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("MMMd", Locale.ENGLISH);
   1411         DateIntervalInfo dtintinf = new DateIntervalInfo(ULocale.ENGLISH);
   1412 
   1413         // Check the default private constructor
   1414         checkDefaultPrivateConstructor(DateIntervalFormat.class);
   1415 
   1416         // Check clone
   1417         DateIntervalFormat dtitvfmtClone = (DateIntervalFormat) dtitvfmt.clone();
   1418         assertEquals("DateIntervalFormat.clone() failed", dtitvfmt.format(dtitv), dtitvfmtClone.format(dtitv));
   1419 
   1420         // Coverage for getInstance
   1421         assertNotNull("Expected DateIntervalFormat object", DateIntervalFormat.getInstance("MMMd", dtintinf));
   1422         assertNotNull("Expected DateIntervalFormat object",
   1423                 DateIntervalFormat.getInstance("MMMdHHmm", Locale.ENGLISH, dtintinf));
   1424 
   1425         // Coverage for parseObject. Exception expected.
   1426         try {
   1427             dtitvfmt.parseObject("", new ParsePosition(0));
   1428             errln("Exception was expected when calling DateIntervalFormat.parseObject()");
   1429         } catch (Exception e) { /* No op */ }
   1430 
   1431         // Check getPatterns()
   1432         Output<String> secondPart = new Output<String>();
   1433         Calendar fromCalendar = Calendar.getInstance(Locale.ENGLISH);
   1434         fromCalendar.set(2016, 5, 22);
   1435         Calendar toCalendar= Calendar.getInstance(Locale.ENGLISH);
   1436         toCalendar.set(2016, 5, 23);
   1437         assertEquals("Date interval pattern mismatch.",
   1438                 dtitvfmt.getPatterns(fromCalendar, toCalendar, secondPart), "MMM d  ");
   1439         assertEquals("Date interval pattern mismatch.", secondPart.value, "d");
   1440     }
   1441 
   1442     @Test
   1443     public void TestTicket9919GetInstance() {
   1444         // Creating a DateIntervalFormat with a custom DateIntervalInfo
   1445         // object used to corrupt the cache.
   1446         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1447                 "yMd", ULocale.ENGLISH);
   1448         Calendar from = Calendar.getInstance();
   1449         Calendar to = Calendar.getInstance();
   1450         from.set(2013, 3, 26);
   1451         to.set(2013, 3, 28);
   1452 
   1453         // Save. This is the correct answer
   1454         String expected =
   1455                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1456                 .toString();
   1457 
   1458         // Now create a DateIntervalFormat with same skeleton and
   1459         // locale, but with a custom DateIntervalInfo. This used
   1460         // to corrupt the cache.
   1461         DateIntervalInfo dateIntervalInfo =
   1462                 new DateIntervalInfo(ULocale.ENGLISH);
   1463         dateIntervalInfo.setIntervalPattern(
   1464                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1465         DateIntervalFormat.getInstance(
   1466                 "yMd", ULocale.ENGLISH, dateIntervalInfo);
   1467 
   1468         // Now create a DateIntervalFormat with same skeleton and
   1469         // locale, but with default DateIntervalInfo. The cache should
   1470         // not be corrupted, and we should get the same answer as before.
   1471         dif = DateIntervalFormat.getInstance("yMd", ULocale.ENGLISH);
   1472 
   1473         assertEquals(
   1474                 "Custom DateIntervalInfo objects should not mess up cache",
   1475                 expected,
   1476                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1477                 .toString());
   1478 
   1479     }
   1480 
   1481     @Test
   1482     public void TestTicket9919Setter() {
   1483 
   1484         // Creating a DateIntervalFormat with a custom DateIntervalInfo
   1485         // object used to corrupt the cache.
   1486         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1487                 "yMd", ULocale.ENGLISH);
   1488         Calendar from = Calendar.getInstance();
   1489         Calendar to = Calendar.getInstance();
   1490         from.set(2013, 3, 26);
   1491         to.set(2013, 3, 28);
   1492 
   1493         // Save. This is the correct answer
   1494         String expected =
   1495                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1496                 .toString();
   1497 
   1498         // Now create a DateIntervalFormat with same skeleton and
   1499         // locale, but with a custom DateIntervalInfo. This used
   1500         // to corrupt the cache.
   1501         DateIntervalInfo dateIntervalInfo =
   1502                 new DateIntervalInfo(ULocale.ENGLISH);
   1503         dateIntervalInfo.setIntervalPattern(
   1504                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1505         DateIntervalFormat bad = DateIntervalFormat.getInstance(
   1506                 "yMd", ULocale.ENGLISH);
   1507         bad.setDateIntervalInfo(dateIntervalInfo);
   1508 
   1509         // Now create a DateIntervalFormat with same skeleton and
   1510         // locale, but with default DateIntervalInfo. The cache should
   1511         // not be corrupted, and we should get the same answer as before.
   1512         dif = DateIntervalFormat.getInstance("yMd", ULocale.ENGLISH);
   1513         assertEquals(
   1514                 "Custom DateIntervalInfo objects should not mess up cache",
   1515                 expected,
   1516                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1517                 .toString());
   1518     }
   1519 
   1520     @Test
   1521     public void TestTicket9914() {
   1522         DateIntervalInfo dateIntervalInfo =
   1523                 new DateIntervalInfo(ULocale.ENGLISH);
   1524 
   1525         Calendar from = Calendar.getInstance();
   1526         Calendar to = Calendar.getInstance();
   1527         from.set(113, 3, 26);
   1528         to.set(113, 3, 28);
   1529         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1530                 "yyyyMd", ULocale.ENGLISH, dateIntervalInfo);
   1531         assertEquals(
   1532                 "yyyyMd skeleton.",
   1533                 "4/26/0113 \u2013 4/28/0113",
   1534                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1535                 .toString());
   1536 
   1537         dif = DateIntervalFormat.getInstance(
   1538                 "yyMd", ULocale.ENGLISH, dateIntervalInfo);
   1539         assertEquals(
   1540                 "yyMd skeleton.",
   1541                 "4/26/13 \u2013 4/28/13",
   1542                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1543                 .toString());
   1544 
   1545         dif = DateIntervalFormat.getInstance(
   1546                 "yMd", ULocale.ENGLISH, dateIntervalInfo);
   1547         assertEquals(
   1548                 "yMd skeleton.",
   1549                 "4/26/113 \u2013 4/28/113",
   1550                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1551                 .toString());
   1552     }
   1553 
   1554     @Test
   1555     public void TestTicket11583 () {
   1556         ULocale[] locales = {
   1557                 ULocale.ENGLISH,
   1558                 SPANISH,
   1559                 LA_SPANISH,
   1560                 };
   1561         String[] skeletons = {
   1562                 "yMMMMd", "yMMMM", "MMMM",
   1563                 "yMMMd", "yMMM", "MMM",
   1564                 "yMMd", "yMMdd", "yMM", "MM",
   1565                 "yMdd", "yMd", "yM", "M"
   1566                 };
   1567 
   1568         final long startDate = 1232364615000L;
   1569         final long endDate = 1240399815000L;
   1570         String filterPattern = null ; // "yMMM";
   1571 
   1572         for (ULocale locale : locales) {
   1573             for (String skeleton : skeletons) {
   1574                 if (filterPattern != null && !skeleton.equals(filterPattern)) {
   1575                     continue;
   1576                 }
   1577 
   1578                 DateFormat dateFormat = DateFormat.getPatternInstance(skeleton, locale);
   1579                 String dateFormatPattern = ((SimpleDateFormat)dateFormat).toPattern();
   1580 
   1581                 DateIntervalFormat intervalFormat = DateIntervalFormat.getInstance(skeleton, locale);
   1582                 DateIntervalInfo intervalInfo = intervalFormat.getDateIntervalInfo();
   1583 
   1584                 if (skeleton.equals(filterPattern)) {
   1585                     logln(filterPattern + " => " + intervalInfo.getRawPatterns().get(filterPattern));
   1586                 }
   1587 
   1588                 DateInterval date_interval = new DateInterval(startDate, endDate);
   1589 
   1590                 String interval = intervalFormat.format(date_interval);
   1591 
   1592                 String formattedStart = dateFormat.format(startDate);
   1593                 String formattedEnd = dateFormat.format(endDate);
   1594 
   1595                 PatternInfo patternInfo = intervalFormat.getRawPatterns().get("M");
   1596 
   1597                 String firstPart = patternInfo.getFirstPart();
   1598                 String secondPart = patternInfo.getSecondPart();
   1599                 if (!matches(dateFormatPattern, firstPart, secondPart)) {
   1600                     if (logKnownIssue("11585", "incompatible pattern between date format and date interval format")) {
   1601                         logln("For skeleton " + skeleton + "/locale " + locale + ": mismatch between date format "
   1602                                 + dateFormatPattern + " and date interval format " + firstPart + secondPart + ".");
   1603                     } else {
   1604                         errln("For skeleton " + skeleton + "/locale " + locale + ": mismatch between date format "
   1605                                 + dateFormatPattern + " and date interval format " + firstPart + secondPart + ".");
   1606                     }
   1607                 }
   1608 
   1609                 logln(locale
   1610                         + "\tskeleton: " + skeleton
   1611                         + "\tpattern: " + dateFormatPattern
   1612                         + "\tintervalPattern1: " + firstPart
   1613                         + "\tintervalPattern2: " + secondPart
   1614                         + "\tstartDate: " + formattedStart
   1615                         + "\tendDate: " + formattedEnd
   1616                         + "\tinterval: " + interval
   1617                         + ""
   1618                         );
   1619             }
   1620         }
   1621     }
   1622 
   1623 
   1624     /**
   1625      * Return true if for some x, y: dateFormatPattern = firstPart(0,x) + secondPart(y, secondPart.length())
   1626      * @param dateFormatPattern
   1627      * @param firstPart
   1628      * @param secondPart
   1629      * @return
   1630      */
   1631     private boolean matches(String dateFormatPattern, String firstPart, String secondPart) {
   1632         // brute force for now
   1633         int lastButOne = dateFormatPattern.length()-1;
   1634         for (int i = 1; i < lastButOne; ++i) {
   1635             if (firstPart.startsWith(dateFormatPattern.substring(0,i))
   1636                     && secondPart.endsWith(dateFormatPattern.substring(i,dateFormatPattern.length()))) {
   1637                 return true;
   1638             }
   1639         }
   1640         return false;
   1641     }
   1642 
   1643     @Test
   1644     public void TestFPos_SkelWithSeconds () {
   1645 
   1646         final long[] deltas = {
   1647 	        0L, // none
   1648 	        200L, // 200 millisec
   1649 	        20000L, // 20 sec
   1650 	        1200000L, // 20 min
   1651 	        7200000L, // 2 hrs
   1652 	        43200000L, // 12 hrs
   1653 	        691200000L, // 8 days
   1654 	        1382400000L, // 16 days,
   1655 	        8640000000L, // 100 days
   1656         };
   1657 
   1658         class ExpectPosAndFormat {
   1659             public int posBegin;
   1660             public int posEnd;
   1661             public String format;
   1662              // Simple constructor
   1663             public ExpectPosAndFormat(int pBegin, int pEnd, String fmt) {
   1664                 posBegin = pBegin;
   1665                 posEnd = pEnd;
   1666                 format = fmt;
   1667             }
   1668         };
   1669 
   1670         final ExpectPosAndFormat[] exp_en_HHmm = {
   1671             new ExpectPosAndFormat(  3,  5, "09:00" ),
   1672             new ExpectPosAndFormat(  3,  5, "09:00" ),
   1673             new ExpectPosAndFormat(  3,  5, "09:00" ),
   1674             new ExpectPosAndFormat(  3,  5, "09:00 \u2013 09:20" ),
   1675             new ExpectPosAndFormat(  3,  5, "09:00 \u2013 11:00" ),
   1676             new ExpectPosAndFormat(  3,  5, "09:00 \u2013 21:00" ),
   1677             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00 \u2013 11/28/2014, 09:00" ),
   1678             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00 \u2013 12/6/2014, 09:00" ),
   1679             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00 \u2013 2/28/2015, 09:00" )
   1680         };
   1681 
   1682         final ExpectPosAndFormat[] exp_en_HHmmss = {
   1683             new ExpectPosAndFormat(  3,  5, "09:00:00" ),
   1684             new ExpectPosAndFormat(  3,  5, "09:00:00" ),
   1685             new ExpectPosAndFormat(  3,  5, "09:00:00 \u2013 09:00:20" ),
   1686             new ExpectPosAndFormat(  3,  5, "09:00:00 \u2013 09:20:00" ),
   1687             new ExpectPosAndFormat(  3,  5, "09:00:00 \u2013 11:00:00" ),
   1688             new ExpectPosAndFormat(  3,  5, "09:00:00 \u2013 21:00:00" ),
   1689             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00:00 \u2013 11/28/2014, 09:00:00" ),
   1690             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00:00 \u2013 12/6/2014, 09:00:00" ),
   1691             new ExpectPosAndFormat( 15, 17, "11/20/2014, 09:00:00 \u2013 2/28/2015, 09:00:00" )
   1692         };
   1693 
   1694         final ExpectPosAndFormat[] exp_en_yyMMdd = {
   1695             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1696             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1697             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1698             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1699             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1700             new ExpectPosAndFormat(  0,  0, "11/20/14" ),
   1701             new ExpectPosAndFormat(  0,  0, "11/20/14 \u2013 11/28/14" ),
   1702             new ExpectPosAndFormat(  0,  0, "11/20/14 \u2013 12/6/14" ),
   1703             new ExpectPosAndFormat(  0,  0, "11/20/14 \u2013 2/28/15" )
   1704         };
   1705 
   1706         final ExpectPosAndFormat[] exp_en_yyMMddHHmm = {
   1707             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00" ),
   1708             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00" ),
   1709             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00" ),
   1710             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 09:20" ),
   1711             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 11:00" ),
   1712             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 21:00" ),
   1713             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 11/28/14, 09:00" ),
   1714             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 12/06/14, 09:00" ),
   1715             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00 \u2013 02/28/15, 09:00" )
   1716         };
   1717 
   1718         final ExpectPosAndFormat[] exp_en_yyMMddHHmmss = {
   1719             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00" ),
   1720             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00" ),
   1721             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 09:00:20" ),
   1722             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 09:20:00" ),
   1723             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 11:00:00" ),
   1724             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 21:00:00" ),
   1725             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 11/28/14, 09:00:00" ),
   1726             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 12/06/14, 09:00:00" ),
   1727             new ExpectPosAndFormat( 13, 15, "11/20/14, 09:00:00 \u2013 02/28/15, 09:00:00" )
   1728         };
   1729 
   1730         @SuppressWarnings("unused")
   1731         final ExpectPosAndFormat[] exp_en_yMMMdhmmssz = {
   1732             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT" ),
   1733             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT" ),
   1734             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 9:00:20 AM GMT" ),
   1735             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 9:20:00 AM GMT" ),
   1736             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 11:00:00 AM GMT" ),
   1737             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 9:00:00 PM GMT" ),
   1738             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 Nov 28, 2014, 9:00:00 AM GMT" ),
   1739             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 Dec 6, 2014, 9:00:00 AM GMT" ),
   1740             new ExpectPosAndFormat( 16, 18, "Nov 20, 2014, 9:00:00 AM GMT \u2013 Feb 28, 2015, 9:00:00 AM GMT" )
   1741         };
   1742 
   1743         final ExpectPosAndFormat[] exp_ja_yyMMddHHmm = {
   1744             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00" ),
   1745             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00" ),
   1746             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00" ),
   1747             new ExpectPosAndFormat( 11, 13, "14/11/20 9\u664200\u5206\uFF5E9\u664220\u5206" ),
   1748             new ExpectPosAndFormat( 11, 13, "14/11/20 9\u664200\u5206\uFF5E11\u664200\u5206" ),
   1749             new ExpectPosAndFormat( 11, 13, "14/11/20 9\u664200\u5206\uFF5E21\u664200\u5206" ),
   1750             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00\uFF5E14/11/28 9:00" ),
   1751             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00\uFF5E14/12/06 9:00" ),
   1752             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00\uFF5E15/02/28 9:00" )
   1753         };
   1754 
   1755         final ExpectPosAndFormat[] exp_ja_yyMMddHHmmss = {
   1756             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00" ),
   1757             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00" ),
   1758             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E9:00:20" ),
   1759             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E9:20:00" ),
   1760             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E11:00:00" ),
   1761             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E21:00:00" ),
   1762             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E14/11/28 9:00:00" ),
   1763             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E14/12/06 9:00:00" ),
   1764             new ExpectPosAndFormat( 11, 13, "14/11/20 9:00:00\uFF5E15/02/28 9:00:00" )
   1765         };
   1766 
   1767         final ExpectPosAndFormat[] exp_ja_yMMMdHHmmss = {
   1768             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00" ),
   1769             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00" ),
   1770             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E9:00:20" ),
   1771             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E9:20:00" ),
   1772             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E11:00:00" ),
   1773             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E21:00:00" ),
   1774             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E2014\u5E7411\u670828\u65E5 9:00:00" ),
   1775             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E2014\u5E7412\u67086\u65E5 9:00:00" ),
   1776             new ExpectPosAndFormat( 14, 16, "2014\u5E7411\u670820\u65E5 9:00:00\uFF5E2015\u5E742\u670828\u65E5 9:00:00" )
   1777         };
   1778 
   1779         class LocaleAndSkeletonItem {
   1780             public String locale;
   1781             public String skeleton;
   1782             public int fieldToCheck;
   1783             public ExpectPosAndFormat[] expected;
   1784              // Simple constructor
   1785             public LocaleAndSkeletonItem(String loc, String skel, int field, ExpectPosAndFormat[] exp) {
   1786                 locale = loc;
   1787                 skeleton = skel;
   1788                 fieldToCheck = field;
   1789                 expected = exp;
   1790             }
   1791         };
   1792 
   1793         final LocaleAndSkeletonItem[] locSkelItems = {
   1794            new LocaleAndSkeletonItem( "en",		"HHmm",         DateFormat.MINUTE_FIELD, exp_en_HHmm ),
   1795            new LocaleAndSkeletonItem( "en",		"HHmmss",       DateFormat.MINUTE_FIELD, exp_en_HHmmss ),
   1796            new LocaleAndSkeletonItem( "en",		"yyMMdd",       DateFormat.MINUTE_FIELD, exp_en_yyMMdd ),
   1797            new LocaleAndSkeletonItem( "en",		"yyMMddHHmm",   DateFormat.MINUTE_FIELD, exp_en_yyMMddHHmm ),
   1798            new LocaleAndSkeletonItem( "en",		"yyMMddHHmmss", DateFormat.MINUTE_FIELD, exp_en_yyMMddHHmmss ),
   1799         // skip the following until ICU4J DateIntervalFormat has support for setting time zone
   1800         // new LocaleAndSkeletonItem( "en",		"yMMMdhmmssz",  DateFormat.MINUTE_FIELD, exp_en_yMMMdhmmssz ),
   1801            new LocaleAndSkeletonItem( "ja",		"yyMMddHHmm",   DateFormat.MINUTE_FIELD, exp_ja_yyMMddHHmm ),
   1802            new LocaleAndSkeletonItem( "ja",		"yyMMddHHmmss", DateFormat.MINUTE_FIELD, exp_ja_yyMMddHHmmss ),
   1803            new LocaleAndSkeletonItem( "ja",		"yMMMdHHmmss",  DateFormat.MINUTE_FIELD, exp_ja_yMMMdHHmmss )
   1804         };
   1805 
   1806         //final String zoneGMT = "GMT";
   1807         final long startTimeGMT = 1416474000000L; // 2014 Nov 20 09:00 GMT
   1808 
   1809         TimeZone localZone = TimeZone.getDefault();
   1810         long startTime = startTimeGMT - localZone.getOffset(startTimeGMT);
   1811         for (LocaleAndSkeletonItem item: locSkelItems) {
   1812             DateIntervalFormat difmt = DateIntervalFormat.getInstance(item.skeleton, new ULocale(item.locale));
   1813             int dIdx, dCount = deltas.length;
   1814             for (dIdx = 0; dIdx < dCount; dIdx++) {
   1815                 DateInterval di = new DateInterval(startTime, startTime + deltas[dIdx]);
   1816                 StringBuffer actual = new StringBuffer(64);
   1817                 FieldPosition pos = new FieldPosition(item.fieldToCheck);
   1818                 String actualString = difmt.format(di, actual, pos).toString();
   1819                 ExpectPosAndFormat expectPosFmt = item.expected[dIdx];
   1820                 if (!actualString.equals(expectPosFmt.format) ||
   1821                         pos.getBeginIndex() != expectPosFmt.posBegin || pos.getEndIndex() != expectPosFmt.posEnd) {
   1822                     errln("For locale " + item.locale + ", skeleton " + item.skeleton + ", delta " + deltas[dIdx] +
   1823                            ": expect " + expectPosFmt.posBegin + "-" + expectPosFmt.posEnd + " \"" + expectPosFmt.format +
   1824                            "\"; get " + pos.getBeginIndex() + "-" + pos.getEndIndex() + " \"" + actualString + "\"");
   1825                 }
   1826             }
   1827         }
   1828     }
   1829 
   1830     // TestTicket11669 - Check the thread safety of DateIntervalFormat.format().
   1831     //                   This test failed with ICU 56.
   1832     @Test
   1833     public void TestTicket11669 () {
   1834         // These final variables are accessed directly by the concurrent threads.
   1835         final DateIntervalFormat formatter = DateIntervalFormat.getInstance(DateFormat.YEAR_MONTH_DAY, ULocale.US);
   1836         final ArrayList<DateInterval> testIntervals = new ArrayList<DateInterval>();
   1837         final ArrayList<String>expectedResults = new ArrayList<String>();
   1838 
   1839         // Create and save the input test data.
   1840         TimeZone tz = TimeZone.getTimeZone("Americal/Los_Angeles");
   1841         Calendar intervalStart = Calendar.getInstance(tz, ULocale.US);
   1842         Calendar intervalEnd = Calendar.getInstance(tz, ULocale.US);
   1843         intervalStart.set(2009,  6, 1);
   1844         intervalEnd.set(2009, 6, 2);
   1845         testIntervals.add(new DateInterval(intervalStart.getTimeInMillis(), intervalEnd.getTimeInMillis()));
   1846         intervalStart.set(2015, 2, 27);
   1847         intervalEnd.set(2015, 3, 1);
   1848         testIntervals.add(new DateInterval(intervalStart.getTimeInMillis(), intervalEnd.getTimeInMillis()));
   1849 
   1850         // Run the formatter single-threaded to create and save the expected results.
   1851         for (DateInterval interval: testIntervals) {
   1852             FieldPosition pos = new FieldPosition(0);
   1853             StringBuffer result = new StringBuffer();
   1854             formatter.format(interval, result, pos);
   1855             expectedResults.add(result.toString());
   1856         }
   1857 
   1858         class TestThread extends Thread {
   1859             public String errorMessage;
   1860             @Override
   1861             public void run() {
   1862                 for (int loop=0; loop < 2000; ++loop) {
   1863                     ListIterator<String> expectedItr = expectedResults.listIterator();
   1864                     for (DateInterval interval: testIntervals) {
   1865                         String expected = expectedItr.next();
   1866                         FieldPosition pos = new FieldPosition(0);
   1867                         StringBuffer result = new StringBuffer();
   1868                         formatter.format(interval, result, pos);
   1869                         if (!expected.equals(result.toString())) {
   1870                             // Note: The ICU test framework doesn't support reporting failures from within a sub-thread.
   1871                             //       Save the failure for the main thread to pick up later.
   1872                             errorMessage = String.format("Expected \"%s\", actual \"%s\"", expected, result);
   1873                             return;
   1874                         }
   1875                     }
   1876                 }
   1877             }
   1878         }
   1879 
   1880         List<TestThread> threads = new ArrayList<TestThread>();
   1881         for (int i=0; i<4; ++i) {
   1882             threads.add(new TestThread());
   1883         }
   1884         for (Thread t: threads) {
   1885             t.start();
   1886         }
   1887         for (TestThread t: threads) {
   1888             try {
   1889                 t.join();
   1890             } catch (InterruptedException e) {
   1891                 fail("Unexpected exception: " + e.toString());
   1892             }
   1893             if (t.errorMessage != null) {
   1894                 fail(t.errorMessage);
   1895             }
   1896         }
   1897     }
   1898 }
   1899