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