16e25f480f8dbf18f32248f3666be1e9dd52d3225Erik/* 26e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * Copyright (C) 2010 The Android Open Source Project 36e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * 46e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * Licensed under the Apache License, Version 2.0 (the "License"); 56e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * you may not use this file except in compliance with the License. 66e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * You may obtain a copy of the License at 76e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * 86e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * http://www.apache.org/licenses/LICENSE-2.0 96e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * 106e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * Unless required by applicable law or agreed to in writing, software 116e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * distributed under the License is distributed on an "AS IS" BASIS, 126e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * See the License for the specific language governing permissions and 146e25f480f8dbf18f32248f3666be1e9dd52d3225Erik * limitations under the License. 156e25f480f8dbf18f32248f3666be1e9dd52d3225Erik */ 166e25f480f8dbf18f32248f3666be1e9dd52d3225Erik 17ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanpackage com.android.calendar; 18ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 1929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport com.android.calendar.Utils; 2075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Tingimport com.android.calendar.CalendarUtils.TimeZoneUtils; 2182400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 2229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.content.Context; 2375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Tingimport android.content.res.Configuration; 2429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.content.res.Resources; 254e92627c5eb10de50c49c57e116b080d48360c70Sara Tingimport android.content.res.Resources.NotFoundException; 26ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport android.database.MatrixCursor; 2775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Tingimport android.provider.CalendarContract.CalendarCache; 2875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Tingimport android.test.mock.MockResources; 29ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport android.test.suitebuilder.annotation.SmallTest; 307e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chanimport android.test.suitebuilder.annotation.Smoke; 3129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.text.Spannable; 3229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.text.SpannableString; 33981874e61ecf29a96a77601a3172b2503b6537eeErikimport android.text.format.Time; 3429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.text.style.URLSpan; 3529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.util.DisplayMetrics; 3629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.util.Log; 3729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.view.Display; 3829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.view.View; 3929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.view.WindowManager; 4029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.view.ViewGroup.LayoutParams; 4129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport android.widget.TextView; 4229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 4329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport java.util.ArrayList; 4429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport java.util.Arrays; 45ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport java.util.HashMap; 4629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzsteinimport java.util.Iterator; 4775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Tingimport java.util.Locale; 487e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan 497e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chanimport junit.framework.TestCase; 50ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 51ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan/** 52ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * Test class for verifying helper functions in Calendar's Utils 53ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * 54ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * You can run these tests with the following command: 55ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * "adb shell am instrument -w -e class com.android.calendar.UtilsTests 56ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * com.android.calendar.tests/android.test.InstrumentationTestRunner" 57ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan */ 58ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanpublic class UtilsTests extends TestCase { 59ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan HashMap<String, Boolean> mIsDuplicateName; 60ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan HashMap<String, Boolean> mIsDuplicateNameExpected; 61ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan MatrixCursor mDuplicateNameCursor; 6275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private DbTestUtils dbUtils; 6375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private final TimeZoneUtils timezoneUtils = new TimeZoneUtils(Utils.SHARED_PREFS_NAME); 64ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 65ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final int NAME_COLUMN = 0; 66ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final String[] DUPLICATE_NAME_COLUMNS = new String[] { "name" }; 67ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final String[][] DUPLICATE_NAMES = new String[][] { 68ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Pepper Pots"}, 69ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Green Goblin"}, 70ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Pepper Pots"}, 71ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Peter Parker"}, 72ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Silver Surfer"}, 73ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"John Jameson"}, 74ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"John Jameson"}, 75ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan {"Pepper Pots"} 76ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan }; 77981874e61ecf29a96a77601a3172b2503b6537eeErik // First date is Thursday, Jan 1st, 1970. 78981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] JULIAN_DAYS = {2440588, 2440589, 2440590, 2440591, 2440592, 2440593, 79981874e61ecf29a96a77601a3172b2503b6537eeErik 2440594, 2440595, 2440596, 2440597, 2440598, 2440599, 2440600, 2440601 80981874e61ecf29a96a77601a3172b2503b6537eeErik }; 81981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] EXPECTED_WEEK_MONDAY_START = { 82981874e61ecf29a96a77601a3172b2503b6537eeErik 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 }; 83981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] EXPECTED_WEEK_SUNDAY_START = { 84981874e61ecf29a96a77601a3172b2503b6537eeErik 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 }; 85981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] EXPECTED_WEEK_SATURDAY_START = { 86981874e61ecf29a96a77601a3172b2503b6537eeErik 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; 87981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] WEEKS_FOR_JULIAN_MONDAYS = {1, 2}; 88981874e61ecf29a96a77601a3172b2503b6537eeErik private static final int[] EXPECTED_JULIAN_MONDAYS = {2440592, 2440599}; 89ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 9075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static final int NOW_MONTH = 3; // April 9175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static final int NOW_DAY = 10; 9275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static final int NOW_YEAR = 2012; 9375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static final long NOW_TIME = createTimeInMillis(5, 5, 5, NOW_DAY, NOW_MONTH, NOW_YEAR); 9475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static final String DEFAULT_TIMEZONE = Time.getCurrentTimezone(); 9575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 9675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting /** 9775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting * Mock resources. Add translation strings for test here. 9875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting */ 9975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static class ResourcesForTest extends MockResources { 10075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @Override 10175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public String getString(int id) { 10275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting if (id == R.string.today) { 10375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting return "Today"; 10475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 10575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting if (id == R.string.tomorrow) { 10675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting return "Tomorrow"; 10775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 10875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting throw new IllegalArgumentException("unexpected resource ID: " + id); 10975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 11075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 11175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @Override 1124e92627c5eb10de50c49c57e116b080d48360c70Sara Ting public String getString(int id, Object... formatArgs) { 1134e92627c5eb10de50c49c57e116b080d48360c70Sara Ting if (id == R.string.today_at_time_fmt) { 1144e92627c5eb10de50c49c57e116b080d48360c70Sara Ting return String.format("Today at %s", formatArgs); 1154e92627c5eb10de50c49c57e116b080d48360c70Sara Ting } 1164e92627c5eb10de50c49c57e116b080d48360c70Sara Ting if (id == R.string.tomorrow_at_time_fmt) { 1174e92627c5eb10de50c49c57e116b080d48360c70Sara Ting return String.format("Tomorrow at %s", formatArgs); 1184e92627c5eb10de50c49c57e116b080d48360c70Sara Ting } 1194e92627c5eb10de50c49c57e116b080d48360c70Sara Ting if (id == R.string.date_time_fmt) { 1204e92627c5eb10de50c49c57e116b080d48360c70Sara Ting return String.format("%s, %s", formatArgs); 1214e92627c5eb10de50c49c57e116b080d48360c70Sara Ting } 1224e92627c5eb10de50c49c57e116b080d48360c70Sara Ting throw new IllegalArgumentException("unexpected resource ID: " + id); 1234e92627c5eb10de50c49c57e116b080d48360c70Sara Ting } 1244e92627c5eb10de50c49c57e116b080d48360c70Sara Ting 1254e92627c5eb10de50c49c57e116b080d48360c70Sara Ting @Override 12675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public Configuration getConfiguration() { 12775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Configuration config = new Configuration(); 12875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting config.locale = Locale.getDefault(); 12975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting return config; 13075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 13129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 13229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein @Override 13329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein public DisplayMetrics getDisplayMetrics(){ 13429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein DisplayMetrics metrics = new DisplayMetrics(); 13529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein metrics.density = 2.0f; 13629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein return metrics; 13729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 13875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 13975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 14075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static long createTimeInMillis(int second, int minute, int hour, int monthDay, 14175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting int month, int year) { 14275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting return createTimeInMillis(second, minute, hour, monthDay, month, year, 14375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Time.getCurrentTimezone()); 14475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 14575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 14675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private static long createTimeInMillis(int second, int minute, int hour, int monthDay, 14775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting int month, int year, String timezone) { 14875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Time t = new Time(timezone); 14975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting t.set(second, minute, hour, monthDay, month, year); 15075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting t.normalize(false); 15175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting return t.toMillis(false); 15275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 15375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 15475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting private void setTimezone(String tz) { 15575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting timezoneUtils.setTimeZone(dbUtils.getContext(), tz); 15675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 15775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 158ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan @Override 159ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan public void setUp() { 160ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateName = new HashMap<String, Boolean> (); 161ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mDuplicateNameCursor = new MatrixCursor(DUPLICATE_NAME_COLUMNS); 162ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan for (int i = 0; i < DUPLICATE_NAMES.length; i++) { 163ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mDuplicateNameCursor.addRow(DUPLICATE_NAMES[i]); 164ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 165ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 166ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected = new HashMap<String, Boolean> (); 167ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected.put("Pepper Pots", true); 168ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected.put("Green Goblin", false); 169ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected.put("Peter Parker", false); 170ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected.put("Silver Surfer", false); 171ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mIsDuplicateNameExpected.put("John Jameson", true); 17275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 17375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // Set up fake db. 17475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting dbUtils = new DbTestUtils(new ResourcesForTest()); 17575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting dbUtils.getContentResolver().addProvider("settings", dbUtils.getContentProvider()); 17675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting dbUtils.getContentResolver().addProvider(CalendarCache.URI.getAuthority(), 17775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting dbUtils.getContentProvider()); 17829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 17975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTimezone(DEFAULT_TIMEZONE); 180ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 181ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 182ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan @Override 183ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan public void tearDown() { 184ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan mDuplicateNameCursor.close(); 18575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 18675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // Must reset the timezone here, because even though the fake provider will be 18775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // recreated/cleared, TimeZoneUtils statically holds on to a cached value. 18875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTimezone(Time.getCurrentTimezone()); 189ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 190ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 1917e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan @Smoke 192ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan @SmallTest 193ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan public void testCheckForDuplicateNames() { 194ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan Utils.checkForDuplicateNames(mIsDuplicateName, mDuplicateNameCursor, NAME_COLUMN); 195b25c663d28585fc9a4a2e31caa82b53a37509c83Sam Blitzstein assertEquals(mIsDuplicateNameExpected, mIsDuplicateName); 196ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 1979138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang 1989138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang @Smoke 1999138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang @SmallTest 200981874e61ecf29a96a77601a3172b2503b6537eeErik public void testGetWeeksSinceEpochFromJulianDay() { 201981874e61ecf29a96a77601a3172b2503b6537eeErik for (int i = 0; i < JULIAN_DAYS.length; i++) { 202981874e61ecf29a96a77601a3172b2503b6537eeErik assertEquals(EXPECTED_WEEK_MONDAY_START[i], 203981874e61ecf29a96a77601a3172b2503b6537eeErik Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.MONDAY)); 204981874e61ecf29a96a77601a3172b2503b6537eeErik assertEquals(EXPECTED_WEEK_SUNDAY_START[i], 205981874e61ecf29a96a77601a3172b2503b6537eeErik Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.SUNDAY)); 206981874e61ecf29a96a77601a3172b2503b6537eeErik assertEquals(EXPECTED_WEEK_SATURDAY_START[i], 207981874e61ecf29a96a77601a3172b2503b6537eeErik Utils.getWeeksSinceEpochFromJulianDay(JULIAN_DAYS[i], Time.SATURDAY)); 208981874e61ecf29a96a77601a3172b2503b6537eeErik } 209981874e61ecf29a96a77601a3172b2503b6537eeErik } 210981874e61ecf29a96a77601a3172b2503b6537eeErik 211981874e61ecf29a96a77601a3172b2503b6537eeErik @Smoke 212981874e61ecf29a96a77601a3172b2503b6537eeErik @SmallTest 213981874e61ecf29a96a77601a3172b2503b6537eeErik public void testGetJulianMondayFromWeeksSinceEpoch() { 214981874e61ecf29a96a77601a3172b2503b6537eeErik for (int i = 0; i < WEEKS_FOR_JULIAN_MONDAYS.length; i++) { 215981874e61ecf29a96a77601a3172b2503b6537eeErik assertEquals(EXPECTED_JULIAN_MONDAYS[i], 216981874e61ecf29a96a77601a3172b2503b6537eeErik Utils.getJulianMondayFromWeeksSinceEpoch(WEEKS_FOR_JULIAN_MONDAYS[i])); 217981874e61ecf29a96a77601a3172b2503b6537eeErik } 218981874e61ecf29a96a77601a3172b2503b6537eeErik } 219981874e61ecf29a96a77601a3172b2503b6537eeErik 220981874e61ecf29a96a77601a3172b2503b6537eeErik @Smoke 221981874e61ecf29a96a77601a3172b2503b6537eeErik @SmallTest 2229138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang public void testEquals() { 2239138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang assertTrue(Utils.equals(null, null)); 2249138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang assertFalse(Utils.equals("", null)); 2259138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang assertFalse(Utils.equals(null, "")); 2269138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang assertTrue(Utils.equals("","")); 2279138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang 2289138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang Integer int1 = new Integer(1); 2299138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang Integer int2 = new Integer(1); 2309138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang assertTrue(Utils.equals(int1, int2)); 2319138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang } 23282400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 23372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson 23472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Helper function to create test events for BusyBits testing 23572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson Event buildTestEvent(int startTime, int endTime, boolean allDay, int startDay, int endDay) { 23672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson Event e = new Event(); 23772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.startTime = startTime; 23872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.endTime = endTime; 23972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.allDay = allDay; 24072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.startDay = startDay; 24172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.endDay = endDay; 24272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.startMillis = e.startDay * 1000L * 3600L * 24L + e.startTime * 60L * 1000L; 24372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson e.endMillis = e.endDay * 1000L * 3600L * 24L + e.endTime * 60L * 1000L; 24472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson return e; 24572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson } 24672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson 24782400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson @Smoke 24882400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson @SmallTest 24982400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson public void testCreateBusyBitSegments() { 25082400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 25171b9ce3a20ebaff8f7e40fc0e5ec2a388bcc394cIsaac Katzenelson /* ArrayList<Event> events = new ArrayList<Event>(); 25282400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 25382400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson // Test cases that should return null 25472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Empty events list 255c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 100, 200, 0, events)); 25672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // No events list 257c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 100, 200, 0, null)); 25882400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 25972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(100, 130, false, 1, 1)); 26072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(1000, 1030, false, 1, 1)); 26172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Illegal pixel positions 262c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(30, 10, 100, 200, 1, events)); 26372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Illegal start and end times 264c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, 100, 1, events)); 26572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, -10, 100, 1, events)); 26672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 24 * 60 + 100, 24 * 60 + 200, 1, 26772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events)); 26872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, 24 * 60 + 100, 1, events)); 26972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 200, -100, 1, events)); 27072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // No Events in time frame 27172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(10, 30, 500, 900, 1, events)); 27272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson 27372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Test event that spans over the day 274c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson events.clear(); 27572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(100, 300, false, 1, 5)); 276c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson ArrayList<BusyBitsSegment> segments = new ArrayList<BusyBitsSegment>(); 27772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(null, Utils.createBusyBitSegments(0, 250, 200, 1200, 3, events)); 27882400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 27972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // test zero times events, events that are partially in the time span 28072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // and all day events 28182400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson events.clear(); 28272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(100, 300, false, 1, 1)); 28372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(1100, 1300, false, 1, 1)); 28472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(500, 600, true, 1, 1)); 28572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(700, 700, false, 1, 1)); 286c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson segments.clear(); 28772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(0, 10, false)); 28872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(90, 100, false)); 289c18dd7aea8c8ee06dd34f268ea9e0e9e7c235b7fIsaac Katzenelson assertEquals(segments, Utils.createBusyBitSegments(0, 100, 200, 1200, 1, events)); 29082400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 29172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Test event that spans over 2 days but start and end time do not 29272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // overlap fully with tested time span 29382400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 29482400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson events.clear(); 29572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(23 * 60, 120, false, 1, 2)); 29672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.clear(); 29772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(0, 120, false)); 29872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(segments, Utils.createBusyBitSegments(0, 240, 60, 180, 2, events)); 29982400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson 30072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson // Test overlapped events (two draw sizes) 30172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.clear(); 30272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(10, 200, false, 1, 1)); 30372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(150, 250, false, 1, 1)); 30472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(150, 250, false, 1, 1)); 30572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(200, 400, false, 1, 1)); 30672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(500, 700, false, 1, 1)); 30772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(550, 600, false, 1, 1)); 30872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(550, 580, false, 1, 1)); 30972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(560, 570, false, 1, 1)); 31072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(600, 700, false, 1, 1)); 31172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(620, 700, false, 1, 1)); 31272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(650, 700, false, 1, 1)); 31372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(800, 900, false, 1, 1)); 31472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(800, 900, false, 1, 1)); 31572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(800, 850, false, 1, 1)); 31672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(1000, 1200, false, 1, 1)); 31772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson events.add(buildTestEvent(1000, 1200, false, 1, 1)); 31882400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson segments.clear(); 31972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(100, 149, false)); 32072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(150, 250, true)); 32172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(251, 400, false)); 32272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(500, 549, false)); 32372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(550, 700, true)); 32472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(800, 900, true)); 32572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(1000, 1100, true)); 32672a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(segments, Utils.createBusyBitSegments(100, 1100, 100, 1100, 1, events)); 32772a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.clear(); 32872a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(100, 111, false)); 32972a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(112, 137, true)); 33072a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(138, 175, false)); 33172a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(200, 211, false)); 33272a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(212, 250, true)); 33372a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(275, 300, true)); 33472a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson segments.add(new BusyBitsSegment(325, 350, true)); 33572a9459e1f4cec02ad9e8dbdf824d66920b762eeIsaac Katzenelson assertEquals(segments, Utils.createBusyBitSegments(100, 350, 100, 1100, 1, events)); 33671b9ce3a20ebaff8f7e40fc0e5ec2a388bcc394cIsaac Katzenelson*/ 33782400dd70331df7885dd59b809c4bc0667046320Isaac Katzenelson } 338fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 339fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden /** 340fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * Tests the findNanpPhoneNumbers function. 341fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden */ 342fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden @SmallTest 343fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden public void testFindNanpPhoneNumber() { 344fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden final String[] NO_NUMBERS = new String[] {}; 345fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 346fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("", NO_NUMBERS); 347fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber(" ", NO_NUMBERS); 348fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("123", NO_NUMBERS); 349fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("how much wood", NO_NUMBERS); 350fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("abc1-650-555-1212", NO_NUMBERS); 351fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("abc 5551212 def", new String[] { "5551212" }); 352fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1234567", NO_NUMBERS); 353fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber(" 2345678 ", new String[] { "2345678" }); 354fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1234567890", NO_NUMBERS); 355fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("12345678901", new String[] { "12345678901" }); 356fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("123456789012", NO_NUMBERS); 357fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("+1-555-1212", NO_NUMBERS); 358fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("+1 (650) 555-1212", new String[] { "+1 (650) 555-1212" }); 359fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("(650) 555-1212, (650) 555-1213", 360fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden new String[] { "(650) 555-1212", "(650) 555-1213" }); 361fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("Call 555-1212, 555-1213 and also 555-1214.", 362fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden new String[] { "555-1212", "555-1213", "555-1214." }); 363fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("555-1212,555-1213,555-1214", new String[] { "555-1212" }); 364fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("123 (650) 555-1212", new String[] { "(650) 555-1212" }); 365fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1-650-555-1212", new String[] { "1-650-555-1212" }); 366fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1650-555-1212", new String[] { "1650-555-1212" }); 367fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1650 555-1212", new String[] { "1650 555-1212" }); 368fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1650/555-1212", NO_NUMBERS); 369fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("1650-555 1212", NO_NUMBERS); 370fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("8-650-555-1212", NO_NUMBERS); 371fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("8 650-555-1212", new String[] { "650-555-1212" }); 372fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("650.555.1212", new String[] { "650.555.1212" }); 373fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber(" *#650.555.1212#*!", new String[] { "*#650.555.1212#*" }); 374fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("555.1212", new String[] { "555.1212" }); 375fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("6505551212 x123, 555-1212", new String[] { "6505551212", "555-1212" }); 376fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("6505551212x123", new String[] { "6505551212" }); 377fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("http://example.com/6505551212/", NO_NUMBERS); 378fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("Mountain View, CA 94043 (650) 555-1212", new String[]{ "(650) 555-1212" }); 379fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden findPhoneNumber("New York, NY 10001-0001", NO_NUMBERS); 380fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden } 381fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 382fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden /** 383fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * Finds the numbers in a block of text, and checks to see if the positions of the numbers 384fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * match the expected values. 385fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * 386fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * @param text The text to search. 387fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden * @param matches Pairs of start/end positions. 388fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden */ 389fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden private static void findPhoneNumber(String text, String[] matches) { 3907e19bf984bc280c0cc034adf1dfa8840c75a698dSam Blitzstein int[] results = Utils.findNanpPhoneNumbers(text); 391fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 392b25c663d28585fc9a4a2e31caa82b53a37509c83Sam Blitzstein assertEquals(0, results.length % 2); 393fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 394fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden if (results.length / 2 != matches.length) { 395fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden fail("Text '" + text + "': expected " + matches.length 396fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden + " matches, found " + results.length / 2); 397fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden } 398fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden 399fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden for (int i = 0; i < results.length / 2; i++) { 400fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden CharSequence seq = text.subSequence(results[i*2], results[i*2 + 1]); 401fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden assertEquals(matches[i], seq); 402fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden } 403fd8ce5e0d40a4a55e9425fe95e9c1ebdf6f9cee9Andy McFadden } 40475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 40529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein /** 40629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein * Tests the linkify section of event locations. 40729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein */ 40829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein @SmallTest 40929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein public void testExtendedLinkify() { 41029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein final URLSpan[] NO_LINKS = new URLSpan[] {}; 41129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_tel01 = new URLSpan("tel:6505551234"); 41229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_tel02 = new URLSpan("tel:5555678"); 41329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_tel03 = new URLSpan("tel:+16505551234"); 41429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_tel04 = new URLSpan("tel:16505551234"); 41529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_web = new URLSpan("http://www.google.com"); 41629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo01 = 41729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=1600+Amphitheatre+Parkway%2C+Mountain+View+CA+94043"); 41829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo02 = 41929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=37.422081°, -122.084576°"); 42029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo03 = 42129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=37.422081,-122.084576"); 42229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo04 = 42329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=+37°25'19.49\", -122°5'4.47\""); 42429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo05 = 42529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=37°25'19.49\"N, 122°5'4.47\"W"); 42629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo06 = 42729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan("geo:0,0?q=N 37° 25' 19.49\", W 122° 5' 4.47\""); 42829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan span_geo07 = new URLSpan("geo:0,0?q=non-specified address"); 42929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 43029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 43129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // First test without the last-ditch geo attempt. 43229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Phone spans. 43329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("", NO_LINKS, false); 43429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("(650) 555-1234", new URLSpan[]{span_tel01}, false); 43529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("94043", NO_LINKS, false); 43629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("123456789012", NO_LINKS, false); 43729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("+1 (650) 555-1234", new URLSpan[]{span_tel03}, false); 43829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("(650) 555 1234", new URLSpan[]{span_tel01}, false); 43929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("1-650-555-1234", new URLSpan[]{span_tel04}, false); 44029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("*#650.555.1234#*!", new URLSpan[]{span_tel01}, false); 44129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("555.5678", new URLSpan[]{span_tel02}, false); 44229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 44329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Web spans. 44429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("http://www.google.com", new URLSpan[]{span_web}, false); 44529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 44629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Geo spans. 44729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("1600 Amphitheatre Parkway, Mountain View CA 94043", 44829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan[]{span_geo01}, false); 44929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37.422081°, -122.084576°", new URLSpan[]{span_geo02}, false); 45029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37.422081,-122.084576", new URLSpan[]{span_geo03}, false); 45129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("+37°25'19.49\", -122°5'4.47\"", new URLSpan[]{span_geo04}, false); 45229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37°25'19.49\"N, 122°5'4.47\"W", new URLSpan[]{span_geo05}, false); 45329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("N 37° 25' 19.49\", W 122° 5' 4.47\"", new URLSpan[]{span_geo06}, false); 45429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 45529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Multiple spans. 45629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("(650) 555-1234 1600 Amphitheatre Parkway, Mountain View CA 94043", 45729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan[]{span_tel01, span_geo01}, false); 45829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("(650) 555-1234, 555-5678", new URLSpan[]{span_tel01, span_tel02}, false); 45929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 46029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 46129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Now test using the last-ditch geo attempt. 46229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("", NO_LINKS, true); 46329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("(650) 555-1234", new URLSpan[]{span_tel01}, true); 46429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("http://www.google.com", new URLSpan[]{span_web}, true); 46529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("1600 Amphitheatre Parkway, Mountain View CA 94043", 46629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein new URLSpan[]{span_geo01}, true); 46729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37.422081°, -122.084576°", new URLSpan[]{span_geo02}, true); 46829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37.422081,-122.084576", new URLSpan[]{span_geo03}, true); 46929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("+37°25'19.49\", -122°5'4.47\"", new URLSpan[]{span_geo04}, true); 47029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("37°25'19.49\"N, 122°5'4.47\"W", new URLSpan[]{span_geo05}, true); 47129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("N 37° 25' 19.49\", W 122° 5' 4.47\"", new URLSpan[]{span_geo06}, true); 47229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein findLinks("non-specified address", new URLSpan[]{span_geo07}, true); 47329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 47429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 47529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein private static void findLinks(String text, URLSpan[] matches, boolean lastDitchGeo) { 47629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein Spannable spanText = Utils.extendedLinkify(text, lastDitchGeo); 47729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan[] spansFound = spanText.getSpans(0, spanText.length(), URLSpan.class); 47829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein assertEquals(matches.length, spansFound.length); 47929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 48029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // Make sure the expected matches list of URLs is the same as that returned by linkify. 48129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein ArrayList<URLSpan> matchesArrayList = new ArrayList<URLSpan>(Arrays.asList(matches)); 48229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein for (URLSpan spanFound : spansFound) { 48329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein Iterator<URLSpan> matchesIt = matchesArrayList.iterator(); 48429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein boolean removed = false; 48529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein while (matchesIt.hasNext()) { 48629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein URLSpan match = matchesIt.next(); 48729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein if (match.getURL().equals(spanFound.getURL())) { 48829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein matchesIt.remove(); 48929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein removed = true; 49029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein break; 49129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 49229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 49329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein if (!removed) { 49429dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // If a match was not found for the current spanFound, the lists aren't equal. 49529dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein fail("No match found for span: "+spanFound.getURL()); 49629dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 49729dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 49829dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 49929dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // As a sanity check, ensure the matches list is empty, as each item should have been 50029dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein // removed by going through the spans returned by linkify. 50129dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein assertTrue(matchesArrayList.isEmpty()); 50229dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein } 50329dc76a401b073bcd69d610817e3781fc9ebe5fcSam Blitzstein 50475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 50575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_differentYear() { 50675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/12/2000 5pm - 4/12/2000 6pm 50775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, 12, 3, 2000); 50875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 18, 12, 3, 2000); 50975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 51023acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 511b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Wednesday, April 12, 2000, 5:00PM \u2013 6:00PM", result); 51275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 51375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 12/31/2012 5pm - 1/1/2013 6pm 51475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting start = createTimeInMillis(0, 0, 17, 31, 11, 2012); 51575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting end = createTimeInMillis(0, 0, 18, 1, 0, 2013); 51675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 51723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 518b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Mon, Dec 31, 2012, 5:00PM – Tue, Jan 1, 2013, 6:00PM", result); 51975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 52075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 52175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 52275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_sameYear() { 52375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/12/2012 5pm - 4/12/2012 6pm 52475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, 12, 3, 2012); 52575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 18, 12, 3, 2012); 52675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 52723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 528b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Thursday, April 12, 2012, 5:00PM \u2013 6:00PM", result); 52975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 53075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 53175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 53275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_today() { 53375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/10/2012 5pm - 4/10/2012 6pm 53475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, NOW_DAY, NOW_MONTH, NOW_YEAR); 53575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 18, NOW_DAY, NOW_MONTH, NOW_YEAR); 53675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 53723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 538b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Today at 5:00PM \u2013 6:00PM", result); 53975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 54075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 54175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 54275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_todayMidnight() { 54375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/10/2012 5pm - 4/11/2012 12am 54475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, NOW_DAY, NOW_MONTH, NOW_YEAR); 54575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 54675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 54723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 548b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Today at 5:00PM \u2013 midnight", result); 54975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 55075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 55175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 55275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_tomorrow() { 553b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/11/2012 12:01AM - 4/11/2012 11:59pm 55475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 1, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 55575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 59, 23, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 55675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 55723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 558b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Tomorrow at 12:01AM \u2013 11:59PM", result); 55975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 56075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 56175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 56275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_yesterday() { 56375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/9/2012 5pm - 4/9/2012 6pm 56475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, 9, 3, 2012); 56575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 18, 9, 3, 2012); 56675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 56723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 568b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Monday, April 9, 2012, 5:00PM \u2013 6:00PM", result); 56975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 57075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 57175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 57275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_multiDay() { 573b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/10/2012 12:01AM - 4/11/2012 12:01AM 57475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 1, 0, NOW_DAY, NOW_MONTH, NOW_YEAR); 57575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 1, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR); 57675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 57723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting false, dbUtils.getContext()); 578b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Tue, Apr 10, 2012, 12:01AM \u2013 Wed, Apr 11, 2012, 12:01AM", result); 57975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 58075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 58175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 58275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_allDay() { 583b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/2/2012 12:00AM - 4/3/2012 12:00AM 58475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 0, 2, 3, NOW_YEAR, Time.TIMEZONE_UTC); 58575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 0, 3, 3, NOW_YEAR, Time.TIMEZONE_UTC); 58675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 58723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting true, dbUtils.getContext()); 588b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Monday, April 2, 2012", result); 58975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 59075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 59175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 59275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_allDayToday() { 593b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/10/2012 12:00AM - 4/11/2012 12:00AM 59475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 0, NOW_DAY, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 59575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 59675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 59723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting true, dbUtils.getContext()); 59875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting assertEquals("Today", result); 59975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 60075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 60175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 602059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting public void testGetDisplayedDatetime_allDayMultiday() { 603b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/10/2012 12:00AM - 4/13/2012 12:00AM 604059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting long start = createTimeInMillis(0, 0, 0, NOW_DAY, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 605059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting long end = createTimeInMillis(0, 0, 0, NOW_DAY + 3, NOW_MONTH, NOW_YEAR, Time.TIMEZONE_UTC); 606059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, DEFAULT_TIMEZONE, 607059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting true, dbUtils.getContext()); 608b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Tuesday, April 10, 2012 \u2013 Thursday, April 12, 2012", result); 609059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting } 610059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting 611059117da0141f5e3c6ce479dd87c6f8d8365e7e1Sara Ting @SmallTest 61275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_differentTimezone() { 61375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String localTz = "America/New_York"; 61475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String eventTz = "America/Los_Angeles"; 61575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTimezone(localTz); 61675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 61775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting // 4/12/2012 5pm - 4/12/2012 6pm (Pacific) 61875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, eventTz); 61975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 18, 12, 3, 2012, eventTz); 62023acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, false, 62175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting dbUtils.getContext()); 622b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Thursday, April 12, 2012, 8:00PM \u2013 9:00PM", result); 62375f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 62475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 62575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 62675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_allDayDiffTimezone() { 62775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String localTz = "America/New_York"; 62875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTimezone(localTz); 62975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 630b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/2/2012 12:00AM - 4/3/2012 12:00AM 63175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 0, 2, 3, NOW_YEAR, Time.TIMEZONE_UTC); 63275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 0, 3, 3, NOW_YEAR, Time.TIMEZONE_UTC); 63323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, true, 63423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting dbUtils.getContext()); 635b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein assertEquals("Monday, April 2, 2012", result); 63675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 63775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 63875f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting @SmallTest 63975f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting public void testGetDisplayedDatetime_allDayTomorrowDiffTimezone() { 64075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting String localTz = "America/New_York"; 64175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting setTimezone(localTz); 64275f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting 643b6b9cb4a6db19538b6d8ba3ad3cb26d2d7385a63Sam Blitzstein // 4/2/2012 12:00AM - 4/3/2012 12:00AM 64475f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long start = createTimeInMillis(0, 0, 0, NOW_DAY + 1, NOW_MONTH, NOW_YEAR, 64575f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Time.TIMEZONE_UTC); 64675f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting long end = createTimeInMillis(0, 0, 0, NOW_DAY + 2, NOW_MONTH, NOW_YEAR, 64775f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting Time.TIMEZONE_UTC); 64823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String result = Utils.getDisplayedDatetime(start, end, NOW_TIME, localTz, true, 64923acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting dbUtils.getContext()); 65075f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting assertEquals("Tomorrow", result); 65175f53668f94c3ced9d3cc8583d7e45ce725ff9deSara Ting } 6524e92627c5eb10de50c49c57e116b080d48360c70Sara Ting 6534e92627c5eb10de50c49c57e116b080d48360c70Sara Ting // TODO: add tests for army time. 65423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 65523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting @SmallTest 65623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting public void testGetDisplayedTimezone_sameTimezone() { 65723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String localTz = "America/New_York"; 65823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting setTimezone(localTz); 65923acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 66023acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting // 4/12/2012 5pm 66123acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, localTz); 66223acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting assertNull(Utils.getDisplayedTimezone(start, localTz, localTz)); 66323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } 66423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 66523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting @SmallTest 66623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting public void testGetDisplayedTimezone_differentTimezone() { 66723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String localTz = "America/New_York"; 66823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String eventTz = "America/Los_Angeles"; 66923acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting setTimezone(localTz); 67023acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 67123acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting // 1/12/2012 5pm (not daylight savings) 67223acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting long start = createTimeInMillis(0, 0, 17, 12, 0, 2012, eventTz); 67323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting assertEquals("EST", Utils.getDisplayedTimezone(start, localTz, eventTz)); 67423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } 67523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 67623acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting @SmallTest 67723acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting public void testGetDisplayedTimezone_differentTimezoneDst() { 67823acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String localTz = "America/New_York"; 67923acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting String eventTz = "America/Los_Angeles"; 68023acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting setTimezone(localTz); 68123acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting 68223acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting // 4/12/2012 5pm (daylight savings) 68323acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting long start = createTimeInMillis(0, 0, 17, 12, 3, 2012, eventTz); 68423acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting assertEquals("EDT", Utils.getDisplayedTimezone(start, localTz, eventTz)); 68523acd2668d65c2282f7aa922b4e86a7713d9b2faSara Ting } 686ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan} 687