1 /*
2 **
3 ** Copyright 2010, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 package com.android.calendar.widget;
19 
20 import com.android.calendar.widget.CalendarAppWidgetModel.EventInfo;
21 import com.android.calendar.widget.CalendarAppWidgetService.CalendarFactory;
22 import com.android.calendar.Utils;
23 
24 import android.content.Context;
25 import android.database.MatrixCursor;
26 import android.test.AndroidTestCase;
27 import android.test.suitebuilder.annotation.SmallTest;
28 import android.test.suitebuilder.annotation.Suppress;
29 import android.text.format.DateUtils;
30 import android.text.format.Time;
31 import android.view.View;
32 
33 import java.util.TimeZone;
34 
35 // adb shell am instrument -w -e class com.android.calendar.widget.CalendarAppWidgetServiceTest
36 //   com.google.android.calendar.tests/android.test.InstrumentationTestRunner
37 
38 
39 public class CalendarAppWidgetServiceTest extends AndroidTestCase {
40     private static final String TAG = "CalendarAppWidgetService";
41 
42     private static final String DEFAULT_TIMEZONE = "America/Los_Angeles";
43     long now;
44     final long ONE_MINUTE = 60000;
45     final long ONE_HOUR = 60 * ONE_MINUTE;
46     final long HALF_HOUR = ONE_HOUR / 2;
47     final long TWO_HOURS = ONE_HOUR * 2;
48 
49     final String title = "Title";
50     final String location = "Location";
51 
52 
53 
54 //    TODO Disabled test since this CalendarAppWidgetModel is not used for the no event case
55 //
56 //    @SmallTest
57 //    public void testGetAppWidgetModel_noEvents() throws Exception {
58 //        // Input
59 //        MatrixCursor cursor = new MatrixCursor(CalendarAppWidgetService.EVENT_PROJECTION, 0);
60 //
61 //        // Expected Output
62 //        CalendarAppWidgetModel expected = new CalendarAppWidgetModel();
63 //        expected.visibNoEvents = View.VISIBLE;
64 //
65 //        // Test
66 //        long now = 1270000000000L;
67 //        MarkedEvents events = CalendarAppWidgetService.buildMarkedEvents(cursor, null, now);
68 //        CalendarAppWidgetModel actual = CalendarAppWidgetService.getAppWidgetModel(
69 //                getTestContext(), cursor, events, now);
70 //
71 //        assertEquals(expected.toString(), actual.toString());
72 //    }
73 
74     @Override
setUp()75     protected void setUp() throws Exception {
76         super.setUp();
77         // we want to run these tests in a predictable timezone
78         TimeZone.setDefault(TimeZone.getTimeZone(DEFAULT_TIMEZONE));
79 
80         // Set the "current time" to 2am tomorrow.
81         Time time = new Time();
82         time.setToNow();
83         time.monthDay += 1;
84         time.hour = 2;
85         time.minute = 0;
86         time.second = 0;
87         now = time.normalize(false);
88     }
89 
90     @Override
tearDown()91     protected void tearDown() throws Exception {
92         super.tearDown();
93         // this restores the previous default timezone
94         TimeZone.setDefault(null);
95     }
96 
97     @SmallTest
testGetAppWidgetModel_1Event()98     public void testGetAppWidgetModel_1Event() throws Exception {
99         CalendarAppWidgetModel expected = new CalendarAppWidgetModel(getContext(), Time
100                 .getCurrentTimezone());
101         MatrixCursor cursor = new MatrixCursor(CalendarAppWidgetService.EVENT_PROJECTION, 0);
102 
103 
104         // Input
105         // allDay, begin, end, title, location, eventId
106         cursor.addRow(getRow(0, now + ONE_HOUR, now + TWO_HOURS, title, location, 0));
107 
108         // Expected Output
109         EventInfo eventInfo = new EventInfo();
110         eventInfo.visibWhen = View.VISIBLE;
111         eventInfo.visibWhere = View.VISIBLE;
112         eventInfo.visibTitle = View.VISIBLE;
113         eventInfo.when = Utils.formatDateRange(getContext(), now + ONE_HOUR, now + TWO_HOURS,
114                 DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL);
115         eventInfo.where = location;
116         eventInfo.title = title;
117         expected.mEventInfos.add(eventInfo);
118 
119         // Test
120         CalendarAppWidgetModel actual = CalendarFactory.buildAppWidgetModel(
121                 getContext(), cursor, Time.getCurrentTimezone());
122 
123         assertEquals(expected.toString(), actual.toString());
124     }
125 
126     @SmallTest
testGetAppWidgetModel_AllDayEventLater()127     public void testGetAppWidgetModel_AllDayEventLater() throws Exception {
128         Context context = getContext();
129         CalendarAppWidgetModel expected = new CalendarAppWidgetModel(getContext(), Time
130                 .getCurrentTimezone());
131         MatrixCursor cursor = new MatrixCursor(CalendarAppWidgetService.EVENT_PROJECTION, 0);
132 
133         int i = 0;
134 
135         // Expected Output
136         EventInfo eventInfo = new EventInfo();
137         eventInfo.visibWhen = View.VISIBLE;
138         eventInfo.visibWhere = View.VISIBLE;
139         eventInfo.visibTitle = View.VISIBLE;
140         eventInfo.when = Utils.formatDateRange(context, now + ONE_HOUR, now + TWO_HOURS,
141                 DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL);
142         eventInfo.where = location + i;
143         eventInfo.title = title + i;
144         expected.mEventInfos.add(eventInfo);
145         cursor.addRow(getRow(0, now + ONE_HOUR, now + TWO_HOURS, title + i, location + i, 0));
146 
147         i++;
148         // Set the start time to 5 days from now at midnight UTC.
149         Time time = new Time();
150         time.set(now);
151         time.monthDay += 5;
152         time.hour = 0;
153         time.timezone = Time.TIMEZONE_UTC;
154         long start = time.normalize(false);
155         time.monthDay += 1;
156         long end = time.normalize(false);
157 
158         eventInfo = new EventInfo();
159         eventInfo.visibWhen = View.VISIBLE;
160         eventInfo.visibWhere = View.VISIBLE;
161         eventInfo.visibTitle = View.VISIBLE;
162         eventInfo.when = DateUtils.formatDateTime(context, end,
163                 DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
164         eventInfo.where = location + i;
165         eventInfo.title = title + i;
166         expected.mEventInfos.add(eventInfo);
167         cursor.addRow(getRow(1, start, end, title + i, location + i, 0));
168 
169         // Test
170         CalendarAppWidgetModel actual = CalendarAppWidgetService.CalendarFactory.buildAppWidgetModel(
171                 context, cursor, Time.getCurrentTimezone());
172 
173         assertEquals(expected.toString(), actual.toString());
174     }
175 
getRow(int allDay, long begin, long end, String title, String location, long eventId)176     private Object[] getRow(int allDay, long begin, long end, String title, String location,
177             long eventId) {
178         Object[] row = new Object[CalendarAppWidgetService.EVENT_PROJECTION.length];
179         row[CalendarAppWidgetService.INDEX_ALL_DAY] = new Integer(allDay);
180         row[CalendarAppWidgetService.INDEX_BEGIN] = new Long(begin);
181         row[CalendarAppWidgetService.INDEX_END] = new Long(end);
182         row[CalendarAppWidgetService.INDEX_TITLE] = new String(title);
183         row[CalendarAppWidgetService.INDEX_EVENT_LOCATION] = new String(location);
184         row[CalendarAppWidgetService.INDEX_EVENT_ID] = new Long(eventId);
185         return row;
186     }
187 }
188