1 /* 2 * Copyright (C) 2010 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 com.android.calendar; 18 19 import com.android.calendar.CalendarUtils.TimeZoneUtils; 20 21 import android.content.res.Configuration; 22 import android.content.res.Resources.NotFoundException; 23 import android.database.MatrixCursor; 24 import android.provider.CalendarContract.CalendarCache; 25 import android.test.mock.MockResources; 26 import android.test.suitebuilder.annotation.SmallTest; 27 import android.test.suitebuilder.annotation.Smoke; 28 import android.text.format.Time; 29 30 import java.util.HashMap; 31 import java.util.Locale; 32 33 import junit.framework.TestCase; 34 35 /** 36 * Test class for verifying helper functions in Calendar's Utils 37 * 38 * You can run these tests with the following command: 39 * "adb shell am instrument -w -e class com.android.calendar.UtilsTests 40 * com.android.calendar.tests/android.test.InstrumentationTestRunner" 41 */ 42 public class UtilsTests extends TestCase { 43 HashMap<String, Boolean> mIsDuplicateName; 44 HashMap<String, Boolean> mIsDuplicateNameExpected; 45 MatrixCursor mDuplicateNameCursor; 46 private DbTestUtils dbUtils; 47 private final TimeZoneUtils timezoneUtils = new TimeZoneUtils(Utils.SHARED_PREFS_NAME); 48 49 private static final int NAME_COLUMN = 0; 50 private static final String[] DUPLICATE_NAME_COLUMNS = new String[] { "name" }; 51 private static final String[][] DUPLICATE_NAMES = new String[][] { 52 {"Pepper Pots"}, 53 {"Green Goblin"}, 54 {"Pepper Pots"}, 55 {"Peter Parker"}, 56 {"Silver Surfer"}, 57 {"John Jameson"}, 58 {"John Jameson"}, 59 {"Pepper Pots"} 60 }; 61 // First date is Thursday, Jan 1st, 1970. 62 private static final int[] JULIAN_DAYS = {2440588, 2440589, 2440590, 2440591, 2440592, 2440593, 63 2440594, 2440595, 2440596, 2440597, 2440598, 2440599, 2440600, 2440601 64 }; 65 private static final int[] EXPECTED_WEEK_MONDAY_START = { 66 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 }; 67 private static final int[] EXPECTED_WEEK_SUNDAY_START = { 68 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 }; 69 private static final int[] EXPECTED_WEEK_SATURDAY_START = { 70 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; 71 private static final int[] WEEKS_FOR_JULIAN_MONDAYS = {1, 2}; 72 private static final int[] EXPECTED_JULIAN_MONDAYS = {2440592, 2440599}; 73 74 private static final int NOW_MONTH = 3; // April 75 private static final int NOW_DAY = 10; 76 private static final int NOW_YEAR = 2012; 77 private static final long NOW_TIME = createTimeInMillis(5, 5, 5, NOW_DAY, NOW_MONTH, NOW_YEAR); 78 private static final String DEFAULT_TIMEZONE = Time.getCurrentTimezone(); 79 80 /** 81 * Mock resources. Add translation strings for test here. 82 */ 83 private static class ResourcesForTest extends MockResources { 84 @Override getString(int id)85 public String getString(int id) { 86 if (id == R.string.today) { 87 return "Today"; 88 } 89 if (id == R.string.tomorrow) { 90 return "Tomorrow"; 91 } 92 throw new IllegalArgumentException("unexpected resource ID: " + id); 93 } 94 95 @Override getString(int id, Object... formatArgs)96 public String getString(int id, Object... formatArgs) { 97 if (id == R.string.today_at_time_fmt) { 98 return String.format("Today at %s", formatArgs); 99 } 100 if (id == R.string.tomorrow_at_time_fmt) { 101 return String.format("Tomorrow at %s", formatArgs); 102 } 103 if (id == R.string.date_time_fmt) { 104 return String.format("%s, %s", formatArgs); 105 } 106 throw new IllegalArgumentException("unexpected resource ID: " + id); 107 } 108 109 @Override getConfiguration()110 public Configuration getConfiguration() { 111 Configuration config = new Configuration(); 112 config.locale = Locale.getDefault(); 113 return config; 114 } 115 } 116 createTimeInMillis(int second, int minute, int hour, int monthDay, int month, int year)117 private static long createTimeInMillis(int second, int minute, int hour, int monthDay, 118 int month, int year) { 119 return createTimeInMillis(second, minute, hour, monthDay, month, year, 120 Time.getCurrentTimezone()); 121 } 122 createTimeInMillis(int second, int minute, int hour, int monthDay, int month, int year, String timezone)123 private static long createTimeInMillis(int second, int minute, int hour, int monthDay, 124 int month, int year, String timezone) { 125 Time t = new Time(timezone); 126 t.set(second, minute, hour, monthDay, month, year); 127 t.normalize(false); 128 return t.toMillis(false); 129 } 130 setTimezone(String tz)131 private void setTimezone(String tz) { 132 timezoneUtils.setTimeZone(dbUtils.getContext(), tz); 133 } 134 135 @Override setUp()136 public void setUp() { 137 mIsDuplicateName = new HashMap<String, Boolean> (); 138 mDuplicateNameCursor = new MatrixCursor(DUPLICATE_NAME_COLUMNS); 139 for (int i = 0; i < DUPLICATE_NAMES.length; i++) { 140 mDuplicateNameCursor.addRow(DUPLICATE_NAMES[i]); 141 } 142 143 mIsDuplicateNameExpected = new HashMap<String, Boolean> (); 144 mIsDuplicateNameExpected.put("Pepper Pots", true); 145 mIsDuplicateNameExpected.put("Green Goblin", false); 146 mIsDuplicateNameExpected.put("Peter Parker", false); 147 mIsDuplicateNameExpected.put("Silver Surfer", false); 148 mIsDuplicateNameExpected.put("John Jameson", true); 149 150 // Set up fake db. 151 dbUtils = new DbTestUtils(new ResourcesForTest()); 152 dbUtils.getContentResolver().addProvider("settings", dbUtils.getContentProvider()); 153 dbUtils.getContentResolver().addProvider(CalendarCache.URI.getAuthority(), 154 dbUtils.getContentProvider()); 155 setTimezone(DEFAULT_TIMEZONE); 156 } 157 158 @Override tearDown()159 public void tearDown() { 160 mDuplicateNameCursor.close(); 161 162 // Must reset the timezone here, because even though the fake provider will be 163 // recreated/cleared, TimeZoneUtils statically holds on to a cached value. 164 setTimezone(Time.getCurrentTimezone()); 165 } 166 167 @Smoke 168 @SmallTest testCheckForDuplicateNames()169 public void testCheckForDuplicateNames() { 170 Utils.checkForDuplicateNames(mIsDuplicateName, mDuplicateNameCursor, NAME_COLUMN); 171 assertEquals(mIsDuplicateName, mIsDuplicateNameExpected); 172 } 173 174 @Smoke 175 @SmallTest testGetWeeksSinceEpochFromJulianDay()176 public void testGetWeeksSinceEpochFromJulianDay() { 177 for (int i = 0; i < JULIAN_DAYS.length; i++) { 178 assertEquals(EXPECTED_WEEK_MONDAY_START[i], 179 Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.MONDAY)); 180 assertEquals(EXPECTED_WEEK_SUNDAY_START[i], 181 Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.SUNDAY)); 182 assertEquals(EXPECTED_WEEK_SATURDAY_START[i], 183 Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.SATURDAY)); 184 } 185 } 186 187 @Smoke 188 @SmallTest testGetJulianMondayFromWeeksSinceEpoch()189 public void testGetJulianMondayFromWeeksSinceEpoch() { 190 for (int i = 0; i < WEEKS_FOR_JULIAN_MONDAYS.length; i++) { 191 assertEquals(EXPECTED_JULIAN_MONDAYS[i], 192 Utils.getJulianMondayFromWeeksSinceEpoch(WEEKS_FOR_JULIAN_MONDAYS[i])); 193 } 194 } 195 196 @Smoke 197 @SmallTest testEquals()198 public void testEquals() { 199 assertTrue(Utils.equals(null, null)); 200 assertFalse(Utils.equals("", null)); 201 assertFalse(Utils.equals(null, "")); 202 assertTrue(Utils.equals("","")); 203 204 Integer int1 = new Integer(1); 205 Integer int2 = new Integer(1); 206 assertTrue(Utils.equals(int1, int2)); 207 } 208 209 210 // Helper function to create test events for BusyBits testing buildTestEvent(int startTime, int endTime, boolean allDay, int startDay, int endDay)211 Event buildTestEvent(int startTime, int endTime, boolean allDay, int startDay, int endDay) { 212 Event e = new Event(); 213 e.startTime = startTime; 214 e.endTime = endTime; 215 e.allDay = allDay; 216 e.startDay = startDay; 217 e.endDay = endDay; 218 e.startMillis = e.startDay * 1000L * 3600L * 24L + e.startTime * 60L * 1000L; 219 e.endMillis = e.endDay * 1000L * 3600L * 24L + e.endTime * 60L * 1000L; 220 return e; 221 } 222 223 @Smoke 224 @SmallTest testCreateBusyBitSegments()225 public void testCreateBusyBitSegments() { 226 227 /* ArrayList<Event> events = new ArrayList<Event>(); 228 229 // Test cases that should return null 230 // Empty events list 231 assertEquals(null, Utils.createBusyBitSegments(10, 30, 100, 200, 0, events)); 232 // No events list 233 assertEquals(null, Utils.createBusyBitSegments(10, 30, 100, 200, 0, null)); 234 235 events.add(buildTestEvent(100, 130, false, 1, 1)); 236 events.add(buildTestEvent(1000, 1030, false, 1, 1)); 237 // Illegal pixel positions 238 assertEquals(null, Utils.createBusyBitSegments(30, 10, 100, 200, 1, events)); 239 // Illegal start and end times 240 assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, 100, 1, events)); 241 assertEquals(null, Utils.createBusyBitSegments(10, 30, -10, 100, 1, events)); 242 assertEquals(null, Utils.createBusyBitSegments(10, 30, 24 * 60 + 100, 24 * 60 + 200, 1, 243 events)); 244 assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, 24 * 60 + 100, 1, events)); 245 assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, -100, 1, events)); 246 // No Events in time frame 247 assertEquals(null, Utils.createBusyBitSegments(10, 30, 500, 900, 1, events)); 248 249 // Test event that spans over the day 250 events.clear(); 251 events.add(buildTestEvent(100, 300, false, 1, 5)); 252 ArrayList<BusyBitsSegment> segments = new ArrayList<BusyBitsSegment>(); 253 assertEquals(null, Utils.createBusyBitSegments(0, 250, 200, 1200, 3, events)); 254 255 // test zero times events, events that are partially in the time span 256 // and all day events 257 events.clear(); 258 events.add(buildTestEvent(100, 300, false, 1, 1)); 259 events.add(buildTestEvent(1100, 1300, false, 1, 1)); 260 events.add(buildTestEvent(500, 600, true, 1, 1)); 261 events.add(buildTestEvent(700, 700, false, 1, 1)); 262 segments.clear(); 263 segments.add(new BusyBitsSegment(0, 10, false)); 264 segments.add(new BusyBitsSegment(90, 100, false)); 265 assertEquals(segments, Utils.createBusyBitSegments(0, 100, 200, 1200, 1, events)); 266 267 // Test event that spans over 2 days but start and end time do not 268 // overlap fully with tested time span 269 270 events.clear(); 271 events.add(buildTestEvent(23 * 60, 120, false, 1, 2)); 272 segments.clear(); 273 segments.add(new BusyBitsSegment(0, 120, false)); 274 assertEquals(segments, Utils.createBusyBitSegments(0, 240, 60, 180, 2, events)); 275 276 // Test overlapped events (two draw sizes) 277 events.clear(); 278 events.add(buildTestEvent(10, 200, false, 1, 1)); 279 events.add(buildTestEvent(150, 250, false, 1, 1)); 280 events.add(buildTestEvent(150, 250, false, 1, 1)); 281 events.add(buildTestEvent(200, 400, false, 1, 1)); 282 events.add(buildTestEvent(500, 700, false, 1, 1)); 283 events.add(buildTestEvent(550, 600, false, 1, 1)); 284 events.add(buildTestEvent(550, 580, false, 1, 1)); 285 events.add(buildTestEvent(560, 570, false, 1, 1)); 286 events.add(buildTestEvent(600, 700, false, 1, 1)); 287 events.add(buildTestEvent(620, 700, false, 1, 1)); 288 events.add(buildTestEvent(650, 700, false, 1, 1)); 289 events.add(buildTestEvent(800, 900, false, 1, 1)); 290 events.add(buildTestEvent(800, 900, false, 1, 1)); 291 events.add(buildTestEvent(800, 850, false, 1, 1)); 292 events.add(buildTestEvent(1000, 1200, false, 1, 1)); 293 events.add(buildTestEvent(1000, 1200, false, 1, 1)); 294 segments.clear(); 295 segments.add(new BusyBitsSegment(100, 149, false)); 296 segments.add(new BusyBitsSegment(150, 250, true)); 297 segments.add(new BusyBitsSegment(251, 400, false)); 298 segments.add(new BusyBitsSegment(500, 549, false)); 299 segments.add(new BusyBitsSegment(550, 700, true)); 300 segments.add(new BusyBitsSegment(800, 900, true)); 301 segments.add(new BusyBitsSegment(1000, 1100, true)); 302 assertEquals(segments, Utils.createBusyBitSegments(100, 1100, 100, 1100, 1, events)); 303 segments.clear(); 304 segments.add(new BusyBitsSegment(100, 111, false)); 305 segments.add(new BusyBitsSegment(112, 137, true)); 306 segments.add(new BusyBitsSegment(138, 175, false)); 307 segments.add(new BusyBitsSegment(200, 211, false)); 308 segments.add(new BusyBitsSegment(212, 250, true)); 309 segments.add(new BusyBitsSegment(275, 300, true)); 310 segments.add(new BusyBitsSegment(325, 350, true)); 311 assertEquals(segments, Utils.createBusyBitSegments(100, 350, 100, 1100, 1, events)); 312 */ 313 } 314 315 /** 316 * Tests the findNanpPhoneNumbers function. 317 */ 318 @SmallTest testFindNanpPhoneNumber()319 public void testFindNanpPhoneNumber() { 320 final String[] NO_NUMBERS = new String[] {}; 321 322 findPhoneNumber("", NO_NUMBERS); 323 findPhoneNumber(" ", NO_NUMBERS); 324 findPhoneNumber("123", NO_NUMBERS); 325 findPhoneNumber("how much wood", NO_NUMBERS); 326 findPhoneNumber("abc1-650-555-1212", NO_NUMBERS); 327 findPhoneNumber("abc 5551212 def", new String[] { "5551212" }); 328 findPhoneNumber("1234567", NO_NUMBERS); 329 findPhoneNumber(" 2345678 ", new String[] { "2345678" }); 330 findPhoneNumber("1234567890", NO_NUMBERS); 331 findPhoneNumber("12345678901", new String[] { "12345678901" }); 332 findPhoneNumber("123456789012", NO_NUMBERS); 333 findPhoneNumber("+1-555-1212", NO_NUMBERS); 334 findPhoneNumber("+1 (650) 555-1212", new String[] { "+1 (650) 555-1212" }); 335 findPhoneNumber("(650) 555-1212, (650) 555-1213", 336 new String[] { "(650) 555-1212", "(650) 555-1213" }); 337 findPhoneNumber("Call 555-1212, 555-1213 and also 555-1214.", 338 new String[] { "555-1212", "555-1213", "555-1214." }); 339 findPhoneNumber("555-1212,555-1213,555-1214", new String[] { "555-1212" }); 340 findPhoneNumber("123 (650) 555-1212", new String[] { "(650) 555-1212" }); 341 findPhoneNumber("1-650-555-1212", new String[] { "1-650-555-1212" }); 342 findPhoneNumber("1650-555-1212", new String[] { "1650-555-1212" }); 343 findPhoneNumber("1650 555-1212", new String[] { "1650 555-1212" }); 344 findPhoneNumber("1650/555-1212", NO_NUMBERS); 345 findPhoneNumber("1650-555 1212", NO_NUMBERS); 346 findPhoneNumber("8-650-555-1212", NO_NUMBERS); 347 findPhoneNumber("8 650-555-1212", new String[] { "650-555-1212" }); 348 findPhoneNumber("650.555.1212", new String[] { "650.555.1212" }); 349 findPhoneNumber(" *#650.555.1212#*!", new String[] { "*#650.555.1212#*" }); 350 findPhoneNumber("555.1212", new String[] { "555.1212" }); 351 findPhoneNumber("6505551212 x123, 555-1212", new String[] { "6505551212", "555-1212" }); 352 findPhoneNumber("6505551212x123", new String[] { "6505551212" }); 353 findPhoneNumber("http://example.com/6505551212/", NO_NUMBERS); 354 findPhoneNumber("Mountain View, CA 94043 (650) 555-1212", new String[]{ "(650) 555-1212" }); 355 findPhoneNumber("New York, NY 10001-0001", NO_NUMBERS); 356 } 357 358 /** 359 * Finds the numbers in a block of text, and checks to see if the positions of the numbers 360 * match the expected values. 361 * 362 * @param text The text to search. 363 * @param matches Pairs of start/end positions. 364 */ findPhoneNumber(String text, String[] matches)365 private static void findPhoneNumber(String text, String[] matches) { 366 int[] results = EventInfoFragment.findNanpPhoneNumbers(text); 367 368 assertEquals(results.length % 2, 0); 369 370 if (results.length / 2 != matches.length) { 371 fail("Text '" + text + "': expected " + matches.length 372 + " matches, found " + results.length / 2); 373 } 374 375 for (int i = 0; i < results.length / 2; i++) { 376 CharSequence seq = text.subSequence(results[i*2], results[i*2 + 1]); 377 assertEquals(matches[i], seq); 378 } 379 } 380 381 @SmallTest testGetDisplayedDatetime_differentYear()382 public void testGetDisplayedDatetime_differentYear() { 383 // 4/12/2000 5pm - 4/12/2000 6pm 384 long start = createTimeInMillis(0, 0, 17, 12, 3, 2000); 385 long end = createTimeInMillis(0, 0, 18, 12, 3, 2000); 386 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 387 false, dbUtils.getContext()); 388 assertEquals("Wednesday, April 12, 2000, 5:00pm \u2013 6:00pm", result); 389 390 // 12/31/2012 5pm - 1/1/2013 6pm 391 start = createTimeInMillis(0, 0, 17, 31, 11, 2012); 392 end = createTimeInMillis(0, 0, 18, 1, 0, 2013); 393 result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 394 false, dbUtils.getContext()); 395 assertEquals("Mon, Dec 31, 2012, 5:00pm – Tue, Jan 1, 2013, 6:00pm", result); 396 } 397 398 @SmallTest testGetDisplayedDatetime_sameYear()399 public void testGetDisplayedDatetime_sameYear() { 400 // 4/12/2012 5pm - 4/12/2012 6pm 401 long start = createTimeInMillis(0, 0, 17, 12, 3, 2012); 402 long end = createTimeInMillis(0, 0, 18, 12, 3, 2012); 403 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 404 false, dbUtils.getContext()); 405 assertEquals("Thursday, April 12, 5:00pm \u2013 6:00pm", result); 406 } 407 408 @SmallTest testGetDisplayedDatetime_today()409 public void testGetDisplayedDatetime_today() { 410 // 4/10/2012 5pm - 4/10/2012 6pm 411 long start = createTimeInMillis(0, 0, 17, NOW_DAY, NOW_MONTH, NOW_YEAR); 412 long end = createTimeInMillis(0, 0, 18, NOW_DAY, NOW_MONTH, NOW_YEAR); 413 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 414 false, dbUtils.getContext()); 415 assertEquals("Today at 5:00pm \u2013 6:00pm", result); 416 } 417 418 @SmallTest testGetDisplayedDatetime_todayMidnight()419 public void testGetDisplayedDatetime_todayMidnight() { 420 // 4/10/2012 5pm - 4/11/2012 12am 421 long start = createTimeInMillis(0, 0, 17, NOW_DAY, NOW_MONTH, NOW_YEAR); 422 long end = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 423 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 424 false, dbUtils.getContext()); 425 assertEquals("Today at 5:00pm \u2013 midnight", result); 426 } 427 428 @SmallTest testGetDisplayedDatetime_tomorrow()429 public void testGetDisplayedDatetime_tomorrow() { 430 // 4/11/2012 12:01am - 4/11/2012 11:59pm 431 long start = createTimeInMillis(0, 1, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 432 long end = createTimeInMillis(0, 59, 23, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 433 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 434 false, dbUtils.getContext()); 435 assertEquals("Tomorrow at 12:01am \u2013 11:59pm", result); 436 } 437 438 @SmallTest testGetDisplayedDatetime_yesterday()439 public void testGetDisplayedDatetime_yesterday() { 440 // 4/9/2012 5pm - 4/9/2012 6pm 441 long start = createTimeInMillis(0, 0, 17, 9, 3, 2012); 442 long end = createTimeInMillis(0, 0, 18, 9, 3, 2012); 443 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 444 false, dbUtils.getContext()); 445 assertEquals("Monday, April 9, 5:00pm \u2013 6:00pm", result); 446 } 447 448 @SmallTest testGetDisplayedDatetime_multiDay()449 public void testGetDisplayedDatetime_multiDay() { 450 // 4/10/2012 12:01am - 4/11/2012 12:01am 451 long start = createTimeInMillis(0, 1, 0, NOW_DAY, NOW_MONTH, NOW_YEAR); 452 long end = createTimeInMillis(0, 1, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 453 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 454 false, dbUtils.getContext()); 455 assertEquals("Tue, Apr 10, 12:01am \u2013 Wed, Apr 11, 12:01am", result); 456 } 457 458 @SmallTest testGetDisplayedDatetime_allDay()459 public void testGetDisplayedDatetime_allDay() { 460 // 4/2/2012 12:00am - 4/3/2012 12:00am 461 long start = createTimeInMillis(0, 0, 0, 2, 3, NOW_YEAR, Time.TIMEZONE_UTC); 462 long end = createTimeInMillis(0, 0, 0, 3, 3, NOW_YEAR, Time.TIMEZONE_UTC); 463 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 464 true, dbUtils.getContext()); 465 assertEquals("Monday, April 2", result); 466 } 467 468 @SmallTest testGetDisplayedDatetime_allDayToday()469 public void testGetDisplayedDatetime_allDayToday() { 470 // 4/10/2012 12:00am - 4/11/2012 12:00am 471 long start = createTimeInMillis(0, 0, 0, NOW_DAY, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 472 long end = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 473 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 474 true, dbUtils.getContext()); 475 assertEquals("Today", result); 476 } 477 478 @SmallTest testGetDisplayedDatetime_allDayMultiday()479 public void testGetDisplayedDatetime_allDayMultiday() { 480 // 4/10/2012 12:00am - 4/13/2012 12:00am 481 long start = createTimeInMillis(0, 0, 0, NOW_DAY, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 482 long end = createTimeInMillis(0, 0, 0, NOW_DAY + 3, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 483 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 484 true, dbUtils.getContext()); 485 assertEquals("Tuesday, April 10 \u2013 Thursday, April 12", result); 486 } 487 488 @SmallTest testGetDisplayedDatetime_differentTimezone()489 public void testGetDisplayedDatetime_differentTimezone() { 490 String localTz = "America/New_York"; 491 String eventTz = "America/Los_Angeles"; 492 setTimezone(localTz); 493 494 // 4/12/2012 5pm - 4/12/2012 6pm (Pacific) 495 long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, eventTz); 496 long end = createTimeInMillis(0, 0, 18, 12, 3, 2012, eventTz); 497 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, false, 498 dbUtils.getContext()); 499 assertEquals("Thursday, April 12, 8:00pm \u2013 9:00pm", result); 500 } 501 502 @SmallTest testGetDisplayedDatetime_allDayDiffTimezone()503 public void testGetDisplayedDatetime_allDayDiffTimezone() { 504 String localTz = "America/New_York"; 505 setTimezone(localTz); 506 507 // 4/2/2012 12:00am - 4/3/2012 12:00am 508 long start = createTimeInMillis(0, 0, 0, 2, 3, NOW_YEAR, Time.TIMEZONE_UTC); 509 long end = createTimeInMillis(0, 0, 0, 3, 3, NOW_YEAR, Time.TIMEZONE_UTC); 510 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, true, 511 dbUtils.getContext()); 512 assertEquals("Monday, April 2", result); 513 } 514 515 @SmallTest testGetDisplayedDatetime_allDayTomorrowDiffTimezone()516 public void testGetDisplayedDatetime_allDayTomorrowDiffTimezone() { 517 String localTz = "America/New_York"; 518 setTimezone(localTz); 519 520 // 4/2/2012 12:00am - 4/3/2012 12:00am 521 long start = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR, 522 Time.TIMEZONE_UTC); 523 long end = createTimeInMillis(0, 0, 0, NOW_DAY + 2, NOW_MONTH, NOW_YEAR, 524 Time.TIMEZONE_UTC); 525 String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, true, 526 dbUtils.getContext()); 527 assertEquals("Tomorrow", result); 528 } 529 530 // TODO: add tests for army time. 531 532 @SmallTest testGetDisplayedTimezone_sameTimezone()533 public void testGetDisplayedTimezone_sameTimezone() { 534 String localTz = "America/New_York"; 535 setTimezone(localTz); 536 537 // 4/12/2012 5pm 538 long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, localTz); 539 assertNull(Utils.getDisplayedTimezone(start, localTz, localTz)); 540 } 541 542 @SmallTest testGetDisplayedTimezone_differentTimezone()543 public void testGetDisplayedTimezone_differentTimezone() { 544 String localTz = "America/New_York"; 545 String eventTz = "America/Los_Angeles"; 546 setTimezone(localTz); 547 548 // 1/12/2012 5pm (not daylight savings) 549 long start = createTimeInMillis(0, 0, 17, 12, 0, 2012, eventTz); 550 assertEquals("EST", Utils.getDisplayedTimezone(start, localTz, eventTz)); 551 } 552 553 @SmallTest testGetDisplayedTimezone_differentTimezoneDst()554 public void testGetDisplayedTimezone_differentTimezoneDst() { 555 String localTz = "America/New_York"; 556 String eventTz = "America/Los_Angeles"; 557 setTimezone(localTz); 558 559 // 4/12/2012 5pm (daylight savings) 560 long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, eventTz); 561 assertEquals("EDT", Utils.getDisplayedTimezone(start, localTz, eventTz)); 562 } 563 } 564