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