/* * 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 static org.junit.Assert.assertTrue; import android.support.test.filters.SmallTest; import org.junit.Test; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * Unit tests for {@link RecentChannelEvaluator}. */ @SmallTest public class RecentChannelEvaluatorTest extends EvaluatorTestCase { private static final int DEFAULT_NUMBER_OF_CHANNELS = 4; private static final long DEFAULT_WATCH_START_TIME_MS = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(2); private static final long DEFAULT_WATCH_END_TIME_MS = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1); private static final long DEFAULT_MAX_WATCH_DURATION_MS = TimeUnit.HOURS.toMillis(1); @Override public RecentChannelEvaluator createEvaluator() { return new RecentChannelEvaluator(); } @Test public void testOneChannelWithNoWatchLog() { long channelId = addChannel().getId(); notifyChannelAndWatchLogLoaded(); assertEqualScores(Recommender.Evaluator.NOT_RECOMMENDED, mEvaluator.evaluateChannel(channelId)); } @Test public void testOneChannelWithRandomWatchLogs() { addChannel(); addRandomWatchLogs(DEFAULT_WATCH_START_TIME_MS, DEFAULT_WATCH_END_TIME_MS, DEFAULT_MAX_WATCH_DURATION_MS); notifyChannelAndWatchLogLoaded(); assertChannelScoresValid(); } @Test public void testMultiChannelsWithNoWatchLog() { addChannels(DEFAULT_NUMBER_OF_CHANNELS); notifyChannelAndWatchLogLoaded(); List channelIdList = getChannelIdListSorted(); for (long channelId : channelIdList) { assertEqualScores(Recommender.Evaluator.NOT_RECOMMENDED, mEvaluator.evaluateChannel(channelId)); } } @Test public void testMultiChannelsWithRandomWatchLogs() { addChannels(DEFAULT_NUMBER_OF_CHANNELS); addRandomWatchLogs(DEFAULT_WATCH_START_TIME_MS, DEFAULT_WATCH_END_TIME_MS, DEFAULT_MAX_WATCH_DURATION_MS); notifyChannelAndWatchLogLoaded(); assertChannelScoresValid(); } @Test public void testMultiChannelsWithSimpleWatchLogs() { addChannels(DEFAULT_NUMBER_OF_CHANNELS); // Every channel has one watch log with 1 hour. Also, for two channels // which has ID x and y (x < y), the channel y is watched later than the channel x. long latestWatchEndTimeMs = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(2); List channelIdList = getChannelIdListSorted(); for (long channelId : channelIdList) { addWatchLog(channelId, latestWatchEndTimeMs, TimeUnit.HOURS.toMillis(1)); latestWatchEndTimeMs += TimeUnit.HOURS.toMillis(1); } notifyChannelAndWatchLogLoaded(); assertChannelScoresValid(); // Channel score must be increased as channel ID increased. double previousScore = Recommender.Evaluator.NOT_RECOMMENDED; for (long channelId : channelIdList) { double score = mEvaluator.evaluateChannel(channelId); assertTrue(previousScore <= score); previousScore = score; } } @Test public void testScoreIncreasesWithNewWatchLog() { addChannels(DEFAULT_NUMBER_OF_CHANNELS); addRandomWatchLogs(DEFAULT_WATCH_START_TIME_MS, DEFAULT_WATCH_END_TIME_MS, DEFAULT_MAX_WATCH_DURATION_MS); notifyChannelAndWatchLogLoaded(); List channelIdList = getChannelIdListSorted(); long latestWatchEndTimeMs = getLatestWatchEndTimeMs(); for (long channelId : channelIdList) { double previousScore = mEvaluator.evaluateChannel(channelId); long durationMs = TimeUnit.MINUTES.toMillis(10); addWatchLog(channelId, latestWatchEndTimeMs, durationMs); latestWatchEndTimeMs += durationMs; // Score must be increased because recentness of the log increases. assertTrue(previousScore <= mEvaluator.evaluateChannel(channelId)); } } @Test public void testScoreDecreasesWithIncrementOfWatchedLogUpdatedTime() { addChannels(DEFAULT_NUMBER_OF_CHANNELS); addRandomWatchLogs(DEFAULT_WATCH_START_TIME_MS, DEFAULT_WATCH_END_TIME_MS, DEFAULT_MAX_WATCH_DURATION_MS); notifyChannelAndWatchLogLoaded(); Map scores = new HashMap<>(); List channelIdList = getChannelIdListSorted(); long latestWatchedEndTimeMs = getLatestWatchEndTimeMs(); for (long channelId : channelIdList) { scores.put(channelId, mEvaluator.evaluateChannel(channelId)); } long newChannelId = addChannel().getId(); addWatchLog(newChannelId, latestWatchedEndTimeMs, TimeUnit.MINUTES.toMillis(10)); for (long channelId : channelIdList) { // Score must be decreased because LastWatchLogUpdateTime increases by new log. assertTrue(mEvaluator.evaluateChannel(channelId) <= scores.get(channelId)); } } }