DateIntervalFormatTest.java revision 4409dd652330c8eaaa32eec36ce1600aeeea1464
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package libcore.icu;
18
19import java.util.Arrays;
20import java.util.Locale;
21
22import java.util.Calendar;
23import java.util.Date;
24import java.util.TimeZone;
25
26import static libcore.icu.DateIntervalFormat.*;
27
28public class DateIntervalFormatTest extends junit.framework.TestCase {
29  private static final long MINUTE = 60 * 1000;
30  private static final long HOUR = 60 * MINUTE;
31  private static final long DAY = 24 * HOUR;
32  private static final long MONTH = 31 * DAY;
33  private static final long YEAR = 12 * MONTH;
34
35  // These are the old CTS tests for DateIntervalFormat.formatDateRange.
36  public void test_formatDateInterval() throws Exception {
37    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
38
39    Calendar c = Calendar.getInstance(tz);
40    c.set(Calendar.MONTH, Calendar.JANUARY);
41    c.set(Calendar.DAY_OF_MONTH, 19);
42    c.set(Calendar.HOUR_OF_DAY, 3);
43    c.set(Calendar.MINUTE, 30);
44    c.set(Calendar.SECOND, 15);
45    long timeWithCurrentYear = c.getTimeInMillis();
46
47    c.set(Calendar.YEAR, 2009);
48    long fixedTime = c.getTimeInMillis();
49
50    c.set(Calendar.MINUTE, 0);
51    c.set(Calendar.SECOND, 0);
52    long onTheHour = c.getTimeInMillis();
53
54    long noonDuration = (8 * 60 + 30) * 60 * 1000 - 15 * 1000;
55    long midnightDuration = (3 * 60 + 30) * 60 * 1000 + 15 * 1000;
56
57    Locale de_DE = new Locale("de", "DE");
58    Locale en_US = new Locale("en", "US");
59    Locale es_ES = new Locale("es", "ES");
60    Locale es_US = new Locale("es", "US");
61
62    assertEquals("Monday", formatDateRange(en_US, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_WEEKDAY));
63    assertEquals("January 19", formatDateRange(en_US, tz, timeWithCurrentYear, timeWithCurrentYear + HOUR, FORMAT_SHOW_DATE));
64    assertEquals("3:30 AM", formatDateRange(en_US, tz, fixedTime, fixedTime, FORMAT_SHOW_TIME));
65    assertEquals("January 19, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_YEAR));
66    assertEquals("January 19", formatDateRange(en_US, tz, fixedTime, fixedTime + HOUR, FORMAT_NO_YEAR));
67    assertEquals("January", formatDateRange(en_US, tz, timeWithCurrentYear, timeWithCurrentYear + HOUR, FORMAT_NO_MONTH_DAY));
68    assertEquals("3:30 AM", formatDateRange(en_US, tz, fixedTime, fixedTime, FORMAT_12HOUR | FORMAT_SHOW_TIME));
69    assertEquals("03:30", formatDateRange(en_US, tz, fixedTime, fixedTime, FORMAT_24HOUR | FORMAT_SHOW_TIME));
70    assertEquals("3:30 AM", formatDateRange(en_US, tz, fixedTime, fixedTime, FORMAT_12HOUR /*| FORMAT_CAP_AMPM*/ | FORMAT_SHOW_TIME));
71    assertEquals("12:00 PM", formatDateRange(en_US, tz, fixedTime + noonDuration, fixedTime + noonDuration, FORMAT_12HOUR | FORMAT_SHOW_TIME));
72    assertEquals("12:00 PM", formatDateRange(en_US, tz, fixedTime + noonDuration, fixedTime + noonDuration, FORMAT_12HOUR | FORMAT_SHOW_TIME /*| FORMAT_CAP_NOON*/));
73    assertEquals("12:00 PM", formatDateRange(en_US, tz, fixedTime + noonDuration, fixedTime + noonDuration, FORMAT_12HOUR /*| FORMAT_NO_NOON*/ | FORMAT_SHOW_TIME));
74    assertEquals("12:00 AM", formatDateRange(en_US, tz, fixedTime - midnightDuration, fixedTime - midnightDuration, FORMAT_12HOUR | FORMAT_SHOW_TIME /*| FORMAT_NO_MIDNIGHT*/));
75    assertEquals("3:30 AM", formatDateRange(en_US, tz, fixedTime, fixedTime, FORMAT_SHOW_TIME | FORMAT_UTC));
76    assertEquals("3 AM", formatDateRange(en_US, tz, onTheHour, onTheHour, FORMAT_SHOW_TIME | FORMAT_ABBREV_TIME));
77    assertEquals("Mon", formatDateRange(en_US, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_WEEKDAY));
78    assertEquals("Jan 19", formatDateRange(en_US, tz, timeWithCurrentYear, timeWithCurrentYear + HOUR, FORMAT_SHOW_DATE | FORMAT_ABBREV_MONTH));
79    assertEquals("Jan 19", formatDateRange(en_US, tz, timeWithCurrentYear, timeWithCurrentYear + HOUR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
80
81    assertEquals("1/19/2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * HOUR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
82    assertEquals("1/19/2009 – 1/22/2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
83    assertEquals("1/19/2009 – 4/22/2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
84    assertEquals("1/19/2009 – 2/9/2012", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
85
86    assertEquals("19.1.2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
87    assertEquals("19.01.2009 - 22.01.2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
88    assertEquals("19.01.2009 - 22.04.2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
89    assertEquals("19.01.2009 - 09.02.2012", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
90
91    assertEquals("1/19/2009", formatDateRange(es_US, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
92    assertEquals("19/1/2009 – 22/1/2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
93    assertEquals("19/1/2009 – 22/4/2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
94    assertEquals("19/1/2009 – 9/2/2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
95
96    assertEquals("19/1/2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + HOUR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
97    assertEquals("19/1/2009 – 22/1/2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
98    assertEquals("19/1/2009 – 22/4/2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
99    assertEquals("19/1/2009 – 9/2/2012", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
100
101    // These are some random other test cases I came up with.
102
103    assertEquals("January 19–22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * DAY, 0));
104    assertEquals("Jan 19–22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
105    assertEquals("Mon, Jan 19 – Thu, Jan 22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
106    assertEquals("Monday, January 19 – Thursday, January 22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY));
107
108    assertEquals("January 19 – April 22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * MONTH, 0));
109    assertEquals("Jan 19 – Apr 22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
110    assertEquals("Mon, Jan 19 – Wed, Apr 22, 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
111    assertEquals("January–April 2009", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_NO_MONTH_DAY));
112
113    assertEquals("Jan 19, 2009 – Feb 9, 2012", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
114    assertEquals("Jan 2009 – Feb 2012", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_NO_MONTH_DAY | FORMAT_ABBREV_ALL));
115    assertEquals("January 19, 2009 – February 9, 2012", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * YEAR, 0));
116    assertEquals("Monday, January 19, 2009 – Thursday, February 9, 2012", formatDateRange(en_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_WEEKDAY));
117
118    // The same tests but for de_DE.
119
120    assertEquals("19.-22. Januar 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, 0));
121    assertEquals("19.-22. Jan. 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
122    assertEquals("Mo., 19. - Do., 22. Jan. 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
123    assertEquals("Montag, 19. - Donnerstag, 22. Januar 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY));
124
125    assertEquals("19. Januar - 22. April 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH, 0));
126    assertEquals("19. Jan. - 22. Apr. 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
127    assertEquals("Mo., 19. Jan. - Mi., 22. Apr. 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
128    assertEquals("Januar-April 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_NO_MONTH_DAY));
129
130    assertEquals("19. Jan. 2009 - 9. Feb. 2012", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
131    assertEquals("Jan. 2009 - Feb. 2012", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_NO_MONTH_DAY | FORMAT_ABBREV_ALL));
132    assertEquals("19. Januar 2009 - 9. Februar 2012", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * YEAR, 0));
133    assertEquals("Montag, 19. Januar 2009 - Donnerstag, 9. Februar 2012", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_WEEKDAY));
134
135    // The same tests but for es_US.
136
137    assertEquals("19–22 enero 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * DAY, 0));
138    assertEquals("19–22 ene 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
139    assertEquals("lun 19 ene – jue 22 ene 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
140    assertEquals("lunes 19 enero – jueves 22 enero 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY));
141
142    assertEquals("19 enero – 22 abril 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * MONTH, 0));
143    assertEquals("19 ene – 22 abr 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
144    assertEquals("lun 19 ene – mié 22 abr 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
145    assertEquals("enero–abril 2009", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_NO_MONTH_DAY));
146
147    assertEquals("19 ene 2009 – 9 feb 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
148    assertEquals("ene 2009 – feb 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_NO_MONTH_DAY | FORMAT_ABBREV_ALL));
149    assertEquals("19 enero 2009 – 9 febrero 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, 0));
150    assertEquals("lunes 19 enero 2009 – jueves 9 febrero 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_WEEKDAY));
151
152    // The same tests but for es_ES.
153
154    assertEquals("19–22 enero 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * DAY, 0));
155    assertEquals("19–22 ene 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
156    assertEquals("lun 19 ene – jue 22 ene 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
157    assertEquals("lunes 19 enero – jueves 22 enero 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY));
158
159    assertEquals("19 enero – 22 abril 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * MONTH, 0));
160    assertEquals("19 ene – 22 abr 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
161    assertEquals("lun 19 ene – mié 22 abr 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
162    assertEquals("enero–abril 2009", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * MONTH, FORMAT_NO_MONTH_DAY));
163
164    assertEquals("19 ene 2009 – 9 feb 2012", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
165    assertEquals("ene 2009 – feb 2012", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_NO_MONTH_DAY | FORMAT_ABBREV_ALL));
166    assertEquals("19 enero 2009 – 9 febrero 2012", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * YEAR, 0));
167    assertEquals("lunes 19 enero 2009 – jueves 9 febrero 2012", formatDateRange(es_ES, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_WEEKDAY));
168  }
169
170  // http://b/8862241 - we should be able to format dates past 2038.
171  // See also http://code.google.com/p/android/issues/detail?id=13050.
172  public void test8862241() throws Exception {
173    Locale l = Locale.US;
174    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
175    Calendar c = Calendar.getInstance(tz);
176    c.set(2042, Calendar.JANUARY, 19, 3, 30);
177    long jan_19_2042 = c.getTimeInMillis();
178    c.set(2046, Calendar.OCTOBER, 4, 3, 30);
179    long oct_4_2046 = c.getTimeInMillis();
180    int flags = FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL;
181    assertEquals("Jan 19, 2042 – Oct 4, 2046", formatDateRange(l, tz, jan_19_2042, oct_4_2046, flags));
182  }
183
184  // http://b/10089890 - we should take the given time zone into account.
185  public void test10089890() throws Exception {
186    Locale l = Locale.US;
187    TimeZone utc = TimeZone.getTimeZone("UTC");
188    TimeZone pacific = TimeZone.getTimeZone("America/Los_Angeles");
189    int flags = FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL | FORMAT_SHOW_TIME | FORMAT_24HOUR;
190
191    // The Unix epoch is UTC, so 0 is 1970-01-01T00:00Z...
192    assertEquals("Jan 1, 1970, 00:00 – Jan 2, 1970, 00:00", formatDateRange(l, utc, 0, DAY + 1, flags));
193    // But MTV is hours behind, so 0 was still the afternoon of the previous day...
194    assertEquals("Dec 31, 1969, 16:00 – Jan 1, 1970, 16:00", formatDateRange(l, pacific, 0, DAY, flags));
195  }
196
197  // http://b/10318326 - we can drop the minutes in a 12-hour time if they're zero,
198  // but not if we're using the 24-hour clock. That is: "4 PM" is reasonable, "16" is not.
199  public void test10318326() throws Exception {
200    long midnight = 0;
201    long teaTime = 16 * HOUR;
202
203    int time12 = FORMAT_12HOUR | FORMAT_SHOW_TIME;
204    int time24 = FORMAT_24HOUR | FORMAT_SHOW_TIME;
205    int abbr12 = time12 | FORMAT_ABBREV_ALL;
206    int abbr24 = time24 | FORMAT_ABBREV_ALL;
207
208    Locale l = Locale.US;
209    TimeZone utc = TimeZone.getTimeZone("UTC");
210
211    // Full length on-the-hour times.
212    assertEquals("00:00", formatDateRange(l, utc, midnight, midnight, time24));
213    assertEquals("12:00 AM", formatDateRange(l, utc, midnight, midnight, time12));
214    assertEquals("16:00", formatDateRange(l, utc, teaTime, teaTime, time24));
215    assertEquals("4:00 PM", formatDateRange(l, utc, teaTime, teaTime, time12));
216
217    // Abbreviated on-the-hour times.
218    assertEquals("00:00", formatDateRange(l, utc, midnight, midnight, abbr24));
219    assertEquals("12 AM", formatDateRange(l, utc, midnight, midnight, abbr12));
220    assertEquals("16:00", formatDateRange(l, utc, teaTime, teaTime, abbr24));
221    assertEquals("4 PM", formatDateRange(l, utc, teaTime, teaTime, abbr12));
222
223    // Abbreviated on-the-hour ranges.
224    assertEquals("00:00–16:00", formatDateRange(l, utc, midnight, teaTime, abbr24));
225    assertEquals("12 AM – 4 PM", formatDateRange(l, utc, midnight, teaTime, abbr12));
226
227    // Abbreviated mixed ranges.
228    assertEquals("00:00–16:01", formatDateRange(l, utc, midnight, teaTime + MINUTE, abbr24));
229    assertEquals("12:00 AM – 4:01 PM", formatDateRange(l, utc, midnight, teaTime + MINUTE, abbr12));
230  }
231
232  // http://b/10560853 - when the time is not displayed, an end time 0 ms into the next day is
233  // considered to belong to the previous day.
234  public void test10560853_when_time_not_displayed() throws Exception {
235    Locale l = Locale.US;
236    TimeZone utc = TimeZone.getTimeZone("UTC");
237
238    long midnight = 0;
239    long midnightNext = 1 * DAY;
240
241    int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_WEEKDAY;
242
243    // An all-day event runs until 0 milliseconds into the next day, but is formatted as if it's
244    // just the first day.
245    assertEquals("Thursday, January 1, 1970", formatDateRange(l, utc, midnight, midnightNext, flags));
246
247    // Run one millisecond over, though, and you're into the next day.
248    long nextMorning = 1 * DAY + 1;
249    assertEquals("Thursday, January 1 – Friday, January 2, 1970", formatDateRange(l, utc, midnight, nextMorning, flags));
250
251    // But the same reasoning applies for that day.
252    long nextMidnight = 2 * DAY;
253    assertEquals("Thursday, January 1 – Friday, January 2, 1970", formatDateRange(l, utc, midnight, nextMidnight, flags));
254  }
255
256  // http://b/10560853 - when the start and end times are otherwise on the same day,
257  // an end time 0 ms into the next day is considered to belong to the previous day.
258  public void test10560853_for_single_day_events() throws Exception {
259    Locale l = Locale.US;
260    TimeZone utc = TimeZone.getTimeZone("UTC");
261
262    int flags = FORMAT_SHOW_TIME | FORMAT_24HOUR | FORMAT_SHOW_DATE;
263
264    assertEquals("January 1, 1970, 22:00–00:00", formatDateRange(l, utc, 22 * HOUR, 24 * HOUR, flags));
265    assertEquals("January 1, 1970, 22:00 – January 2, 1970, 00:30", formatDateRange(l, utc, 22 * HOUR, 24 * HOUR + 30 * MINUTE, flags));
266  }
267
268  // http://b/10209343 - even if the caller didn't explicitly ask us to include the year,
269  // we should do so for years other than the current year.
270  public void test10209343_when_not_this_year() {
271    Locale l = Locale.US;
272    TimeZone utc = TimeZone.getTimeZone("UTC");
273
274    int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_WEEKDAY | FORMAT_SHOW_TIME | FORMAT_24HOUR;
275
276    assertEquals("Thursday, January 1, 1970, 00:00", formatDateRange(l, utc, 0L, 0L, flags));
277
278    long t1833 = ((long) Integer.MIN_VALUE + Integer.MIN_VALUE) * 1000L;
279    assertEquals("Sunday, November 24, 1833, 17:31", formatDateRange(l, utc, t1833, t1833, flags));
280
281    long t1901 = Integer.MIN_VALUE * 1000L;
282    assertEquals("Friday, December 13, 1901, 20:45", formatDateRange(l, utc, t1901, t1901, flags));
283
284    long t2038 = Integer.MAX_VALUE * 1000L;
285    assertEquals("Tuesday, January 19, 2038, 03:14", formatDateRange(l, utc, t2038, t2038, flags));
286
287    long t2106 = (2L + Integer.MAX_VALUE + Integer.MAX_VALUE) * 1000L;
288    assertEquals("Sunday, February 7, 2106, 06:28", formatDateRange(l, utc, t2106, t2106, flags));
289  }
290
291  // http://b/10209343 - for the current year, we should honor the FORMAT_SHOW_YEAR flags.
292  public void test10209343_when_this_year() {
293    // Construct a date in the current year (whenever the test happens to be run).
294    Locale l = Locale.US;
295    TimeZone utc = TimeZone.getTimeZone("UTC");
296    Calendar c = Calendar.getInstance(utc);
297    c.set(Calendar.MONTH, Calendar.FEBRUARY);
298    c.set(Calendar.DAY_OF_MONTH, 10);
299    c.set(Calendar.HOUR_OF_DAY, 0);
300    long thisYear = c.getTimeInMillis();
301
302    // You don't get the year if it's this year...
303    assertEquals("February 10", formatDateRange(l, utc, thisYear, thisYear, FORMAT_SHOW_DATE));
304
305    // ...unless you explicitly ask for it.
306    assertEquals(String.format("February 10, %d", c.get(Calendar.YEAR)),
307                 formatDateRange(l, utc, thisYear, thisYear, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR));
308
309    // ...or it's not actually this year...
310    Calendar c2 = (Calendar) c.clone();
311    c2.set(Calendar.YEAR, 1980);
312    long oldYear = c2.getTimeInMillis();
313    assertEquals("February 10, 1980", formatDateRange(l, utc, oldYear, oldYear, FORMAT_SHOW_DATE));
314
315    // (But you can disable that!)
316    assertEquals("February 10", formatDateRange(l, utc, oldYear, oldYear, FORMAT_SHOW_DATE | FORMAT_NO_YEAR));
317
318    // ...or the start and end years aren't the same...
319    assertEquals(String.format("February 10, 1980 – February 10, %d", c.get(Calendar.YEAR)),
320                 formatDateRange(l, utc, oldYear, thisYear, FORMAT_SHOW_DATE));
321
322    // (And you can't avoid that --- icu4c steps in and overrides you.)
323    assertEquals(String.format("February 10, 1980 – February 10, %d", c.get(Calendar.YEAR)),
324                 formatDateRange(l, utc, oldYear, thisYear, FORMAT_SHOW_DATE | FORMAT_NO_YEAR));
325  }
326}
327