Fix emulator build error
[platform/framework/web/chromium-efl.git] / base / i18n / time_formatting_unittest.cc
1 // Copyright 2011 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/i18n/time_formatting.h"
6
7 #include <memory>
8
9 #include "base/i18n/rtl.h"
10 #include "base/i18n/unicodestring.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/test/icu_test_util.h"
13 #include "base/time/time.h"
14 #include "build/build_config.h"
15 #include "build/chromeos_buildflags.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/icu/source/common/unicode/uversion.h"
18 #include "third_party/icu/source/i18n/unicode/calendar.h"
19 #include "third_party/icu/source/i18n/unicode/timezone.h"
20 #include "third_party/icu/source/i18n/unicode/tzfmt.h"
21
22 namespace base {
23 namespace {
24
25 constexpr Time::Exploded kTestDateTimeExploded = {.year = 2011,
26                                                   .month = 4,
27                                                   .day_of_week = 6,
28                                                   .day_of_month = 30,
29                                                   .hour = 22,
30                                                   .minute = 42,
31                                                   .second = 7};
32
33 // Returns difference between the local time and GMT formatted as string.
34 // This function gets |time| because the difference depends on time,
35 // see https://en.wikipedia.org/wiki/Daylight_saving_time for details.
36 std::u16string GetShortTimeZone(const Time& time) {
37   UErrorCode status = U_ZERO_ERROR;
38   std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
39   std::unique_ptr<icu::TimeZoneFormat> zone_formatter(
40       icu::TimeZoneFormat::createInstance(icu::Locale::getDefault(), status));
41   EXPECT_TRUE(U_SUCCESS(status));
42   icu::UnicodeString name;
43   zone_formatter->format(
44       UTZFMT_STYLE_SPECIFIC_SHORT, *zone,
45       static_cast<UDate>(time.InSecondsFSinceUnixEpoch() * 1000), name,
46       nullptr);
47   return i18n::UnicodeStringToString16(name);
48 }
49
50 // Calls TimeDurationFormat() with |delta| and |width| and returns the resulting
51 // string. On failure, adds a failed expectation and returns an empty string.
52 std::u16string TimeDurationFormatString(const TimeDelta& delta,
53                                         DurationFormatWidth width) {
54   std::u16string str;
55   EXPECT_TRUE(TimeDurationFormat(delta, width, &str))
56       << "Failed to format " << delta.ToInternalValue() << " with width "
57       << width;
58   return str;
59 }
60
61 // Calls TimeDurationFormatWithSeconds() with |delta| and |width| and returns
62 // the resulting string. On failure, adds a failed expectation and returns an
63 // empty string.
64 std::u16string TimeDurationFormatWithSecondsString(const TimeDelta& delta,
65                                                    DurationFormatWidth width) {
66   std::u16string str;
67   EXPECT_TRUE(TimeDurationFormatWithSeconds(delta, width, &str))
68       << "Failed to format " << delta.ToInternalValue() << " with width "
69       << width;
70   return str;
71 }
72
73 TEST(TimeFormattingTest, TimeFormatTimeOfDayDefault12h) {
74   // Test for a locale defaulted to 12h clock.
75   // As an instance, we use third_party/icu/source/data/locales/en.txt.
76   test::ScopedRestoreICUDefaultLocale restore_locale;
77   i18n::SetICUDefaultLocale("en_US");
78   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
79
80   Time time;
81   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
82   std::u16string clock24h(u"15:42");
83   std::u16string clock12h_pm(u"3:42\u202fPM");
84   std::u16string clock12h(u"3:42");
85   std::u16string clock24h_millis(u"15:42:07.000");
86
87   // The default is 12h clock.
88   EXPECT_EQ(clock12h_pm, TimeFormatTimeOfDay(time));
89   EXPECT_EQ(clock24h_millis, TimeFormatTimeOfDayWithMilliseconds(time));
90   EXPECT_EQ(k12HourClock, GetHourClockType());
91   // k{Keep,Drop}AmPm should not affect for 24h clock.
92   EXPECT_EQ(clock24h,
93             TimeFormatTimeOfDayWithHourClockType(time,
94                                                  k24HourClock,
95                                                  kKeepAmPm));
96   EXPECT_EQ(clock24h,
97             TimeFormatTimeOfDayWithHourClockType(time,
98                                                  k24HourClock,
99                                                  kDropAmPm));
100   // k{Keep,Drop}AmPm affects for 12h clock.
101   EXPECT_EQ(clock12h_pm,
102             TimeFormatTimeOfDayWithHourClockType(time,
103                                                  k12HourClock,
104                                                  kKeepAmPm));
105   EXPECT_EQ(clock12h,
106             TimeFormatTimeOfDayWithHourClockType(time,
107                                                  k12HourClock,
108                                                  kDropAmPm));
109 }
110
111 TEST(TimeFormattingTest, TimeFormatTimeOfDayDefault24h) {
112   // Test for a locale defaulted to 24h clock.
113   // As an instance, we use third_party/icu/source/data/locales/en_GB.txt.
114   test::ScopedRestoreICUDefaultLocale restore_locale;
115   i18n::SetICUDefaultLocale("en_GB");
116   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
117
118   Time time;
119   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
120   std::u16string clock24h(u"15:42");
121   std::u16string clock12h_pm(u"3:42\u202fpm");
122   std::u16string clock12h(u"3:42");
123   std::u16string clock24h_millis(u"15:42:07.000");
124
125   // The default is 24h clock.
126   EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
127   EXPECT_EQ(clock24h_millis, TimeFormatTimeOfDayWithMilliseconds(time));
128   EXPECT_EQ(k24HourClock, GetHourClockType());
129   // k{Keep,Drop}AmPm should not affect for 24h clock.
130   EXPECT_EQ(clock24h,
131             TimeFormatTimeOfDayWithHourClockType(time,
132                                                  k24HourClock,
133                                                  kKeepAmPm));
134   EXPECT_EQ(clock24h,
135             TimeFormatTimeOfDayWithHourClockType(time,
136                                                  k24HourClock,
137                                                  kDropAmPm));
138   // k{Keep,Drop}AmPm affects for 12h clock.
139   EXPECT_EQ(clock12h_pm,
140             TimeFormatTimeOfDayWithHourClockType(time,
141                                                  k12HourClock,
142                                                  kKeepAmPm));
143   EXPECT_EQ(clock12h,
144             TimeFormatTimeOfDayWithHourClockType(time,
145                                                  k12HourClock,
146                                                  kDropAmPm));
147 }
148
149 TEST(TimeFormattingTest, TimeFormatTimeOfDayJP) {
150   // Test for a locale that uses different mark than "AM" and "PM".
151   // As an instance, we use third_party/icu/source/data/locales/ja.txt.
152   test::ScopedRestoreICUDefaultLocale restore_locale;
153   i18n::SetICUDefaultLocale("ja_JP");
154   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
155
156   Time time;
157   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
158   std::u16string clock24h(u"15:42");
159   std::u16string clock12h_pm(u"午後3:42");
160   std::u16string clock12h(u"3:42");
161
162   // The default is 24h clock.
163   EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
164   EXPECT_EQ(k24HourClock, GetHourClockType());
165   // k{Keep,Drop}AmPm should not affect for 24h clock.
166   EXPECT_EQ(clock24h, TimeFormatTimeOfDayWithHourClockType(time, k24HourClock,
167                                                            kKeepAmPm));
168   EXPECT_EQ(clock24h, TimeFormatTimeOfDayWithHourClockType(time, k24HourClock,
169                                                            kDropAmPm));
170   // k{Keep,Drop}AmPm affects for 12h clock.
171   EXPECT_EQ(clock12h_pm, TimeFormatTimeOfDayWithHourClockType(
172                              time, k12HourClock, kKeepAmPm));
173   EXPECT_EQ(clock12h, TimeFormatTimeOfDayWithHourClockType(time, k12HourClock,
174                                                            kDropAmPm));
175 }
176
177 TEST(TimeFormattingTest, TimeFormatTimeOfDayDE) {
178   // German uses 24h by default, but uses 'AM', 'PM' for 12h format.
179   test::ScopedRestoreICUDefaultLocale restore_locale;
180   i18n::SetICUDefaultLocale("de");
181   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
182
183   Time time;
184   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
185   std::u16string clock24h(u"15:42");
186   std::u16string clock12h_pm(u"3:42\u202fPM");
187   std::u16string clock12h(u"3:42");
188
189   // The default is 24h clock.
190   EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
191   EXPECT_EQ(k24HourClock, GetHourClockType());
192   // k{Keep,Drop}AmPm should not affect for 24h clock.
193   EXPECT_EQ(clock24h,
194             TimeFormatTimeOfDayWithHourClockType(time,
195                                                  k24HourClock,
196                                                  kKeepAmPm));
197   EXPECT_EQ(clock24h,
198             TimeFormatTimeOfDayWithHourClockType(time,
199                                                  k24HourClock,
200                                                  kDropAmPm));
201   // k{Keep,Drop}AmPm affects for 12h clock.
202   EXPECT_EQ(clock12h_pm,
203             TimeFormatTimeOfDayWithHourClockType(time,
204                                                  k12HourClock,
205                                                  kKeepAmPm));
206   EXPECT_EQ(clock12h,
207             TimeFormatTimeOfDayWithHourClockType(time,
208                                                  k12HourClock,
209                                                  kDropAmPm));
210 }
211
212 #if BUILDFLAG(IS_CHROMEOS_ASH)
213 TEST(TimeFormattingTest, TimeMonthYearInUTC) {
214   // See third_party/icu/source/data/locales/en.txt.
215   // The date patterns are "EEEE, MMMM d, y", "MMM d, y", and "M/d/yy".
216   test::ScopedRestoreICUDefaultLocale restore_locale;
217   i18n::SetICUDefaultLocale("en_US");
218   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
219
220   Time time;
221   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
222   EXPECT_EQ(u"April 2011",
223             TimeFormatMonthAndYearForTimeZone(time, icu::TimeZone::getGMT()));
224   EXPECT_EQ(u"April 2011", TimeFormatMonthAndYear(time));
225
226   const Time::Exploded kDiffMonthsForDiffTzTime = {
227       2011, 4, 5, 1,  // Fri, Apr 1, 2011 UTC = Thurs, March 31, 2011 US PDT.
228       0,    0, 0, 0   // 00:00:00.000 UTC = 05:00:00 previous day US PDT.
229   };
230
231   EXPECT_TRUE(Time::FromUTCExploded(kDiffMonthsForDiffTzTime, &time));
232   EXPECT_EQ(u"April 2011",
233             TimeFormatMonthAndYearForTimeZone(time, icu::TimeZone::getGMT()));
234   EXPECT_EQ(u"March 2011", TimeFormatMonthAndYear(time));
235 }
236 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
237
238 TEST(TimeFormattingTest, TimeFormatDateUS) {
239   // See third_party/icu/source/data/locales/en.txt.
240   // The date patterns are "EEEE, MMMM d, y", "MMM d, y", and "M/d/yy".
241   test::ScopedRestoreICUDefaultLocale restore_locale;
242   i18n::SetICUDefaultLocale("en_US");
243   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
244
245   Time time;
246   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
247
248   EXPECT_EQ(u"Apr 30, 2011", TimeFormatShortDate(time));
249   EXPECT_EQ(u"4/30/11", TimeFormatShortDateNumeric(time));
250
251   EXPECT_EQ(u"4/30/11, 3:42:07\u202fPM", TimeFormatShortDateAndTime(time));
252   EXPECT_EQ(u"4/30/11, 3:42:07\u202fPM " + GetShortTimeZone(time),
253             TimeFormatShortDateAndTimeWithTimeZone(time));
254
255   EXPECT_EQ(u"April 2011", TimeFormatMonthAndYear(time));
256
257   EXPECT_EQ(u"Saturday, April 30, 2011 at 3:42:07\u202fPM",
258             TimeFormatFriendlyDateAndTime(time));
259
260   EXPECT_EQ(u"Saturday, April 30, 2011", TimeFormatFriendlyDate(time));
261 }
262
263 TEST(TimeFormattingTest, TimeFormatDateGB) {
264   // See third_party/icu/source/data/locales/en_GB.txt.
265   // The date patterns are "EEEE, d MMMM y", "d MMM y", and "dd/MM/yyyy".
266   test::ScopedRestoreICUDefaultLocale restore_locale;
267   i18n::SetICUDefaultLocale("en_GB");
268   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
269
270   Time time;
271   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
272
273   EXPECT_EQ(u"30 Apr 2011", TimeFormatShortDate(time));
274   EXPECT_EQ(u"30/04/2011", TimeFormatShortDateNumeric(time));
275   EXPECT_EQ(u"30/04/2011, 15:42:07", TimeFormatShortDateAndTime(time));
276   EXPECT_EQ(u"30/04/2011, 15:42:07 " + GetShortTimeZone(time),
277             TimeFormatShortDateAndTimeWithTimeZone(time));
278   EXPECT_EQ(u"April 2011", TimeFormatMonthAndYear(time));
279   EXPECT_EQ(u"Saturday, 30 April 2011 at 15:42:07",
280             TimeFormatFriendlyDateAndTime(time));
281   EXPECT_EQ(u"Saturday, 30 April 2011", TimeFormatFriendlyDate(time));
282 }
283
284 TEST(TimeFormattingTest, TimeFormatWithPattern) {
285   test::ScopedRestoreICUDefaultLocale restore_locale;
286   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
287
288   Time time;
289   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
290
291   i18n::SetICUDefaultLocale("en_US");
292   EXPECT_EQ(u"Apr 30, 2011", LocalizedTimeFormatWithPattern(time, "yMMMd"));
293   EXPECT_EQ(u"April 30 at 3:42:07\u202fPM",
294             LocalizedTimeFormatWithPattern(time, "MMMMdjmmss"));
295   EXPECT_EQ(
296       "Sat! 30 Apr 2011 at 15.42+07",
297       UnlocalizedTimeFormatWithPattern(time, "E! dd MMM y 'at' HH.mm+ss"));
298   EXPECT_EQ("Sat! 30 Apr 2011 at 22.42+07",
299             UnlocalizedTimeFormatWithPattern(time, "E! dd MMM y 'at' HH.mm+ss",
300                                              icu::TimeZone::getGMT()));
301
302   i18n::SetICUDefaultLocale("en_GB");
303   EXPECT_EQ(u"30 Apr 2011", LocalizedTimeFormatWithPattern(time, "yMMMd"));
304   EXPECT_EQ(u"30 April at 15:42:07",
305             LocalizedTimeFormatWithPattern(time, "MMMMdjmmss"));
306   EXPECT_EQ(
307       "Sat! 30 Apr 2011 at 15.42+07",
308       UnlocalizedTimeFormatWithPattern(time, "E! dd MMM y 'at' HH.mm+ss"));
309
310   i18n::SetICUDefaultLocale("ja_JP");
311   EXPECT_EQ(u"2011年4月30日", LocalizedTimeFormatWithPattern(time, "yMMMd"));
312   EXPECT_EQ(u"4月30日 15:42:07",
313             LocalizedTimeFormatWithPattern(time, "MMMMdjmmss"));
314   EXPECT_EQ(
315       "Sat! 30 Apr 2011 at 15.42+07",
316       UnlocalizedTimeFormatWithPattern(time, "E! dd MMM y 'at' HH.mm+ss"));
317 }
318
319 TEST(TimeFormattingTest, UnlocalizedTimeFormatWithPatternMicroseconds) {
320   Time no_micros;
321   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &no_micros));
322   const Time micros = no_micros + Microseconds(987);
323
324   // Should support >3 'S' characters, truncating.
325   EXPECT_EQ("07.0009", UnlocalizedTimeFormatWithPattern(micros, "ss.SSSS"));
326   EXPECT_EQ("07.00098", UnlocalizedTimeFormatWithPattern(micros, "ss.SSSSS"));
327   EXPECT_EQ("07.000987", UnlocalizedTimeFormatWithPattern(micros, "ss.SSSSSS"));
328
329   // >6 'S' characters is also valid, and should be zero-filled.
330   EXPECT_EQ("07.0009870",
331             UnlocalizedTimeFormatWithPattern(micros, "ss.SSSSSSS"));
332
333   // Quoted 'S's should be ignored.
334   EXPECT_EQ("07.SSSSSS",
335             UnlocalizedTimeFormatWithPattern(micros, "ss.'SSSSSS'"));
336
337   // Multiple substitutions are possible.
338   EXPECT_EQ("07.000987'000987.07",
339             UnlocalizedTimeFormatWithPattern(micros, "ss.SSSSSS''SSSSSS.ss"));
340
341   // All the above should still work when the number of microseconds is zero.
342   EXPECT_EQ("07.0000", UnlocalizedTimeFormatWithPattern(no_micros, "ss.SSSS"));
343   EXPECT_EQ("07.00000",
344             UnlocalizedTimeFormatWithPattern(no_micros, "ss.SSSSS"));
345   EXPECT_EQ("07.000000",
346             UnlocalizedTimeFormatWithPattern(no_micros, "ss.SSSSSS"));
347   EXPECT_EQ("07.0000000",
348             UnlocalizedTimeFormatWithPattern(no_micros, "ss.SSSSSSS"));
349   EXPECT_EQ("07.SSSSSS",
350             UnlocalizedTimeFormatWithPattern(no_micros, "ss.'SSSSSS'"));
351   EXPECT_EQ("07.000000'000000.07", UnlocalizedTimeFormatWithPattern(
352                                        no_micros, "ss.SSSSSS''SSSSSS.ss"));
353 }
354
355 TEST(TimeFormattingTest, TimeFormatAsIso8601) {
356   Time time;
357   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
358   EXPECT_EQ("2011-04-30T22:42:07.000Z", TimeFormatAsIso8601(time));
359 }
360
361 TEST(TimeFormattingTest, TimeFormatHTTP) {
362   Time time;
363   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
364   EXPECT_EQ("Sat, 30 Apr 2011 22:42:07 GMT", TimeFormatHTTP(time));
365 }
366
367 TEST(TimeFormattingTest, TimeDurationFormat) {
368   test::ScopedRestoreICUDefaultLocale restore_locale;
369   TimeDelta delta = Minutes(15 * 60 + 42);
370
371   // US English.
372   i18n::SetICUDefaultLocale("en_US");
373   EXPECT_EQ(u"15 hours, 42 minutes",
374             TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
375   EXPECT_EQ(u"15 hr, 42 min",
376             TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
377   EXPECT_EQ(u"15h 42m", TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
378   EXPECT_EQ(u"15:42", TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
379
380   // Danish, with Latin alphabet but different abbreviations and punctuation.
381   i18n::SetICUDefaultLocale("da");
382   EXPECT_EQ(u"15 timer og 42 minutter",
383             TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
384   EXPECT_EQ(u"15 t. og 42 min.",
385             TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
386   EXPECT_EQ(u"15 t og 42 m",
387             TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
388   EXPECT_EQ(u"15.42", TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
389
390   // Persian, with non-Arabic numbers.
391   i18n::SetICUDefaultLocale("fa");
392   std::u16string fa_wide =
393       u"\u06f1\u06f5 \u0633\u0627\u0639\u062a \u0648 \u06f4\u06f2 \u062f\u0642"
394       u"\u06cc\u0642\u0647";
395   std::u16string fa_short =
396       u"\u06f1\u06f5 \u0633\u0627\u0639\u062a\u060c\u200f \u06f4\u06f2 \u062f"
397       u"\u0642\u06cc\u0642\u0647";
398   std::u16string fa_narrow = u"\u06f1\u06f5h \u06f4\u06f2m";
399   std::u16string fa_numeric = u"\u06f1\u06f5:\u06f4\u06f2";
400   EXPECT_EQ(fa_wide, TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
401   EXPECT_EQ(fa_short, TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
402   EXPECT_EQ(fa_narrow, TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
403   EXPECT_EQ(fa_numeric,
404             TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
405 }
406
407 TEST(TimeFormattingTest, TimeDurationFormatWithSeconds) {
408   test::ScopedRestoreICUDefaultLocale restore_locale;
409
410   // US English.
411   i18n::SetICUDefaultLocale("en_US");
412
413   // Test different formats.
414   TimeDelta delta = Seconds(15 * 3600 + 42 * 60 + 30);
415   EXPECT_EQ(u"15 hours, 42 minutes, 30 seconds",
416             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
417   EXPECT_EQ(u"15 hr, 42 min, 30 sec",
418             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
419   EXPECT_EQ(u"15h 42m 30s",
420             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
421   EXPECT_EQ(u"15:42:30",
422             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
423
424   // Test edge case when hour >= 100.
425   delta = Seconds(125 * 3600 + 42 * 60 + 30);
426   EXPECT_EQ(u"125 hours, 42 minutes, 30 seconds",
427             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
428   EXPECT_EQ(u"125 hr, 42 min, 30 sec",
429             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
430   EXPECT_EQ(u"125h 42m 30s",
431             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
432   EXPECT_EQ(u"125:42:30",
433             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
434
435   // Test edge case when minute = 0.
436   delta = Seconds(15 * 3600 + 0 * 60 + 30);
437   EXPECT_EQ(u"15 hours, 0 minutes, 30 seconds",
438             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
439   EXPECT_EQ(u"15 hr, 0 min, 30 sec",
440             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
441   EXPECT_EQ(u"15h 0m 30s",
442             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
443   EXPECT_EQ(u"15:00:30",
444             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
445
446   // Test edge case when second = 0.
447   delta = Seconds(15 * 3600 + 42 * 60 + 0);
448   EXPECT_EQ(u"15 hours, 42 minutes, 0 seconds",
449             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
450   EXPECT_EQ(u"15 hr, 42 min, 0 sec",
451             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
452   EXPECT_EQ(u"15h 42m 0s",
453             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
454   EXPECT_EQ(u"15:42:00",
455             TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
456 }
457
458 TEST(TimeFormattingTest, TimeIntervalFormat) {
459   test::ScopedRestoreICUDefaultLocale restore_locale;
460   i18n::SetICUDefaultLocale("en_US");
461   test::ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
462
463   const Time::Exploded kTestIntervalEndTimeExploded = {
464       2011, 5,  6, 28,  // Sat, May 28, 2012
465       22,   42, 7, 0    // 22:42:07.000
466   };
467
468   Time begin_time;
469   EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &begin_time));
470   Time end_time;
471   EXPECT_TRUE(Time::FromUTCExploded(kTestIntervalEndTimeExploded, &end_time));
472
473   EXPECT_EQ(
474       u"Saturday, April 30\u2009–\u2009Saturday, May 28",
475       DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
476
477   const Time::Exploded kTestIntervalBeginTimeExploded = {
478       2011, 5,  1, 16,  // Mon, May 16, 2012
479       22,   42, 7, 0    // 22:42:07.000
480   };
481   EXPECT_TRUE(
482       Time::FromUTCExploded(kTestIntervalBeginTimeExploded, &begin_time));
483   EXPECT_EQ(
484       u"Monday, May 16\u2009–\u2009Saturday, May 28",
485       DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
486
487   i18n::SetICUDefaultLocale("en_GB");
488   EXPECT_EQ(
489       u"Monday 16\u2009–\u2009Saturday 28 May",
490       DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
491
492   i18n::SetICUDefaultLocale("ja");
493   EXPECT_EQ(
494       u"5月16日(月曜日)~28日(土曜日)",
495       DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
496 }
497
498 }  // namespace
499 }  // namespace base