Home | History | Annotate | Download | only in format
      1 /*
      2  *******************************************************************************
      3  * Copyright (C) 2001-2015, International Business Machines Corporation and    *
      4  * others. All Rights Reserved.                                                *
      5  *******************************************************************************
      6  */
      7 
      8 /**
      9  * Port From:   ICU4C v1.8.1 : format : DateIntervalFormatTest
     10  * Source File: $ICU4CRoot/source/test/intltest/dtifmtts.cpp
     11  **/
     12 
     13 package com.ibm.icu.dev.test.format;
     14 
     15 import java.text.FieldPosition;
     16 import java.text.ParseException;
     17 import java.util.Date;
     18 import java.util.Locale;
     19 
     20 import com.ibm.icu.impl.Utility;
     21 import com.ibm.icu.text.DateFormat;
     22 import com.ibm.icu.text.DateIntervalFormat;
     23 import com.ibm.icu.text.DateIntervalInfo;
     24 import com.ibm.icu.text.DateIntervalInfo.PatternInfo;
     25 import com.ibm.icu.text.SimpleDateFormat;
     26 import com.ibm.icu.util.Calendar;
     27 import com.ibm.icu.util.DateInterval;
     28 import com.ibm.icu.util.TimeZone;
     29 import com.ibm.icu.util.ULocale;
     30 
     31 public class DateIntervalFormatTest extends com.ibm.icu.dev.test.TestFmwk {
     32 
     33     /**
     34      *
     35      */
     36     private static final ULocale SPANISH = new ULocale("es");
     37     /**
     38      *
     39      */
     40     private static final ULocale LA_SPANISH = new ULocale("es-419");
     41 
     42     public static void main(String[] args) throws Exception {
     43         new DateIntervalFormatTest().run(args);
     44     }
     45 
     46 
     47     /**
     48      * Test format
     49      */
     50     public void TestFormat() {
     51         // first item is date pattern
     52         // followed by a group of locale/from_data/to_data/skeleton/interval_data
     53         String[] DATA = {
     54                 "yyyy MM dd HH:mm:ss",
     55                 // test root
     56                 "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
     57 
     58                 // test 'H' and 'h', using availableFormat in fallback
     59                 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
     60                 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
     61 
     62                 // test skeleton with both date and time
     63                 "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",
     64 
     65                 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 \\u2013 11:10 AM",
     66 
     67                 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
     68 
     69                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
     70 
     71                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
     72 
     73                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
     74 
     75                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
     76 
     77                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
     78 
     79                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
     80 
     81                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
     82 
     83                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
     84 
     85                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
     86 
     87                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
     88 
     89                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
     90 
     91                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
     92 
     93                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
     94 
     95                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
     96 
     97                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
     98 
     99                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
    100 
    101                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
    102 
    103                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007 \\u2013 2008",
    104 
    105                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
    106 
    107                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
    108 
    109                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
    110 
    111                 "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",
    112 
    113                 "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",
    114 
    115                 "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",
    116 
    117                 "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",
    118 
    119                 "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",
    120 
    121                 "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",
    122 
    123                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    124 
    125                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
    126 
    127                 "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",
    128 
    129                 "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",
    130 
    131                 "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",
    132 
    133                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
    134 
    135                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
    136 
    137                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
    138 
    139                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
    140 
    141                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
    142 
    143                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October \\u2013 November 2007",
    144 
    145                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
    146 
    147                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
    148 
    149                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
    150 
    151                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
    152 
    153                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct \\u2013 Nov 2007",
    154 
    155                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
    156 
    157                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    158 
    159                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
    160 
    161                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10/10 \\u2013 11/10",
    162 
    163                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
    164 
    165                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
    166 
    167                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
    168 
    169                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
    170 
    171                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
    172 
    173                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10 \\u2013 11",
    174 
    175                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct \\u2013 Nov",
    176 
    177                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October \\u2013 November",
    178 
    179                 "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",
    180 
    181                 "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",
    182 
    183                 "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",
    184 
    185                 "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",
    186 
    187                 "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",
    188 
    189                 "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",
    190 
    191                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    192 
    193                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
    194 
    195                 "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",
    196 
    197                 "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",
    198 
    199                 "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",
    200 
    201                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
    202 
    203                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
    204 
    205                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
    206 
    207                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10 \\u2013 20, 2007",
    208 
    209                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10 \\u2013 20",
    210 
    211                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "November 2007",
    212 
    213                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
    214 
    215                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
    216 
    217 
    218                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10 \\u2013 20",
    219 
    220                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
    221 
    222                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
    223 
    224                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    225 
    226                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
    227 
    228                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
    229 
    230                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
    231                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
    232 
    233                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10 \\u2013 20",
    234                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
    235 
    236                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
    237 
    238                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
    239 
    240                 "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",
    241 
    242                 "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",
    243 
    244                 "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",
    245 
    246                 "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",
    247 
    248                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    249 
    250                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
    251 
    252                 "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",
    253 
    254                 "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",
    255 
    256                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10 \\u2013 20, 2007",
    257 
    258                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
    259 
    260                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
    261 
    262                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
    263 
    264                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
    265 
    266                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
    267 
    268                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
    269 
    270 
    271                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
    272 
    273                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
    274 
    275                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
    276 
    277                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
    278 
    279                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMy", "Wed, 1/10/2007",
    280 
    281                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
    282 
    283                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
    284 
    285 
    286                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
    287 
    288                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
    289 
    290                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
    291 
    292                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
    293 
    294 
    295                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
    296 
    297                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
    298 
    299                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
    300 
    301 
    302                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
    303 
    304                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
    305 
    306                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "10 AM \\u2013 2 PM PT",
    307 
    308                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
    309 
    310                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
    311 
    312 
    313                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
    314 
    315                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
    316 
    317 
    318                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
    319 
    320                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
    321 
    322                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
    323 
    324                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
    325 
    326 
    327                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
    328 
    329 
    330                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
    331 
    332                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
    333 
    334                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
    335 
    336 
    337                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
    338 
    339                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
    340 
    341 
    342                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dM", "1/10",
    343 
    344 
    345                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
    346 
    347 
    348 
    349                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
    350 
    351 
    352                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMM", "Jan",
    353 
    354 
    355                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00 \\u2013 10:20 AM",
    356 
    357                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00 \\u2013 10:20 AM PT",
    358 
    359 
    360                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 AM",
    361 
    362 
    363                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 AM PST",
    364 
    365 
    366                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
    367 
    368                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00 \\u2013 10:20 AM",
    369 
    370                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00 \\u2013 10:20 AM PST",
    371 
    372                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hms", "10:00:10 AM \\u2013 10:20:10 AM",
    373 
    374                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMM", "January 10",
    375 
    376                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
    377 
    378                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMMy", "Wed, Jan 10, 2007",
    379 
    380                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
    381 
    382                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
    383                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dM", "1/10",
    384 
    385                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
    386 
    387                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
    388                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
    389 
    390                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Ed", "10 Wed",
    391 
    392                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
    393 
    394                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
    395 
    396                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMM", "Jan",
    397 
    398                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
    399 
    400                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
    401 
    402                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 AM PT",
    403 
    404                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
    405 
    406                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 AM",
    407 
    408 
    409                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 AM PST",
    410 
    411                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
    412 
    413                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hms", "10:10:10 AM",
    414 
    415                 "en", "2007 01 01 22:00:00", "2007 01 01 23:00:00", "yMMMMdHm", "January 1, 2007, 22:00 \u2013 23:00",
    416 
    417                 "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",
    418 
    419                 "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",
    420 
    421                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
    422 
    423                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "10\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
    424 
    425                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
    426 
    427                 "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",
    428 
    429                 "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",
    430 
    431                 "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",
    432 
    433                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u81f320\\u65e5",
    434 
    435                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
    436 
    437                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket 6872<-6626)
    438 
    439                 "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",
    440 
    441                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "11\\u670810\\u65e5\\u5468\\u516d\\u81f320\\u65e5\\u5468\\u4e8c",
    442 
    443                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
    444 
    445                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "2007/11/10 \\u2013 2007/11/20",
    446 
    447                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
    448 
    449                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007\u5E7411\u6708",
    450                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
    451 
    452                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10\\u201320\\u65e5",
    453 
    454                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
    455 
    456                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
    457 
    458                 "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)
    459 
    460                 "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)
    461 
    462                 "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",
    463 
    464                 "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",
    465 
    466                 "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)
    467 
    468                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
    469 
    470                 "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",
    471 
    472                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
    473 
    474                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
    475 
    476                 "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",
    477 
    478                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "GMT-8\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
    479 
    480                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "1\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    481 
    482                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
    483 
    484                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
    485 
    486                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "\\u4e0a\\u534810\\u65f6",
    487 
    488                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
    489 
    490                 "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)
    491 
    492                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
    493 
    494                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
    495 
    496                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 \\u2013 Freitag, 10. Okt. 2008",
    497 
    498                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "10. Okt. 2007 \\u2013 10. Okt. 2008",
    499 
    500                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 \\u2013 10. Okt. 2008",
    501 
    502                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt. 2007 \\u2013 Okt. 2008",
    503 
    504                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEdMMM", "Mi., 10. Okt. 2007 \\u2013 Fr., 10. Okt. 2008",
    505 
    506                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
    507 
    508                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.2007 \\u2013 10.10.2008",
    509 
    510                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10.10.2007 \\u2013 10.10.2008",
    511 
    512                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.2007 \\u2013 10.2008",
    513 
    514                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 \\u2013 Fr., 10.10.2008",
    515 
    516                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10.10.2007 \\u2013 10.10.2008",
    517 
    518                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007\\u20132008",
    519 
    520                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.2007 \\u2013 10.2008",
    521 
    522                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Okt. 2007 \\u2013 Okt. 2008",
    523 
    524                 "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.",
    525 
    526                 "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",
    527 
    528                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov. 2007",
    529 
    530                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "10. Okt. \\u2013 10. Nov. 2007",
    531 
    532                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt. \\u2013 10. Nov.",
    533 
    534                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt.\\u2013Nov. 2007",
    535 
    536                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. \\u2013 Samstag, 10. Nov.",
    537 
    538                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Mi., 10.10.2007 \\u2013 Sa., 10.11.2007",
    539 
    540                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. \\u2013 10.11.",
    541 
    542                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.2007 \\u2013 11.2007",
    543 
    544                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Mi., 10.10. \\u2013 Sa., 10.11.",
    545 
    546                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. \\u2013 10.11.",
    547 
    548 
    549                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10.\\u201311.",
    550 
    551                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt.\\u2013Nov.",
    552 
    553                 "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",
    554 
    555                 "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",
    556 
    557                 "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.",
    558 
    559                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. \\u2013 Dienstag, 20. Nov. 2007",
    560 
    561                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.\\u201320. Nov. 2007",
    562 
    563                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "10.\\u201320. Nov.",
    564 
    565                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov. 2007",
    566 
    567                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. \\u2013 Dienstag, 20. Nov.",
    568 
    569                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.2007 \\u2013 Di., 20.11.2007",
    570 
    571                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "10.11.2007 \\u2013 20.11.2007",
    572 
    573                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. \\u2013 20.11.",
    574 
    575                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
    576 
    577                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sa., 10.11. \\u2013 Di., 20.11.",
    578 
    579                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.\\u201320.",
    580 
    581                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
    582 
    583                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
    584 
    585                 "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",
    586 
    587                 "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",
    588 
    589                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
    590 
    591                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "10. Jan. 2007",
    592 
    593                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan.",
    594 
    595                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan. 2007",
    596 
    597                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
    598 
    599                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 vorm. \\u2013 2:10 nachm. GMT-8",
    600 
    601                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 vorm. \\u2013 2 nachm.",
    602 
    603                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
    604 
    605                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00\\u201310:20 vorm.",
    606 
    607                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00\\u201310:20 vorm. Los Angeles Zeit",
    608 
    609                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 vorm. GMT-8",
    610 
    611                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 vorm.",
    612 
    613                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "10 vorm. Los Angeles Zeit",
    614 
    615                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 vorm. GMT-8",
    616 
    617                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
    618 
    619                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 vorm.",
    620 
    621                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jm", "10:10",
    622 
    623                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. Los Angeles Zeit",
    624 
    625                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jmv", "10:10 Los Angeles Zeit",
    626 
    627                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. GMT-8",
    628 
    629                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "jmz", "10:10 GMT-8",
    630 
    631                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 vorm.",
    632 
    633                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 vorm. Los Angeles Zeit",
    634 
    635                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 vorm. GMT-8",
    636 
    637                 // Thai (default calendar buddhist)
    638 
    639                 // Android patch: Force default Gregorian calendar.
    640 
    641                 "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",
    642 
    643 
    644                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
    645 
    646                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 \\u2013 \\u0E15.\\u0E04. 2551",
    647 
    648 
    649                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E2A. 10/10/2550 \\u2013 \\u0E2D\\u0E32. 10/10/2551",
    650 
    651                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/2550 \\u2013 10/10/2551",
    652 
    653 
    654                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/2550 \\u2013 10/2551",
    655 
    656                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E2A. 10/10/2550 \\u2013 \\u0E2D\\u0E32. 10/10/2551",
    657 
    658 
    659                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550\\u20132551",
    660 
    661                 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/2550 \\u2013 10/2551",
    662 
    663 
    664                 "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",
    665 
    666 
    667                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
    668 
    669                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22. 2550",
    670 
    671                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 \\u2013 10/11",
    672 
    673                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/2550 \\u2013 11/2550",
    674 
    675 
    676                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 \\u2013 10/11",
    677 
    678                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "2550",
    679 
    680 
    681                 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22.",
    682 
    683                 // Android patch end.
    684         };
    685         expect(DATA, DATA.length);
    686     }
    687 
    688 
    689     private void expect(String[] data, int data_length) {
    690         int i = 1;
    691         while (i<data_length) {
    692             String locName = data[i++];
    693             ULocale loc = new ULocale(locName);
    694             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    695             // 'f'
    696             String datestr = data[i++];
    697             String datestr_2 = data[i++];
    698             Date date, date_2;
    699             try {
    700                 date = ref.parse(datestr);
    701                 date_2 = ref.parse(datestr_2);
    702             } catch ( ParseException e ) {
    703                 errln("parse exception" + e);
    704                 continue;
    705             }
    706             DateInterval dtitv = new DateInterval(date.getTime(),
    707                     date_2.getTime());
    708             String oneSkeleton = data[i++];
    709             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(
    710                     oneSkeleton, loc);
    711             String expected = data[i++];
    712             String formatted = dtitvfmt.format(dtitv);
    713             if ( !formatted.equals(Utility.unescape(expected)) )  {
    714                 errln("\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    715             }
    716         }
    717     }
    718 
    719 
    720     /*
    721      * Test format using user defined DateIntervalInfo
    722      */
    723     public void TestFormatUserDII() {
    724         // first item is date pattern
    725         // followed by a group of locale/from_data/to_data/interval_data
    726         String[] DATA = {
    727                 "yyyy MM dd HH:mm:ss",
    728                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
    729 
    730                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
    731 
    732                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
    733 
    734                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
    735 
    736                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
    737 
    738                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
    739 
    740                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
    741 
    742 
    743                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
    744 
    745                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    746 
    747                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    748 
    749                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket 6872<-6626)
    750 
    751                 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt. 2007 --- 10. Okt. 2008",
    752 
    753                 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Okt. 10 - Nov. 2007",
    754 
    755                 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov. 2007 --- 20. Nov. 2007",
    756 
    757                 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan. 2007",
    758 
    759                 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan. 2007",
    760 
    761                 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10. Jan. 2007",
    762 
    763                 "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 oct. 2007 --- 10 oct. 2008",
    764 
    765                 "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct. 10 - nov. 2007",
    766 
    767                 "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 nov. 2007 --- 20 nov. 2007",
    768 
    769                 "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 ene. 2007",
    770 
    771                 "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 ene. 2007",
    772 
    773                 "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 ene. 2007",
    774         };
    775         expectUserDII(DATA, DATA.length);
    776     }
    777 
    778 
    779     private void expectUserDII(String[] data, int data_length) {
    780         int i = 1;
    781         while (i<data_length) {
    782             String locName = data[i++];
    783             ULocale loc = new ULocale(locName);
    784             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    785             // 'f'
    786             String datestr = data[i++];
    787             String datestr_2 = data[i++];
    788             Date date, date_2;
    789             try {
    790                 date = ref.parse(datestr);
    791                 date_2 = ref.parse(datestr_2);
    792             } catch ( ParseException e ) {
    793                 errln("parse exception" + e);
    794                 continue;
    795             }
    796             DateInterval dtitv = new DateInterval(date.getTime(),
    797                     date_2.getTime());
    798 
    799             DateIntervalInfo dtitvinf = new DateIntervalInfo();
    800             dtitvinf.setFallbackIntervalPattern("{0} --- {1}");
    801             dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "yyyy MMM d - MMM y");
    802             dtitvinf.setIntervalPattern("yMMMd", Calendar.HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm");
    803             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(
    804                     DateFormat.YEAR_ABBR_MONTH_DAY,
    805                     loc, dtitvinf);
    806             String expected = data[i++];
    807             String formatted = dtitvfmt.format(dtitv);
    808             if ( !formatted.equals(Utility.unescape(expected)) )  {
    809                 errln("userDII: \"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    810             }
    811         }
    812     }
    813 
    814 
    815 
    816     /*
    817      * Test format using user defined DateIntervalInfo
    818      */
    819     public void TestFormatCLDR() {
    820         // first item is date pattern
    821         // followed by a group of locale/from_data/to_data/interval_data
    822         String[] DATA = {
    823                 "yyyy MM dd HH:mm:ss",
    824                 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "all diff",
    825 
    826                 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 diff Oct 10 - Nov 2007",
    827 
    828                 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007 Nov 10 ~ 20",
    829 
    830                 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
    831 
    832                 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
    833 
    834                 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
    835 
    836                 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "all diff",
    837 
    838                 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 diff 10\\u6708 10 - 11\\u6708 2007",
    839 
    840                 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007 11\\u6708 10 ~ 20",
    841 
    842                 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    843 
    844                 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    845 
    846                 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\u5E741\\u670810\u65E5", // (fixed expected result per ticket 6872<-6626)
    847         };
    848         expectUserCLDR(DATA, DATA.length);
    849     }
    850 
    851 
    852     private void expectUserCLDR(String[] data, int data_length) {
    853         int i = 1;
    854         while (i<data_length) {
    855             String locName = data[i++];
    856             ULocale loc = new ULocale(locName);
    857             SimpleDateFormat ref = new SimpleDateFormat(data[0], loc);
    858             // 'f'
    859             String datestr = data[i++];
    860             String datestr_2 = data[i++];
    861             Date date, date_2;
    862             try {
    863                 date = ref.parse(datestr);
    864                 date_2 = ref.parse(datestr_2);
    865             } catch ( ParseException e ) {
    866                 errln("parse exception" + e);
    867                 continue;
    868             }
    869             DateInterval dtitv = new DateInterval(date.getTime(),
    870                     date_2.getTime());
    871 
    872             DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("yyyyMMMdd", loc);
    873             //DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("yMd");
    874             //SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy 'year' MMM 'month' dd 'day'", loc);
    875             //dtitvfmt.setDateFormat(dtfmt);
    876             DateIntervalInfo dtitvinf = new DateIntervalInfo();
    877             dtitvinf.setFallbackIntervalPattern("{0} --- {1}");
    878             dtitvinf.setIntervalPattern("yMMMd", Calendar.YEAR, "'all diff'");
    879             dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "yyyy 'diff' MMM d - MMM y");
    880             dtitvinf.setIntervalPattern("yMMMd", Calendar.DATE, "yyyy MMM d ~ d");
    881             dtitvinf.setIntervalPattern("yMMMd", Calendar.HOUR_OF_DAY, "yyyy MMMd HH:mm ~ HH:mm");
    882             dtitvfmt.setDateIntervalInfo(dtitvinf);
    883             FieldPosition pos = new FieldPosition(0);
    884             StringBuffer str = new StringBuffer("");
    885             DateFormat dtfmt = dtitvfmt.getDateFormat();
    886             Calendar fromCalendar = (Calendar) dtfmt.getCalendar().clone();
    887             Calendar toCalendar = (Calendar) dtfmt.getCalendar().clone();
    888             fromCalendar.setTimeInMillis(dtitv.getFromDate());
    889             toCalendar.setTimeInMillis(dtitv.getToDate());
    890             dtitvfmt.format(fromCalendar, toCalendar, str, pos);
    891 
    892             String expected = data[i++];
    893             String formatted = dtitvfmt.format(dtitv).toString();
    894             if ( !formatted.equals(Utility.unescape(expected)) )  {
    895                 errln("CLDR: \"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"\t expected: " + expected +"\tgot: " + formatted + "\n");
    896             }
    897         }
    898     }
    899 
    900 
    901     /**
    902      * Stress test
    903      */
    904     public void TestStress() {
    905         if (getInclusion() <= 5) {
    906             logln("INFO: Skipping test");
    907             return;
    908         }
    909 
    910         // test data.
    911         // The 1st is the format pattern,
    912         // Next are pairs in which the 1st in the pair is the earlier date
    913         // and the 2nd in the pair is the later date
    914         String[] DATA = {
    915                 "yyyy MM dd HH:mm:ss",
    916                 "2007 10 10 10:10:10", "2008 10 10 10:10:10",
    917                 "2007 10 10 10:10:10", "2007 11 10 10:10:10",
    918                 "2007 11 10 10:10:10", "2007 11 20 10:10:10",
    919                 "2007 01 10 10:00:10", "2007 01 10 14:10:10",
    920                 "2007 01 10 10:00:10", "2007 01 10 10:20:10",
    921                 "2007 01 10 10:10:10", "2007 01 10 10:10:20",
    922         };
    923 
    924 
    925         String[][] testLocale = {
    926                 {"en", "", ""},
    927                 {"zh", "", ""},
    928                 {"de", "", ""},
    929                 {"ar", "", ""},
    930                 {"en", "GB",  ""},
    931                 {"fr", "", ""},
    932                 {"it", "", ""},
    933                 {"nl", "", ""},
    934                 {"zh", "TW",  ""},
    935                 {"ja", "", ""},
    936                 {"pt", "BR", ""},
    937                 {"ru", "", ""},
    938                 {"tr", "", ""},
    939                 {"es", "", ""},
    940                 {"ko", "", ""},
    941                 //{"th", "", ""},
    942                 {"sv", "", ""},
    943                 {"pl", "", ""},
    944                 {"fi", "", ""},
    945                 {"da", "", ""},
    946                 {"pt", "PT", ""},
    947                 {"ro", "", ""},
    948                 {"hu", "", ""},
    949                 {"he", "", ""},
    950                 {"in", "", ""},
    951                 {"cs", "", ""},
    952                 {"el", "", ""},
    953                 {"no", "", ""},
    954                 {"vi", "", ""},
    955                 {"bg", "", ""},
    956                 {"hr", "", ""},
    957                 {"lt", "", ""},
    958                 {"sk", "", ""},
    959                 {"sl", "", ""},
    960                 {"sr", "", ""},
    961                 {"ca", "", ""},
    962                 {"lv", "", ""},
    963                 {"uk", "", ""},
    964                 {"hi", "", ""},
    965         };
    966 
    967         int localeIndex;
    968         for ( localeIndex = 0; localeIndex < testLocale.length; ++localeIndex) {
    969             stress(DATA, DATA.length, new Locale(testLocale[localeIndex][0],
    970                     testLocale[localeIndex][1], testLocale[localeIndex][2]),
    971                     testLocale[localeIndex][0]+testLocale[localeIndex][1]);
    972         }
    973     }
    974 
    975     private void stress(String[] data, int data_length, Locale loc, String locName) {
    976         String[] skeleton = {
    977                 "EEEEdMMMMy",
    978                 "dMMMMy",
    979                 "dMMMM",
    980                 "MMMMy",
    981                 "EEEEdMMMM",
    982                 "EEEdMMMy",
    983                 "dMMMy",
    984                 "dMMM",
    985                 "MMMy",
    986                 "EEEdMMM",
    987                 "EEEdMy",
    988                 "dMy",
    989                 "dM",
    990                 "My",
    991                 "EEEdM",
    992                 "d",
    993                 "EEEd",
    994                 "y",
    995                 "M",
    996                 "MMM",
    997                 "MMMM",
    998                 "hm",
    999                 "hmv",
   1000                 "hmz",
   1001                 "h",
   1002                 "hv",
   1003                 "hz",
   1004                 "EEddMMyyyy", // following could be normalized
   1005                 "EddMMy",
   1006                 "hhmm",
   1007                 "hhmmzz",
   1008                 "hms",  // following could not be normalized
   1009                 "dMMMMMy",
   1010                 "EEEEEdM",
   1011         };
   1012 
   1013         int i = 0;
   1014 
   1015         SimpleDateFormat ref = new SimpleDateFormat(data[i++], loc);
   1016 
   1017         while (i<data_length) {
   1018             // 'f'
   1019             String datestr = data[i++];
   1020             String datestr_2 = data[i++];
   1021             Date date;
   1022             Date date_2;
   1023             try {
   1024                 date = ref.parse(datestr);
   1025                 date_2 = ref.parse(datestr_2);
   1026             } catch ( ParseException e ) {
   1027                 errln("parse exception" + e);
   1028                 continue;
   1029             }
   1030             DateInterval dtitv = new DateInterval(date.getTime(), date_2.getTime());
   1031 
   1032             for ( int skeletonIndex = 0;
   1033                     skeletonIndex < skeleton.length;
   1034                     ++skeletonIndex ) {
   1035                 String oneSkeleton = skeleton[skeletonIndex];
   1036                 // need special handle of "Thai" since the default calendar
   1037                 // of "Thai" is "Budd", not "Gregorian".
   1038                 DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(oneSkeleton, loc);
   1039                 /*
   1040                 if ( locName.equals("th") ) {
   1041                     // reset calendar to be Gregorian
   1042                     GregorianCalendar gregCal = new GregorianCalendar(loc);
   1043                     DateFormat dformat = dtitvfmt.getDateFormat();
   1044                     DateFormat newOne = (DateFormat)dformat.clone();
   1045                     newOne.setCalendar(gregCal);
   1046                     dtitvfmt.setDateFormat(newOne);
   1047                 }
   1048                  */
   1049                 dtitvfmt.format(dtitv);
   1050             }
   1051 
   1052 
   1053             // test interval format by algorithm
   1054             for ( int style = DateFormat.FULL; style  < 4; ++style ) {
   1055                 SimpleDateFormat dtfmt = (SimpleDateFormat) DateFormat.getDateInstance(style, loc);
   1056                 FieldPosition pos = new FieldPosition(0);
   1057                 StringBuffer str = new StringBuffer("");
   1058                 Calendar fromCalendar = (Calendar) dtfmt.getCalendar().clone();
   1059                 Calendar toCalendar = (Calendar) dtfmt.getCalendar().clone();
   1060                 fromCalendar.setTimeInMillis(dtitv.getFromDate());
   1061                 toCalendar.setTimeInMillis(dtitv.getToDate());
   1062                 dtfmt.intervalFormatByAlgorithm(fromCalendar, toCalendar, str, pos);
   1063             }
   1064         }
   1065     }
   1066 
   1067     /*
   1068      * Ticket#6396 DateIntervalInfo of ICU4J 4.0d3 throw NullPointerException
   1069      */
   1070     public void TestT6396() {
   1071         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("th_TH"));
   1072         try {
   1073             // ticket#6396 reported toString() throws NullPointerException
   1074             String diiStr = dii.toString();
   1075             logln("new DateIntervalInfo(new ULocale(\"th_TH\")).toString() - " + diiStr);
   1076 
   1077             // equals also had the similar problem
   1078             DateIntervalInfo dii1 = (DateIntervalInfo)dii.clone();
   1079             if (!dii.equals(dii1)) {
   1080                 errln("FAIL: Cloned DateIntervalInfo is not equal to the source");
   1081             }
   1082         } catch (Exception e) {
   1083             errln("FAIL: Exception - " + e.getClass().getName());
   1084         }
   1085     }
   1086 
   1087     public void TestConstructor() {
   1088         DateIntervalInfo diiJapan = new DateIntervalInfo(ULocale.JAPAN);
   1089         DateIntervalInfo diiJapanJ = new DateIntervalInfo(Locale.JAPAN);
   1090 
   1091         assertEquals("DateIntervalInfo constructors", diiJapan, diiJapanJ);
   1092     }
   1093 
   1094     /* Tests the method
   1095      *      public boolean equals(Object a)
   1096      */
   1097     public void TestDateIntervalInfoEquals(){
   1098         // Tests when "if ( a instanceof PatternInfo )" is false
   1099         DateIntervalInfo diia = new DateIntervalInfo();
   1100         if(diia.equals("dummy")){
   1101             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1102                     "false for a String object.");
   1103         }
   1104         if(diia.equals(0)){
   1105             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1106                     "false for an Integer object.");
   1107         }
   1108         if(diia.equals(0.0)){
   1109             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1110                     "false for an Integer object.");
   1111         }
   1112         if(diia.equals(new Object())){
   1113             errln("DateIntervalInfo.equals(Object a) was suppose to return " +
   1114                     "false for an Integer object.");
   1115         }
   1116     }
   1117 
   1118     /* Tests the method
   1119      *      public Object cloneAsThawed()
   1120      */
   1121     public void TestCloseAsThawed(){
   1122         DateIntervalInfo dii = new DateIntervalInfo();
   1123         try{
   1124             dii.cloneAsThawed();
   1125         } catch(Exception e){
   1126             errln("DateIntervalInfo.closeAsThawed() was not suppose to return " +
   1127                     "an exception.");
   1128         }
   1129     }
   1130 
   1131     /* Tests the method
   1132      *      public boolean isFrozen()
   1133      */
   1134     public void TestIsFrozen(){
   1135         DateIntervalInfo dii = new DateIntervalInfo();
   1136         if(dii.isFrozen() != false){
   1137             errln("DateIntervalInfo.isFrozen() is suppose to return false.");
   1138         }
   1139         dii.freeze();
   1140 
   1141         if(dii.isFrozen() != true){
   1142             errln("DateIntervalInfo.isFrozen() is suppose to return true.");
   1143         }
   1144     }
   1145 
   1146     /* Tests the method
   1147      *      public boolean clone()
   1148      */
   1149     public void TestClone(){
   1150         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("en_US"));
   1151         DateIntervalInfo dii_clone = (DateIntervalInfo) dii.clone();
   1152         dii_clone.freeze();
   1153 
   1154         // Tests when "if ( frozen )" is true
   1155         if(!dii.equals(dii_clone)){
   1156             errln("DateIntervalInfo.clone() is suppose to return true for " +
   1157                     "an original DateIntervalInfo object and a clone of the " +
   1158                     "original DateIntervalInfo object.");
   1159         }
   1160     }
   1161 
   1162     /* Tests the method
   1163      *      public void setFallbackIntervalPattern(String fallbackPattern)
   1164      */
   1165     public void TestSetFallbackIntervalPattern(){
   1166         DateIntervalInfo dii = new DateIntervalInfo(new ULocale("en_US"));
   1167         // Tests when "if ( frozen )" is true
   1168         try{
   1169             dii.freeze();
   1170             dii.setFallbackIntervalPattern("");
   1171             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1172                     "was suppose to return an exception for a frozen object.");
   1173         } catch (Exception e){}
   1174 
   1175         // Tests when "if ( firstPatternIndex == -1 || secondPatternIndex == -1 )" is true
   1176         dii = (DateIntervalInfo) dii.cloneAsThawed();
   1177         try{
   1178             dii.setFallbackIntervalPattern("");
   1179             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1180                     "was suppose to return an exception for a string object of ''.");
   1181         } catch(Exception e){}
   1182 
   1183         try{
   1184             dii.setFallbackIntervalPattern("0");
   1185             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1186                     "was suppose to return an exception for a string object of 0.");
   1187         } catch(Exception e){}
   1188 
   1189         // Tests when "if ( firstPatternIndex > secondPatternIndex )" is true
   1190         dii.setFallbackIntervalPattern("{1}{0}");
   1191         if(dii.getDefaultOrder() != true)
   1192             errln("DateIntervalInfo.setFallbackIntervalPattern(String fallbackPattern) " +
   1193                     "was suppose to change the variable 'fFirstDateInPtnIsLaterDate' " +
   1194                     "to true.");
   1195     }
   1196 
   1197     /* Tests the method
   1198      *      public PatternInfo getIntervalPattern(String skeleton, int field)
   1199      */
   1200     public void TestGetIntervalPattern(){
   1201         // Tests when "if ( field > MINIMUM_SUPPORTED_CALENDAR_FIELD )" is true
   1202         // MINIMUM_SUPPORTED_CALENDAR_FIELD = Calendar.MINUTE;
   1203         DateIntervalInfo dii = new DateIntervalInfo();
   1204         try{
   1205             dii.getIntervalPattern("", Calendar.MINUTE+1);
   1206             errln("DateIntervalInfo.getIntervalPattern(String,int) was suppose " +
   1207                     "to return an exception for the 'int field' parameter " +
   1208                     "when it exceeds MINIMUM_SUPPORTED_CALENDAR_FIELD.");
   1209         } catch(Exception e){}
   1210     }
   1211 
   1212     /* Tests the method
   1213      *      public void setIntervalPattern(String skeleton, int lrgDiffCalUnit, String intervalPattern)
   1214      */
   1215     public void TestSetIntervalPattern(){
   1216         DateIntervalInfo dii = new DateIntervalInfo();
   1217         // Tests when "if ( frozen )" is true
   1218         try{
   1219             dii.freeze();
   1220             dii.setIntervalPattern("", 0, "");
   1221             errln("DateIntervalInfo.setIntervalPattern(String,int,String) " +
   1222                     "was suppose to return an exception when the " +
   1223                     "DateIntervalInfo object is frozen.");
   1224         } catch(Exception e){}
   1225 
   1226         // Tests when "if ( lrgDiffCalUnit > MINIMUM_SUPPORTED_CALENDAR_FIELD )" is true
   1227         // MINIMUM_SUPPORTED_CALENDAR_FIELD = Calendar.MINUTE;
   1228         try{
   1229             dii = (DateIntervalInfo) dii.cloneAsThawed();
   1230             dii.setIntervalPattern("", Calendar.MINUTE+1, "");
   1231             errln("DateIntervalInfo.setIntervalPattern(String,int,String) " +
   1232                     "was suppose to return an exception when the " +
   1233                     "variable 'lrgDiffCalUnit' is greater than " +
   1234                     "MINIMUM_SUPPORTED_CALENDAR_FIELD.");
   1235         } catch(Exception e){}
   1236     }
   1237 
   1238     public void TestSetIntervalPatternNoSideEffect() {
   1239         PatternInfo patternInfo = new DateIntervalInfo(ULocale.ENGLISH).getIntervalPattern("yMd", Calendar.DATE);
   1240         String expectedPattern = patternInfo.getFirstPart() + patternInfo.getSecondPart();
   1241         new DateIntervalInfo(ULocale.ENGLISH).setIntervalPattern(
   1242                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1243         patternInfo = new DateIntervalInfo(ULocale.ENGLISH).getIntervalPattern("yMd", Calendar.DATE);
   1244         String actualPattern = patternInfo.getFirstPart() + patternInfo.getSecondPart();
   1245         assertEquals(
   1246                 "setIntervalPattern should not have side effects",
   1247                 expectedPattern,
   1248                 actualPattern);
   1249     }
   1250 
   1251     public void TestGetSetTimeZone(){
   1252         DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance("MMMdHHmm", Locale.ENGLISH);
   1253         long date1 = 1299090600000L; // 2011-Mar-02 1030 in US/Pacific, 2011-Mar-03 0330 in Asia/Tokyo
   1254         long date2 = 1299115800000L; // 2011-Mar-02 1730 in US/Pacific, 2011-Mar-03 1030 in Asia/Tokyo
   1255         DateInterval dtitv = new DateInterval(date1, date2);
   1256         TimeZone tzCalif = TimeZone.getFrozenTimeZone("US/Pacific");
   1257         TimeZone tzTokyo = TimeZone.getFrozenTimeZone("Asia/Tokyo");
   1258         String fmtCalif = "Mar 2, 10:30 \u2013 17:30"; // ICU4C result is "Mar 2, 10:30 \u2013 17:30" (does not duplicate day)
   1259         String fmtTokyo = "Mar 3, 03:30 \u2013 10:30"; // ICU4C result is "Mar 3, 03:30 \u2013 10:30" (does not duplicate day)
   1260 
   1261         StringBuffer buf = new StringBuffer();
   1262         FieldPosition pos = new FieldPosition(0);
   1263         dtitvfmt.setTimeZone(tzCalif);
   1264         dtitvfmt.format(dtitv, buf, pos);
   1265         if (!buf.toString().equals(fmtCalif)) {
   1266             errln("DateIntervalFormat for tzCalif, expect \"" + fmtCalif + "\", get \"" + buf + "\"");
   1267         }
   1268 
   1269         buf.setLength(0);
   1270         pos.setBeginIndex(0);
   1271         dtitvfmt.setTimeZone(tzTokyo);
   1272         dtitvfmt.format(dtitv, buf, pos);
   1273         if (!buf.toString().equals(fmtTokyo)) {
   1274             errln("DateIntervalFormat for tzTokyo, expect \"" + fmtTokyo + "\", get \"" + buf + "\"");
   1275         }
   1276 
   1277         if (!dtitvfmt.getTimeZone().equals(tzTokyo)) {
   1278             errln("DateIntervalFormat.getTimeZone() returns mismatch");
   1279         }
   1280     }
   1281 
   1282 
   1283     /* Tests the method
   1284      *      public int hashCode()
   1285      */
   1286     public void TestHashCode(){
   1287         // Tests when
   1288         //      "int hash = fIntervalPatternFirstPart != null ? fIntervalPatternFirstPart.hashCode() : 0;"
   1289         // is false
   1290         PatternInfo dp = new PatternInfo(null, null, false);
   1291         if(dp.hashCode() != 0){
   1292             errln("PatternInfo.hashCode() was suppose to return 0 for a null " +
   1293                     "paramter in the constructor.");
   1294         }
   1295     }
   1296 
   1297     /* Tests the method
   1298      *      public boolean equals(Object a)
   1299      * in PatternInfo
   1300      */
   1301     public void TestPattternInfoEquals(){
   1302         // Tests when "if ( a instanceof PatternInfo )" is false
   1303         PatternInfo pi = new PatternInfo("","", false);
   1304         if(pi.equals(new Object())){
   1305             errln("PatternInfo.equals(Object) is suppose to return false " +
   1306                     "when it is not an instance of PatternInfo.");
   1307         }
   1308         if(pi.equals("")){
   1309             errln("PatternInfo.equals(Object) is suppose to return false " +
   1310                     "when it is not an instance of PatternInfo.");
   1311         }
   1312         if(pi.equals(0)){
   1313             errln("PatternInfo.equals(Object) is suppose to return false " +
   1314                     "when it is not an instance of PatternInfo.");
   1315         }
   1316         if(pi.equals(0.0)){
   1317             errln("PatternInfo.equals(Object) is suppose to return false " +
   1318                     "when it is not an instance of PatternInfo.");
   1319         }
   1320     }
   1321 
   1322     public void TestDateIntervalCoverage() {
   1323         DateInterval di = new DateInterval(0, 1);
   1324 
   1325         if (di.equals("Test")) {
   1326             errln("Comparison test should fail.");
   1327         }
   1328 
   1329         if (di.toString() == null) {
   1330             errln("toString should not return null.");
   1331         }
   1332 
   1333         if (di.hashCode() != 1) {
   1334             errln("hasCode() should return 1.");
   1335         }
   1336     }
   1337 
   1338     public void TestTicket9919GetInstance() {
   1339         // Creating a DateIntervalFormat with a custom DateIntervalInfo
   1340         // object used to corrupt the cache.
   1341         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1342                 "yMd", ULocale.ENGLISH);
   1343         Calendar from = Calendar.getInstance();
   1344         Calendar to = Calendar.getInstance();
   1345         from.set(2013, 3, 26);
   1346         to.set(2013, 3, 28);
   1347 
   1348         // Save. This is the correct answer
   1349         String expected =
   1350                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1351                 .toString();
   1352 
   1353         // Now create a DateIntervalFormat with same skeleton and
   1354         // locale, but with a custom DateIntervalInfo. This used
   1355         // to corrupt the cache.
   1356         DateIntervalInfo dateIntervalInfo =
   1357                 new DateIntervalInfo(ULocale.ENGLISH);
   1358         dateIntervalInfo.setIntervalPattern(
   1359                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1360         DateIntervalFormat.getInstance(
   1361                 "yMd", ULocale.ENGLISH, dateIntervalInfo);
   1362 
   1363         // Now create a DateIntervalFormat with same skeleton and
   1364         // locale, but with default DateIntervalInfo. The cache should
   1365         // not be corrupted, and we should get the same answer as before.
   1366         dif = DateIntervalFormat.getInstance("yMd", ULocale.ENGLISH);
   1367 
   1368         assertEquals(
   1369                 "Custom DateIntervalInfo objects should not mess up cache",
   1370                 expected,
   1371                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1372                 .toString());
   1373 
   1374     }
   1375 
   1376     public void TestTicket9919Setter() {
   1377 
   1378         // Creating a DateIntervalFormat with a custom DateIntervalInfo
   1379         // object used to corrupt the cache.
   1380         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1381                 "yMd", ULocale.ENGLISH);
   1382         Calendar from = Calendar.getInstance();
   1383         Calendar to = Calendar.getInstance();
   1384         from.set(2013, 3, 26);
   1385         to.set(2013, 3, 28);
   1386 
   1387         // Save. This is the correct answer
   1388         String expected =
   1389                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1390                 .toString();
   1391 
   1392         // Now create a DateIntervalFormat with same skeleton and
   1393         // locale, but with a custom DateIntervalInfo. This used
   1394         // to corrupt the cache.
   1395         DateIntervalInfo dateIntervalInfo =
   1396                 new DateIntervalInfo(ULocale.ENGLISH);
   1397         dateIntervalInfo.setIntervalPattern(
   1398                 "yMd", Calendar.DATE, "M/d/y \u2013 d");
   1399         DateIntervalFormat bad = DateIntervalFormat.getInstance(
   1400                 "yMd", ULocale.ENGLISH);
   1401         bad.setDateIntervalInfo(dateIntervalInfo);
   1402 
   1403         // Now create a DateIntervalFormat with same skeleton and
   1404         // locale, but with default DateIntervalInfo. The cache should
   1405         // not be corrupted, and we should get the same answer as before.
   1406         dif = DateIntervalFormat.getInstance("yMd", ULocale.ENGLISH);
   1407         assertEquals(
   1408                 "Custom DateIntervalInfo objects should not mess up cache",
   1409                 expected,
   1410                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1411                 .toString());
   1412     }
   1413 
   1414     public void TestTicket9914() {
   1415         DateIntervalInfo dateIntervalInfo =
   1416                 new DateIntervalInfo(ULocale.ENGLISH);
   1417 
   1418         Calendar from = Calendar.getInstance();
   1419         Calendar to = Calendar.getInstance();
   1420         from.set(113, 3, 26);
   1421         to.set(113, 3, 28);
   1422         DateIntervalFormat dif = DateIntervalFormat.getInstance(
   1423                 "yyyyMd", ULocale.ENGLISH, dateIntervalInfo);
   1424         assertEquals(
   1425                 "yyyyMd skeleton.",
   1426                 "4/26/0113 \u2013 4/28/0113",
   1427                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1428                 .toString());
   1429 
   1430         dif = DateIntervalFormat.getInstance(
   1431                 "yyMd", ULocale.ENGLISH, dateIntervalInfo);
   1432         assertEquals(
   1433                 "yyMd skeleton.",
   1434                 "4/26/13 \u2013 4/28/13",
   1435                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1436                 .toString());
   1437 
   1438         dif = DateIntervalFormat.getInstance(
   1439                 "yMd", ULocale.ENGLISH, dateIntervalInfo);
   1440         assertEquals(
   1441                 "yMd skeleton.",
   1442                 "4/26/113 \u2013 4/28/113",
   1443                 dif.format(from, to, new StringBuffer(), new FieldPosition(0))
   1444                 .toString());
   1445     }
   1446 
   1447     public void TestTicket11583 () {
   1448         ULocale[] locales = {
   1449                 ULocale.ENGLISH,
   1450                 SPANISH,
   1451                 LA_SPANISH,
   1452                 };
   1453         String[] skeletons = {
   1454                 "yMMMMd", "yMMMM", "MMMM",
   1455                 "yMMMd", "yMMM", "MMM",
   1456                 "yMMd", "yMMdd", "yMM", "MM",
   1457                 "yMdd", "yMd", "yM", "M"
   1458                 };
   1459 
   1460         final long startDate = 1232364615000L;
   1461         final long endDate = 1240399815000L;
   1462         String filterPattern = null ; // "yMMM";
   1463 
   1464         for (ULocale locale : locales) {
   1465             for (String skeleton : skeletons) {
   1466                 if (filterPattern != null && !skeleton.equals(filterPattern)) {
   1467                     continue;
   1468                 }
   1469 
   1470                 DateFormat dateFormat = DateFormat.getPatternInstance(skeleton, locale);
   1471                 String dateFormatPattern = ((SimpleDateFormat)dateFormat).toPattern();
   1472 
   1473                 DateIntervalFormat intervalFormat = DateIntervalFormat.getInstance(skeleton, locale);
   1474                 DateIntervalInfo intervalInfo = intervalFormat.getDateIntervalInfo();
   1475 
   1476                 if (skeleton.equals(filterPattern)) {
   1477                     logln(filterPattern + " => " + intervalInfo.getRawPatterns().get(filterPattern));
   1478                 }
   1479 
   1480                 DateInterval date_interval = new DateInterval(startDate, endDate);
   1481 
   1482                 String interval = intervalFormat.format(date_interval);
   1483 
   1484                 String formattedStart = dateFormat.format(startDate);
   1485                 String formattedEnd = dateFormat.format(endDate);
   1486 
   1487                 PatternInfo patternInfo = intervalFormat.getRawPatterns().get("M");
   1488 
   1489                 String firstPart = patternInfo.getFirstPart();
   1490                 String secondPart = patternInfo.getSecondPart();
   1491                 if (!matches(dateFormatPattern, firstPart, secondPart)) {
   1492                     if (logKnownIssue("11585", "incompatible pattern between date format and date interval format")) {
   1493                         logln("For skeleton " + skeleton + "/locale " + locale + ": mismatch between date format "
   1494                                 + dateFormatPattern + " and date interval format " + firstPart + secondPart + ".");
   1495                     } else {
   1496                         errln("For skeleton " + skeleton + "/locale " + locale + ": mismatch between date format "
   1497                                 + dateFormatPattern + " and date interval format " + firstPart + secondPart + ".");
   1498                     }
   1499                 }
   1500 
   1501                 logln(locale
   1502                         + "\tskeleton: " + skeleton
   1503                         + "\tpattern: " + dateFormatPattern
   1504                         + "\tintervalPattern1: " + firstPart
   1505                         + "\tintervalPattern2: " + secondPart
   1506                         + "\tstartDate: " + formattedStart
   1507                         + "\tendDate: " + formattedEnd
   1508                         + "\tinterval: " + interval
   1509                         + ""
   1510                         );
   1511             }
   1512         }
   1513     }
   1514 
   1515 
   1516     /**
   1517      * Return true if for some x, y: dateFormatPattern = firstPart(0,x) + secondPart(y, secondPart.length())
   1518      * @param dateFormatPattern
   1519      * @param firstPart
   1520      * @param secondPart
   1521      * @return
   1522      */
   1523     private boolean matches(String dateFormatPattern, String firstPart, String secondPart) {
   1524         // brute force for now
   1525         int lastButOne = dateFormatPattern.length()-1;
   1526         for (int i = 1; i < lastButOne; ++i) {
   1527             if (firstPart.startsWith(dateFormatPattern.substring(0,i))
   1528                     && secondPart.endsWith(dateFormatPattern.substring(i,dateFormatPattern.length()))) {
   1529                 return true;
   1530             }
   1531         }
   1532         return false;
   1533     }
   1534 }
   1535