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