• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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