1 /* 2 * Copyright (C) 2009 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 17 package android.text.format.cts; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertNotNull; 22 import static org.junit.Assert.assertSame; 23 import static org.junit.Assert.assertTrue; 24 25 import android.content.Context; 26 import android.support.test.InstrumentationRegistry; 27 import android.support.test.filters.SmallTest; 28 import android.support.test.runner.AndroidJUnit4; 29 import android.text.format.DateUtils; 30 31 import org.junit.Before; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 35 import java.util.Calendar; 36 import java.util.Date; 37 import java.util.Formatter; 38 import java.util.GregorianCalendar; 39 import java.util.Locale; 40 import java.util.TimeZone; 41 42 @SmallTest 43 @RunWith(AndroidJUnit4.class) 44 public class DateUtilsTest { 45 private long mBaseTime; 46 private Context mContext; 47 48 @Before setup()49 public void setup() { 50 mContext = InstrumentationRegistry.getTargetContext(); 51 TimeZone.setDefault(TimeZone.getTimeZone("GMT")); 52 mBaseTime = System.currentTimeMillis(); 53 } 54 55 @Test testGetDayOfWeekString()56 public void testGetDayOfWeekString() { 57 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 58 return; 59 } 60 61 assertEquals("Sunday", 62 DateUtils.getDayOfWeekString(Calendar.SUNDAY, DateUtils.LENGTH_LONG)); 63 assertEquals("Sun", 64 DateUtils.getDayOfWeekString(Calendar.SUNDAY, DateUtils.LENGTH_MEDIUM)); 65 assertEquals("Sun", 66 DateUtils.getDayOfWeekString(Calendar.SUNDAY, DateUtils.LENGTH_SHORT)); 67 assertEquals("Sun", 68 DateUtils.getDayOfWeekString(Calendar.SUNDAY, DateUtils.LENGTH_SHORTER)); 69 assertEquals("S", 70 DateUtils.getDayOfWeekString(Calendar.SUNDAY, DateUtils.LENGTH_SHORTEST)); 71 // Other abbrev 72 assertEquals("Sun", 73 DateUtils.getDayOfWeekString(Calendar.SUNDAY, 60)); 74 } 75 76 @Test testGetMonthString()77 public void testGetMonthString() { 78 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 79 return; 80 } 81 assertEquals("January", DateUtils.getMonthString(Calendar.JANUARY, DateUtils.LENGTH_LONG)); 82 assertEquals("Jan", 83 DateUtils.getMonthString(Calendar.JANUARY, DateUtils.LENGTH_MEDIUM)); 84 assertEquals("Jan", DateUtils.getMonthString(Calendar.JANUARY, DateUtils.LENGTH_SHORT)); 85 assertEquals("Jan", 86 DateUtils.getMonthString(Calendar.JANUARY, DateUtils.LENGTH_SHORTER)); 87 assertEquals("J", 88 DateUtils.getMonthString(Calendar.JANUARY, DateUtils.LENGTH_SHORTEST)); 89 // Other abbrev 90 assertEquals("Jan", DateUtils.getMonthString(Calendar.JANUARY, 60)); 91 } 92 93 @Test testGetAMPMString()94 public void testGetAMPMString() { 95 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 96 return; 97 } 98 assertEquals("AM", DateUtils.getAMPMString(Calendar.AM)); 99 assertEquals("PM", DateUtils.getAMPMString(Calendar.PM)); 100 } 101 102 // This is to test the mapping between DateUtils' public API and 103 // libcore/icu4c's implementation. More tests, in different locales, are 104 // in libcore's CTS tests. 105 @Test test_getRelativeTimeSpanString()106 public void test_getRelativeTimeSpanString() { 107 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 108 return; 109 } 110 111 final long ONE_SECOND_IN_MS = 1000; 112 assertEquals("0 minutes ago", 113 DateUtils.getRelativeTimeSpanString(mBaseTime - ONE_SECOND_IN_MS)); 114 assertEquals("In 0 minutes", 115 DateUtils.getRelativeTimeSpanString(mBaseTime + ONE_SECOND_IN_MS)); 116 117 final long ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS; 118 assertEquals("1 minute ago", DateUtils.getRelativeTimeSpanString(0, ONE_MINUTE_IN_MS, 119 DateUtils.MINUTE_IN_MILLIS)); 120 assertEquals("In 1 minute", DateUtils.getRelativeTimeSpanString(ONE_MINUTE_IN_MS, 0, 121 DateUtils.MINUTE_IN_MILLIS)); 122 123 final long ONE_HOUR_IN_MS = 60 * 60 * 1000; 124 final long TWO_HOURS_IN_MS = 2 * ONE_HOUR_IN_MS; 125 assertEquals("2 hours ago", DateUtils.getRelativeTimeSpanString(mBaseTime - TWO_HOURS_IN_MS, 126 mBaseTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE)); 127 assertEquals("In 2 hours", DateUtils.getRelativeTimeSpanString(mBaseTime + TWO_HOURS_IN_MS, 128 mBaseTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE)); 129 } 130 131 @Test test_getRelativeTimeSpanString_withContext()132 public void test_getRelativeTimeSpanString_withContext() { 133 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 134 return; 135 } 136 137 final GregorianCalendar cal = new GregorianCalendar(); 138 cal.setTimeInMillis(mBaseTime); 139 cal.set(Calendar.HOUR_OF_DAY, 10); 140 cal.set(Calendar.MINUTE, 0); 141 final long today10am = cal.getTimeInMillis(); 142 143 final CharSequence withPrep = DateUtils.getRelativeTimeSpanString(mContext, today10am, 144 true /* with preposition */); 145 final CharSequence noPrep = DateUtils.getRelativeTimeSpanString(mContext, today10am, 146 false /* no preposition */); 147 assertEquals(noPrep, DateUtils.getRelativeTimeSpanString(mContext, today10am)); 148 149 if (android.text.format.DateFormat.is24HourFormat(mContext)) { 150 assertEquals("at 10:00", withPrep); 151 assertEquals("10:00", noPrep); 152 } else { 153 assertEquals("at 10:00 AM", withPrep); 154 assertEquals("10:00 AM", noPrep); 155 } 156 } 157 158 // Similar to test_getRelativeTimeSpanString(). The function here is to 159 // test the mapping between DateUtils's public API and libcore/icu4c's 160 // implementation. More tests, in different locales, are in libcore's 161 // CTS tests. 162 @Test test_getRelativeDateTimeString()163 public void test_getRelativeDateTimeString() { 164 final long DAY_DURATION = 5 * 24 * 60 * 60 * 1000; 165 assertNotNull(DateUtils.getRelativeDateTimeString(mContext, mBaseTime - DAY_DURATION, 166 DateUtils.MINUTE_IN_MILLIS, DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_NUMERIC_DATE)); 167 } 168 169 @Test test_formatElapsedTime()170 public void test_formatElapsedTime() { 171 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 172 return; 173 } 174 175 long MINUTES = 60; 176 long HOURS = 60 * MINUTES; 177 verifyFormatElapsedTime("02:01", 2 * MINUTES + 1); 178 verifyFormatElapsedTime("3:02:01", 3 * HOURS + 2 * MINUTES + 1); 179 // http://code.google.com/p/android/issues/detail?id=41401 180 verifyFormatElapsedTime("123:02:01", 123 * HOURS + 2 * MINUTES + 1); 181 } 182 verifyFormatElapsedTime(String expected, long elapsedTime)183 private void verifyFormatElapsedTime(String expected, long elapsedTime) { 184 assertEquals(expected, DateUtils.formatElapsedTime(elapsedTime)); 185 StringBuilder sb = new StringBuilder(); 186 assertEquals(expected, DateUtils.formatElapsedTime(sb, elapsedTime)); 187 assertEquals(expected, sb.toString()); 188 } 189 190 // This is just to exercise the wrapper that calls the libcore/icu4c implementation. 191 // Full testing, in multiple locales, is in libcore's CTS tests. 192 @Test testFormatDateRange()193 public void testFormatDateRange() { 194 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 195 return; 196 } 197 198 final Date date = new Date(109, 0, 19, 3, 30, 15); 199 final long fixedTime = date.getTime(); 200 final long hourDuration = 2 * 60 * 60 * 1000; 201 assertEquals("Monday", DateUtils.formatDateRange(mContext, fixedTime, 202 fixedTime + hourDuration, DateUtils.FORMAT_SHOW_WEEKDAY)); 203 } 204 205 @Test testFormatDateRange_withFormatter()206 public void testFormatDateRange_withFormatter() { 207 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 208 return; 209 } 210 211 final Date date = new Date(109, 0, 19, 3, 30, 15); 212 final long fixedTime = date.getTime(); 213 final long hourDuration = 2 * 60 * 60 * 1000; 214 final Formatter formatter = new Formatter(); 215 final Formatter result = DateUtils.formatDateRange(mContext, formatter, fixedTime, 216 fixedTime + hourDuration, DateUtils.FORMAT_SHOW_WEEKDAY); 217 assertEquals("Monday", result.toString()); 218 assertSame(result, formatter); 219 } 220 221 @Test testFormatDateRange_withFormatterAndTimezone()222 public void testFormatDateRange_withFormatterAndTimezone() { 223 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 224 return; 225 } 226 227 final Date date = new Date(109, 0, 19, 3, 30, 15); 228 final long fixedTime = date.getTime(); 229 final long hourDuration = 2 * 60 * 60 * 1000; 230 final Formatter formatter = new Formatter(); 231 final Formatter result = DateUtils.formatDateRange(mContext, formatter, fixedTime, 232 fixedTime + hourDuration, DateUtils.FORMAT_SHOW_WEEKDAY, null /* local */); 233 assertEquals("Monday", result.toString()); 234 assertSame(result, formatter); 235 } 236 237 @Test testFormatDateTime()238 public void testFormatDateTime() { 239 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 240 return; 241 } 242 243 final Date date = new Date(109, 0, 19, 3, 30, 15); 244 final long fixedTime = date.getTime(); 245 assertEquals("Monday", DateUtils.formatDateTime(mContext, fixedTime, 246 DateUtils.FORMAT_SHOW_WEEKDAY)); 247 } 248 249 @Test testIsToday()250 public void testIsToday() { 251 final long ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; 252 assertTrue(DateUtils.isToday(mBaseTime)); 253 assertFalse(DateUtils.isToday(mBaseTime - ONE_DAY_IN_MS)); 254 } 255 256 @Test test_bug_7548161()257 public void test_bug_7548161() { 258 if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) { 259 return; 260 } 261 262 long now = System.currentTimeMillis(); 263 long today = now; 264 long tomorrow = now + DateUtils.DAY_IN_MILLIS; 265 long yesterday = now - DateUtils.DAY_IN_MILLIS; 266 assertEquals("Tomorrow", DateUtils.getRelativeTimeSpanString(tomorrow, now, 267 DateUtils.DAY_IN_MILLIS, 0)); 268 assertEquals("Yesterday", DateUtils.getRelativeTimeSpanString(yesterday, now, 269 DateUtils.DAY_IN_MILLIS, 0)); 270 assertEquals("Today", DateUtils.getRelativeTimeSpanString(today, now, 271 DateUtils.DAY_IN_MILLIS, 0)); 272 } 273 } 274