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