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