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