RoutineWatchEvaluatorTest.java revision 816a4be1a0f34f6a48877c8afd3dbbca19eac435
1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.recommendation;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.test.MoreAsserts;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Program;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.recommendation.RoutineWatchEvaluator.ProgramTime;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Calendar;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.concurrent.TimeUnit;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class RoutineWatchEvaluatorTest extends EvaluatorTestCase<RoutineWatchEvaluator> {
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public RoutineWatchEvaluator createEvaluator() {
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return new RoutineWatchEvaluator();
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testSplitTextToWords() {
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("");
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Google", "Google");
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("The Big Bang Theory", "The", "Big", "Bang", "Theory");
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Hello, world!", "Hello", "world");
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Adam's Rib", "Adam's", "Rib");
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("G.I. Joe", "G.I", "Joe");
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("A.I.", "A.I");
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testCalculateMaximumMatchedWordSequenceLength() {
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(0, "", "Google");
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Big Bang");
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Theory Of Big Bang");
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(4, "The Big Bang Theory", "The Big Bang Theory");
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(1, "Modern Family", "Family Guy");
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(1, "The Simpsons", "The Walking Dead");
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(3, "Game Of Thrones 1", "Game Of Thrones 6");
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(0, "Dexter", "Friends");
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testProgramTime_createFromProgram() {
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = Calendar.getInstance();
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int todayDayOfWeek = time.get(Calendar.DAY_OF_WEEK);
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Value of DayOfWeek is between 1 and 7 (inclusive).
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int tomorrowDayOfWeek = (todayDayOfWeek % 7) + 1;
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 00:00 - 01:00.
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday0000_0100 = ProgramTime.createFromProgram(
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday0000_0100);
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 23:30 - 24:30.
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2330_2430 = ProgramTime.createFromProgram(
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2330_2430);
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 00:00 - 01:00.
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow0000_0100 = ProgramTime.createFromProgram(
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeTomorrow0000_0100);
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 23:30 - 24:30.
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow2330_2430 = ProgramTime.createFromProgram(
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeTomorrow2330_2430);
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 18:00 - Tomorrow 12:00.
86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday1800_3600 = ProgramTime.createFromProgram(
87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(18, 0), TimeUnit.HOURS.toMillis(18)));
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Maximum duration of ProgramTime is 12 hours.
89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // So, this program looks like it ends at Tomorrow 06:00 (30:00).
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(18, 0), hourMinuteToSec(30, 0),
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday1800_3600);
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testCalculateOverlappedIntervalScore() {
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 21:00 - 24:00.
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2100_2400 = ProgramTime.createFromProgram(
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(21, 0), TimeUnit.HOURS.toMillis(3)));
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 22:00 - 01:00.
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2200_0100 = ProgramTime.createFromProgram(
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(22, 0), TimeUnit.HOURS.toMillis(3)));
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 00:00 - 03:00.
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow0000_0300 = ProgramTime.createFromProgram(
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(3)));
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 20:00 - Tomorrow 23:00.
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow2000_2300 = ProgramTime.createFromProgram(
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(20, 0), TimeUnit.HOURS.toMillis(3)));
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Check intersection time and commutative law in all cases.
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int oneHourInSec = hourMinuteToSec(1, 0);
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(2 * oneHourInSec, true,
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2100_2400, programTimeToday2200_0100);
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(0, false,
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2100_2400, programTimeTomorrow0000_0300);
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(2 * oneHourInSec, false,
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2100_2400, programTimeTomorrow2000_2300);
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(oneHourInSec, true,
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2200_0100, programTimeTomorrow0000_0300);
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(oneHourInSec, false,
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2200_0100, programTimeTomorrow2000_2300);
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertOverlappedIntervalScore(0, false,
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeTomorrow0000_0300, programTimeTomorrow2000_2300);
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testGetTimeOfDayInSec() {
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Time was set as 00:00:00. So, getTimeOfDay must returns 0 (= 0 * 60 * 60 + 0 * 60 + 0).
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("TimeOfDayInSec", hourMinuteToSec(0, 0),
127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMin(0, 0)));
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Time was set as 23:59:59. So, getTimeOfDay must returns 23 * 60 + 60 + 59 * 60 + 59.
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("TimeOfDayInSec", hourMinuteSecondToSec(23, 59, 59),
131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMinSec(23, 59, 59)));
132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertSplitTextToWords(String text, String... words) {
135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList = RoutineWatchEvaluator.splitTextToWords(text);
136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        MoreAsserts.assertContentsInOrder(wordList, words);
137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertMaximumMatchedWordSequenceLength(int expectedLength,
140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            String text1, String text2) {
141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList1 = RoutineWatchEvaluator.splitTextToWords(text1);
142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList2 = RoutineWatchEvaluator.splitTextToWords(text2);
143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList1, wordList2));
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList2, wordList1));
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertProgramTime(int expectedWeekDay, int expectedStartTimeOfDayInSec,
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            int expectedEndTimeOfDayInSec, ProgramTime actualProgramTime) {
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("Weekday", expectedWeekDay, actualProgramTime.weekDay);
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("StartTimeOfDayInSec",
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                expectedStartTimeOfDayInSec, actualProgramTime.startTimeOfDayInSec);
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("EndTimeOfDayInSec",
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                expectedEndTimeOfDayInSec, actualProgramTime.endTimeOfDayInSec);
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertOverlappedIntervalScore(int expectedSeconds, boolean overlappedOnSameDay,
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            ProgramTime t1, ProgramTime t2) {
160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        double score = (double) expectedSeconds;
161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!overlappedOnSameDay) {
162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            score *= RoutineWatchEvaluator.MULTIPLIER_FOR_UNMATCHED_DAY_OF_WEEK;
163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Two tests for testing commutative law.
165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("OverlappedIntervalScore",
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                score, mEvaluator.calculateOverlappedIntervalScore(t1, t2));
167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("OverlappedIntervalScore",
168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                score, mEvaluator.calculateOverlappedIntervalScore(t2, t1));
169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
171816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int hourMinuteToSec(int hour, int minute) {
172816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return hourMinuteSecondToSec(hour, minute, 0);
173816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
174816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
175816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int hourMinuteSecondToSec(int hour, int minute, int second) {
176816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return hour * 60 * 60 + minute * 60 + second;
177816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
178816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
179816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar todayAtHourMin(int hour, int minute) {
180816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return todayAtHourMinSec(hour, minute, 0);
181816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
182816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
183816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar todayAtHourMinSec(int hour, int minute, int second) {
184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = Calendar.getInstance();
185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.HOUR_OF_DAY, hour);
186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.MINUTE, minute);
187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.SECOND, second);
188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return time;
189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
191816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar tomorrowAtHourMin(int hour, int minute) {
192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = todayAtHourMin(hour, minute);
193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.add(Calendar.DATE, 1);
194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return time;
195816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
196816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
197816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Program createDummyProgram(Calendar startTime, long programDurationMs) {
198816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        long startTimeMs = startTime.getTimeInMillis();
199816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
200816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return new Program.Builder()
201816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                .setStartTimeUtcMillis(startTimeMs)
202816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                .setEndTimeUtcMillis(startTimeMs + programDurationMs)
203816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                .build();
204816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
205816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
206