aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java')
-rw-r--r--tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java205
1 files changed, 205 insertions, 0 deletions
diff --git a/tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java b/tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java
new file mode 100644
index 00000000..e3c92859
--- /dev/null
+++ b/tests/unit/src/com/android/tv/recommendation/RoutineWatchEvaluatorTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.recommendation;
+
+import android.test.MoreAsserts;
+
+import com.android.tv.data.Program;
+import com.android.tv.recommendation.RoutineWatchEvaluator.ProgramTime;
+
+import java.util.Calendar;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class RoutineWatchEvaluatorTest extends EvaluatorTestCase<RoutineWatchEvaluator> {
+
+ public RoutineWatchEvaluator createEvaluator() {
+ return new RoutineWatchEvaluator();
+ }
+
+ public void testSplitTextToWords() {
+ assertSplitTextToWords("");
+ assertSplitTextToWords("Google", "Google");
+ assertSplitTextToWords("The Big Bang Theory", "The", "Big", "Bang", "Theory");
+ assertSplitTextToWords("Hello, world!", "Hello", "world");
+ assertSplitTextToWords("Adam's Rib", "Adam's", "Rib");
+ assertSplitTextToWords("G.I. Joe", "G.I", "Joe");
+ assertSplitTextToWords("A.I.", "A.I");
+ }
+
+ public void testCalculateMaximumMatchedWordSequenceLength() {
+ assertMaximumMatchedWordSequenceLength(0, "", "Google");
+ assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Big Bang");
+ assertMaximumMatchedWordSequenceLength(2, "The Big Bang Theory", "Theory Of Big Bang");
+ assertMaximumMatchedWordSequenceLength(4, "The Big Bang Theory", "The Big Bang Theory");
+ assertMaximumMatchedWordSequenceLength(1, "Modern Family", "Family Guy");
+ assertMaximumMatchedWordSequenceLength(1, "The Simpsons", "The Walking Dead");
+ assertMaximumMatchedWordSequenceLength(3, "Game Of Thrones 1", "Game Of Thrones 6");
+ assertMaximumMatchedWordSequenceLength(0, "Dexter", "Friends");
+ }
+
+ public void testProgramTime_createFromProgram() {
+ Calendar time = Calendar.getInstance();
+ int todayDayOfWeek = time.get(Calendar.DAY_OF_WEEK);
+ // Value of DayOfWeek is between 1 and 7 (inclusive).
+ int tomorrowDayOfWeek = (todayDayOfWeek % 7) + 1;
+
+ // Today 00:00 - 01:00.
+ ProgramTime programTimeToday0000_0100 = ProgramTime.createFromProgram(
+ createDummyProgram(todayAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
+ assertProgramTime(todayDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
+ programTimeToday0000_0100);
+
+ // Today 23:30 - 24:30.
+ ProgramTime programTimeToday2330_2430 = ProgramTime.createFromProgram(
+ createDummyProgram(todayAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
+ assertProgramTime(todayDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
+ programTimeToday2330_2430);
+
+ // Tomorrow 00:00 - 01:00.
+ ProgramTime programTimeTomorrow0000_0100 = ProgramTime.createFromProgram(
+ createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(1)));
+ assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(0, 0), hourMinuteToSec(1, 0),
+ programTimeTomorrow0000_0100);
+
+ // Tomorrow 23:30 - 24:30.
+ ProgramTime programTimeTomorrow2330_2430 = ProgramTime.createFromProgram(
+ createDummyProgram(tomorrowAtHourMin(23, 30), TimeUnit.HOURS.toMillis(1)));
+ assertProgramTime(tomorrowDayOfWeek, hourMinuteToSec(23, 30), hourMinuteToSec(24, 30),
+ programTimeTomorrow2330_2430);
+
+ // Today 18:00 - Tomorrow 12:00.
+ ProgramTime programTimeToday1800_3600 = ProgramTime.createFromProgram(
+ createDummyProgram(todayAtHourMin(18, 0), TimeUnit.HOURS.toMillis(18)));
+ // Maximum duration of ProgramTime is 12 hours.
+ // So, this program looks like it ends at Tomorrow 06:00 (30:00).
+ assertProgramTime(todayDayOfWeek, hourMinuteToSec(18, 0), hourMinuteToSec(30, 0),
+ programTimeToday1800_3600);
+ }
+
+ public void testCalculateOverlappedIntervalScore() {
+ // Today 21:00 - 24:00.
+ ProgramTime programTimeToday2100_2400 = ProgramTime.createFromProgram(
+ createDummyProgram(todayAtHourMin(21, 0), TimeUnit.HOURS.toMillis(3)));
+ // Today 22:00 - 01:00.
+ ProgramTime programTimeToday2200_0100 = ProgramTime.createFromProgram(
+ createDummyProgram(todayAtHourMin(22, 0), TimeUnit.HOURS.toMillis(3)));
+ // Tomorrow 00:00 - 03:00.
+ ProgramTime programTimeTomorrow0000_0300 = ProgramTime.createFromProgram(
+ createDummyProgram(tomorrowAtHourMin(0, 0), TimeUnit.HOURS.toMillis(3)));
+ // Tomorrow 20:00 - Tomorrow 23:00.
+ ProgramTime programTimeTomorrow2000_2300 = ProgramTime.createFromProgram(
+ createDummyProgram(tomorrowAtHourMin(20, 0), TimeUnit.HOURS.toMillis(3)));
+
+ // Check intersection time and commutative law in all cases.
+ int oneHourInSec = hourMinuteToSec(1, 0);
+ assertOverlappedIntervalScore(2 * oneHourInSec, true,
+ programTimeToday2100_2400, programTimeToday2200_0100);
+ assertOverlappedIntervalScore(0, false,
+ programTimeToday2100_2400, programTimeTomorrow0000_0300);
+ assertOverlappedIntervalScore(2 * oneHourInSec, false,
+ programTimeToday2100_2400, programTimeTomorrow2000_2300);
+ assertOverlappedIntervalScore(oneHourInSec, true,
+ programTimeToday2200_0100, programTimeTomorrow0000_0300);
+ assertOverlappedIntervalScore(oneHourInSec, false,
+ programTimeToday2200_0100, programTimeTomorrow2000_2300);
+ assertOverlappedIntervalScore(0, false,
+ programTimeTomorrow0000_0300, programTimeTomorrow2000_2300);
+ }
+
+ public void testGetTimeOfDayInSec() {
+ // Time was set as 00:00:00. So, getTimeOfDay must returns 0 (= 0 * 60 * 60 + 0 * 60 + 0).
+ assertEquals("TimeOfDayInSec", hourMinuteToSec(0, 0),
+ RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMin(0, 0)));
+
+ // Time was set as 23:59:59. So, getTimeOfDay must returns 23 * 60 + 60 + 59 * 60 + 59.
+ assertEquals("TimeOfDayInSec", hourMinuteSecondToSec(23, 59, 59),
+ RoutineWatchEvaluator.getTimeOfDayInSec(todayAtHourMinSec(23, 59, 59)));
+ }
+
+ private void assertSplitTextToWords(String text, String... words) {
+ List<String> wordList = RoutineWatchEvaluator.splitTextToWords(text);
+ MoreAsserts.assertContentsInOrder(wordList, words);
+ }
+
+ private void assertMaximumMatchedWordSequenceLength(int expectedLength,
+ String text1, String text2) {
+ List<String> wordList1 = RoutineWatchEvaluator.splitTextToWords(text1);
+ List<String> wordList2 = RoutineWatchEvaluator.splitTextToWords(text2);
+ assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
+ mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList1, wordList2));
+ assertEquals("MaximumMatchedWordSequenceLength", expectedLength,
+ mEvaluator.calculateMaximumMatchedWordSequenceLength(wordList2, wordList1));
+ }
+
+ private void assertProgramTime(int expectedWeekDay, int expectedStartTimeOfDayInSec,
+ int expectedEndTimeOfDayInSec, ProgramTime actualProgramTime) {
+ assertEquals("Weekday", expectedWeekDay, actualProgramTime.weekDay);
+ assertEquals("StartTimeOfDayInSec",
+ expectedStartTimeOfDayInSec, actualProgramTime.startTimeOfDayInSec);
+ assertEquals("EndTimeOfDayInSec",
+ expectedEndTimeOfDayInSec, actualProgramTime.endTimeOfDayInSec);
+ }
+
+ private void assertOverlappedIntervalScore(int expectedSeconds, boolean overlappedOnSameDay,
+ ProgramTime t1, ProgramTime t2) {
+ double score = (double) expectedSeconds;
+ if (!overlappedOnSameDay) {
+ score *= RoutineWatchEvaluator.MULTIPLIER_FOR_UNMATCHED_DAY_OF_WEEK;
+ }
+ // Two tests for testing commutative law.
+ assertEquals("OverlappedIntervalScore",
+ score, mEvaluator.calculateOverlappedIntervalScore(t1, t2));
+ assertEquals("OverlappedIntervalScore",
+ score, mEvaluator.calculateOverlappedIntervalScore(t2, t1));
+ }
+
+ private int hourMinuteToSec(int hour, int minute) {
+ return hourMinuteSecondToSec(hour, minute, 0);
+ }
+
+ private int hourMinuteSecondToSec(int hour, int minute, int second) {
+ return hour * 60 * 60 + minute * 60 + second;
+ }
+
+ private Calendar todayAtHourMin(int hour, int minute) {
+ return todayAtHourMinSec(hour, minute, 0);
+ }
+
+ private Calendar todayAtHourMinSec(int hour, int minute, int second) {
+ Calendar time = Calendar.getInstance();
+ time.set(Calendar.HOUR_OF_DAY, hour);
+ time.set(Calendar.MINUTE, minute);
+ time.set(Calendar.SECOND, second);
+ return time;
+ }
+
+ private Calendar tomorrowAtHourMin(int hour, int minute) {
+ Calendar time = todayAtHourMin(hour, minute);
+ time.add(Calendar.DATE, 1);
+ return time;
+ }
+
+ private Program createDummyProgram(Calendar startTime, long programDurationMs) {
+ long startTimeMs = startTime.getTimeInMillis();
+
+ return new Program.Builder()
+ .setStartTimeUtcMillis(startTimeMs)
+ .setEndTimeUtcMillis(startTimeMs + programDurationMs)
+ .build();
+ }
+}