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