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;
2007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.test.suitebuilder.annotation.SmallTest;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Program;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.recommendation.RoutineWatchEvaluator.ProgramTime;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
2548dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport java.util.Arrays;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Calendar;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List;
2848dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport java.util.TreeSet;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.concurrent.TimeUnit;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
3107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko@SmallTest
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class RoutineWatchEvaluatorTest extends EvaluatorTestCase<RoutineWatchEvaluator> {
3348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private static class ScoredItem implements Comparable<ScoredItem> {
3448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        private final String mBase;
3548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        private final String mText;
3648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        private final double mScore;
3748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
3848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        private ScoredItem(String base, String text) {
3948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            this.mBase = base;
4048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            this.mText = text;
4148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            this.mScore = RoutineWatchEvaluator.calculateTitleMatchScore(base, text);
4248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        }
4348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
4448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        @Override
4548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        public int compareTo(ScoredItem scoredItem) {
4648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            return Double.compare(mScore, scoredItem.mScore);
4748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        }
4848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
4948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        @Override
5048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        public String toString() {
5148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            return mBase + " scored with " + mText + " is " + mScore;
5248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        }
5348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
5448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
5548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private static ScoredItem score(String t1, String t2) {
5648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        return new ScoredItem(t1, t2);
5748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
5907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    @Override
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public RoutineWatchEvaluator createEvaluator() {
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return new RoutineWatchEvaluator();
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testSplitTextToWords() {
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("");
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Google", "Google");
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("The Big Bang Theory", "The", "Big", "Bang", "Theory");
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Hello, world!", "Hello", "world");
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("Adam's Rib", "Adam's", "Rib");
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("G.I. Joe", "G.I", "Joe");
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertSplitTextToWords("A.I.", "A.I");
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testCalculateMaximumMatchedWordSequenceLength() {
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(0, "", "Google");
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Big Bang");
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Theory Of Big Bang");
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(4, "The Big Bang Theory", "The Big Bang Theory");
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(1, "Modern Family", "Family Guy");
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(1, "The Simpsons", "The Walking Dead");
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(3, "Game Of Thrones 1", "Game Of Thrones 6");
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertMaximumMatchedWordSequenceLength(0, "Dexter", "Friends");
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
8548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public void testCalculateTitleMatchScore_empty() {
8648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore("", ""));
8748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore("foo", ""));
8848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore("", "foo"));
8948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
9048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
9148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public void testCalculateTitleMatchScore_spaces() {
9248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore(" ", " "));
9348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore("foo", " "));
9448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore(" ", "foo"));
9548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
9648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
9748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
9848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public void testCalculateTitleMatchScore_null() {
9948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore(null, null));
10048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore("foo", null));
10148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals(0.0, RoutineWatchEvaluator.calculateTitleMatchScore(null, "foo"));
10248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
10348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
10448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    public void testCalculateTitleMatchScore_longerMatchIsBetter() {
10548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        String base = "foo bar baz";
10648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertInOrder(
10748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                score(base, ""),
10848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                score(base, "bar"),
10948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                score(base, "foo bar"),
11048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                score(base, "foo bar baz"));
11148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
11248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testProgramTime_createFromProgram() {
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = Calendar.getInstance();
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int todayDayOfWeek = time.get(Calendar.DAY_OF_WEEK);
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Value of DayOfWeek is between 1 and 7 (inclusive).
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int tomorrowDayOfWeek = (todayDayOfWeek % 7) + 1;
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 00:00 - 01:00.
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday0000_0100 = ProgramTime.createFromProgram(
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday0000_0100);
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 23:30 - 24:30.
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2330_2430 = ProgramTime.createFromProgram(
127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday2330_2430);
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 00:00 - 01:00.
132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow0000_0100 = ProgramTime.createFromProgram(
133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeTomorrow0000_0100);
136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 23:30 - 24:30.
138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow2330_2430 = ProgramTime.createFromProgram(
139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeTomorrow2330_2430);
142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 18:00 - Tomorrow 12:00.
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday1800_3600 = ProgramTime.createFromProgram(
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(18, 0), TimeUnit.HOURS.toMillis(18)));
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Maximum duration of ProgramTime is 12 hours.
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // So, this program looks like it ends at Tomorrow 06:00 (30:00).
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertProgramTime(todayDayOfWeek, hourMinuteToSec(18, 0), hourMinuteToSec(30, 0),
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                programTimeToday1800_3600);
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testCalculateOverlappedIntervalScore() {
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 21:00 - 24:00.
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2100_2400 = ProgramTime.createFromProgram(
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(21, 0), TimeUnit.HOURS.toMillis(3)));
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Today 22:00 - 01:00.
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeToday2200_0100 = ProgramTime.createFromProgram(
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(todayAtHourMin(22, 0), TimeUnit.HOURS.toMillis(3)));
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 00:00 - 03:00.
160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow0000_0300 = ProgramTime.createFromProgram(
161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(3)));
162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Tomorrow 20:00 - Tomorrow 23:00.
163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        ProgramTime programTimeTomorrow2000_2300 = ProgramTime.createFromProgram(
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                createDummyProgram(tomorrowAtHourMin(20, 0), TimeUnit.HOURS.toMillis(3)));
165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Check intersection time and commutative law in all cases.
167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int oneHourInSec = hourMinuteToSec(1, 0);
16848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(2 * oneHourInSec, true, programTimeToday2100_2400,
16948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeToday2200_0100);
17048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(0, false, programTimeToday2100_2400,
17148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeTomorrow0000_0300);
17248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(2 * oneHourInSec, false, programTimeToday2100_2400,
17348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeTomorrow2000_2300);
17448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(oneHourInSec, true, programTimeToday2200_0100,
17548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeTomorrow0000_0300);
17648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(oneHourInSec, false, programTimeToday2200_0100,
17748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeTomorrow2000_2300);
17848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertOverlappedIntervalScore(0, false, programTimeTomorrow0000_0300,
17948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                programTimeTomorrow2000_2300);
180816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
181816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
182816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void testGetTimeOfDayInSec() {
183816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Time was set as 00:00:00. So, getTimeOfDay must returns 0 (= 0 * 60 * 60 + 0 * 60 + 0).
184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("TimeOfDayInSec", hourMinuteToSec(0, 0),
185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMin(0, 0)));
186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Time was set as 23:59:59. So, getTimeOfDay must returns 23 * 60 + 60 + 59 * 60 + 59.
188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("TimeOfDayInSec", hourMinuteSecondToSec(23, 59, 59),
189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMinSec(23, 59, 59)));
190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
191816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertSplitTextToWords(String text, String... words) {
193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList = RoutineWatchEvaluator.splitTextToWords(text);
194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        MoreAsserts.assertContentsInOrder(wordList, words);
195816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
196816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private void assertMaximumMatchedWordSequenceLength(int expectedLength, String text1,
19848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            String text2) {
199816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList1 = RoutineWatchEvaluator.splitTextToWords(text1);
200816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<String> wordList2 = RoutineWatchEvaluator.splitTextToWords(text2);
201816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
202816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList1, wordList2));
203816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
204816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList2, wordList1));
205816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
206816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
207816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertProgramTime(int expectedWeekDay, int expectedStartTimeOfDayInSec,
208816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            int expectedEndTimeOfDayInSec, ProgramTime actualProgramTime) {
209816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        assertEquals("Weekday", expectedWeekDay, actualProgramTime.weekDay);
21048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals("StartTimeOfDayInSec", expectedStartTimeOfDayInSec,
21148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                actualProgramTime.startTimeOfDayInSec);
21248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals("EndTimeOfDayInSec", expectedEndTimeOfDayInSec,
21348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                actualProgramTime.endTimeOfDayInSec);
214816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
215816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
216816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void assertOverlappedIntervalScore(int expectedSeconds, boolean overlappedOnSameDay,
217816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            ProgramTime t1, ProgramTime t2) {
21807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        double score = expectedSeconds;
219816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!overlappedOnSameDay) {
220816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            score *= RoutineWatchEvaluator.MULTIPLIER_FOR_UNMATCHED_DAY_OF_WEEK;
221816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
222816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Two tests for testing commutative law.
22348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals("OverlappedIntervalScore", score,
22448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                mEvaluator.calculateOverlappedIntervalScore(t1, t2));
22548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        assertEquals("OverlappedIntervalScore", score,
22648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                mEvaluator.calculateOverlappedIntervalScore(t2, t1));
227816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
228816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
229816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int hourMinuteToSec(int hour, int minute) {
230816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return hourMinuteSecondToSec(hour, minute, 0);
231816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
232816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
233816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int hourMinuteSecondToSec(int hour, int minute, int second) {
234816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return hour * 60 * 60 + minute * 60 + second;
235816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
236816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
237816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar todayAtHourMin(int hour, int minute) {
238816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return todayAtHourMinSec(hour, minute, 0);
239816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
240816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
241816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar todayAtHourMinSec(int hour, int minute, int second) {
242816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = Calendar.getInstance();
243816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.HOUR_OF_DAY, hour);
244816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.MINUTE, minute);
245816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.set(Calendar.SECOND, second);
246816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return time;
247816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
248816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
249816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Calendar tomorrowAtHourMin(int hour, int minute) {
250816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Calendar time = todayAtHourMin(hour, minute);
251816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        time.add(Calendar.DATE, 1);
252816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return time;
253816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
254816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
255816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Program createDummyProgram(Calendar startTime, long programDurationMs) {
256816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        long startTimeMs = startTime.getTimeInMillis();
257816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
25848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        return new Program.Builder().setStartTimeUtcMillis(startTimeMs)
25948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                .setEndTimeUtcMillis(startTimeMs + programDurationMs).build();
26048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    }
26148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho
26248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho    private static <T> void assertInOrder(T... items) {
26348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        TreeSet<T> copy = new TreeSet<>(Arrays.asList(items));
26448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        MoreAsserts.assertContentsInOrder(copy, items);
265816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
266816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
267