/* * 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.data; import static android.media.tv.TvContract.Programs.Genres.COMEDY; import static android.media.tv.TvContract.Programs.Genres.FAMILY_KIDS; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import android.media.tv.TvContentRating; import android.media.tv.TvContract.Programs.Genres; import android.os.Parcel; import com.android.tv.data.api.Program; import com.android.tv.data.api.Program.CriticScore; import com.android.tv.testing.TvRobolectricTestRunner; import com.android.tv.testing.constants.ConfigConstants; import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** Tests for {@link ProgramImpl}. */ @RunWith(TvRobolectricTestRunner.class) @Config(sdk = ConfigConstants.SDK) public class ProgramTest { private static final int NOT_FOUND_GENRE = 987; private static final int FAMILY_GENRE_ID = GenreItems.getId(FAMILY_KIDS); private static final int COMEDY_GENRE_ID = GenreItems.getId(COMEDY); @Test public void testBuild() { Program program = new ProgramImpl.Builder().build(); assertWithMessage("isValid").that(program.isValid()).isFalse(); } @Test public void testNoGenres() { Program program = new ProgramImpl.Builder().setCanonicalGenres("").build(); assertNullCanonicalGenres(program); assertHasGenre(program, NOT_FOUND_GENRE, false); assertHasGenre(program, FAMILY_GENRE_ID, false); assertHasGenre(program, COMEDY_GENRE_ID, false); assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); } @Test public void testFamilyGenre() { Program program = new ProgramImpl.Builder().setCanonicalGenres(FAMILY_KIDS).build(); assertCanonicalGenres(program, FAMILY_KIDS); assertHasGenre(program, NOT_FOUND_GENRE, false); assertHasGenre(program, FAMILY_GENRE_ID, true); assertHasGenre(program, COMEDY_GENRE_ID, false); assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); } @Test public void testFamilyComedyGenre() { Program program = new ProgramImpl.Builder().setCanonicalGenres(FAMILY_KIDS + ", " + COMEDY).build(); assertCanonicalGenres(program, FAMILY_KIDS, COMEDY); assertHasGenre(program, NOT_FOUND_GENRE, false); assertHasGenre(program, FAMILY_GENRE_ID, true); assertHasGenre(program, COMEDY_GENRE_ID, true); assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); } @Test public void testOtherGenre() { Program program = new ProgramImpl.Builder().setCanonicalGenres("other").build(); assertCanonicalGenres(program); assertHasGenre(program, NOT_FOUND_GENRE, false); assertHasGenre(program, FAMILY_GENRE_ID, false); assertHasGenre(program, COMEDY_GENRE_ID, false); assertHasGenre(program, GenreItems.ID_ALL_CHANNELS, true); } @Test public void testParcelable() { List criticScores = new ArrayList<>(); criticScores.add(new CriticScore("1", "2", "3")); criticScores.add(new CriticScore("4", "5", "6")); ImmutableList ratings = ImmutableList.of( TvContentRating.unflattenFromString("1/2/3"), TvContentRating.unflattenFromString("4/5/6")); ProgramImpl p = new ProgramImpl.Builder() .setId(1) .setPackageName("2") .setChannelId(3) .setTitle("4") .setSeriesId("5") .setEpisodeTitle("6") .setSeasonNumber("7") .setSeasonTitle("8") .setEpisodeNumber("9") .setStartTimeUtcMillis(10) .setEndTimeUtcMillis(11) .setDescription("12") .setLongDescription("12-long") .setVideoWidth(13) .setVideoHeight(14) .setCriticScores(criticScores) .setPosterArtUri("15") .setThumbnailUri("16") .setCanonicalGenres(Genres.encode(Genres.SPORTS, Genres.SHOPPING)) .setContentRatings(ratings) .setRecordingProhibited(true) .build(); Parcel p1 = Parcel.obtain(); Parcel p2 = Parcel.obtain(); try { p.writeToParcel(p1, 0); byte[] bytes = p1.marshall(); p2.unmarshall(bytes, 0, bytes.length); p2.setDataPosition(0); ProgramImpl r2 = ProgramImpl.fromParcel(p2); assertThat(r2).isEqualTo(p); } finally { p1.recycle(); p2.recycle(); } } @Test public void testParcelableWithCriticScore() { ProgramImpl program = new ProgramImpl.Builder() .setTitle("MyTitle") .addCriticScore( new CriticScore( "default source", "5/10", "http://testurl/testimage.jpg")) .build(); Parcel parcel = Parcel.obtain(); program.writeToParcel(parcel, 0); parcel.setDataPosition(0); Program programFromParcel = ProgramImpl.CREATOR.createFromParcel(parcel); assertThat(programFromParcel.getCriticScores()).isNotNull(); assertThat(programFromParcel.getCriticScores().get(0).source).isEqualTo("default source"); assertThat(programFromParcel.getCriticScores().get(0).score).isEqualTo("5/10"); assertThat(programFromParcel.getCriticScores().get(0).logoUrl) .isEqualTo("http://testurl/testimage.jpg"); } @Test public void getEpisodeContentDescription_blank() { Program program = new ProgramImpl.Builder().build(); assertThat(program.getEpisodeContentDescription(RuntimeEnvironment.application)).isNull(); } @Test public void getEpisodeContentDescription_seasonEpisodeAndTitle() { Program program = new ProgramImpl.Builder() .setSeasonNumber("1") .setEpisodeNumber("2") .setEpisodeTitle("The second one") .build(); assertThat(program.getEpisodeContentDescription(RuntimeEnvironment.application)) .isEqualTo("Season 1 Episode 2 The second one"); } @Test public void getEpisodeContentDescription_EpisodeAndTitle() { Program program = new ProgramImpl.Builder() .setEpisodeNumber("2") .setEpisodeTitle("The second one") .build(); assertThat(program.getEpisodeContentDescription(RuntimeEnvironment.application)) .isEqualTo("Episode 2 The second one"); } @Test public void getEpisodeContentDescription_seasonEpisode() { Program program = new ProgramImpl.Builder().setSeasonNumber("1").setEpisodeNumber("2").build(); assertThat(program.getEpisodeContentDescription(RuntimeEnvironment.application)) .isEqualTo("Season 1 Episode 2 "); } @Test public void getEpisodeContentDescription_EpisodeTitle() { Program program = new ProgramImpl.Builder().setEpisodeTitle("The second one").build(); assertThat(program.getEpisodeContentDescription(RuntimeEnvironment.application)) .isEqualTo("The second one"); } @Test public void getEpisodeDisplayTitle_blank() { Program program = new ProgramImpl.Builder().build(); assertThat(program.getEpisodeDisplayTitle(RuntimeEnvironment.application)).isNull(); } @Test public void getEpisodeDisplayTitle_seasonEpisodeAndTitle() { Program program = new ProgramImpl.Builder() .setSeasonNumber("1") .setEpisodeNumber("2") .setEpisodeTitle("The second one") .build(); assertThat(program.getEpisodeDisplayTitle(RuntimeEnvironment.application)) .isEqualTo("S1: Ep. 2 The second one"); } @Test public void getEpisodeDisplayTitle_EpisodeTitle() { Program program = new ProgramImpl.Builder() .setEpisodeNumber("2") .setEpisodeTitle("The second one") .build(); assertThat(program.getEpisodeDisplayTitle(RuntimeEnvironment.application)) .isEqualTo("Ep. 2 The second one"); } @Test public void getEpisodeDisplayTitle_seasonEpisode() { Program program = new ProgramImpl.Builder().setSeasonNumber("1").setEpisodeNumber("2").build(); assertThat(program.getEpisodeDisplayTitle(RuntimeEnvironment.application)) .isEqualTo("S1: Ep. 2 "); } @Test public void getEpisodeDisplayTitle_episode() { Program program = new ProgramImpl.Builder().setEpisodeTitle("The second one").build(); assertThat(program.getEpisodeDisplayTitle(RuntimeEnvironment.application)) .isEqualTo("The second one"); } private static void assertNullCanonicalGenres(Program program) { String[] actual = program.getCanonicalGenres(); assertWithMessage("Expected null canonical genres but was " + Arrays.toString(actual)) .that(actual) .isNull(); } private static void assertCanonicalGenres(Program program, String... expected) { assertWithMessage("canonical genres") .that(Arrays.asList(program.getCanonicalGenres())) .isEqualTo(Arrays.asList(expected)); } private static void assertHasGenre(Program program, int genreId, boolean expected) { assertWithMessage("hasGenre(" + genreId + ")") .that(program.hasGenre(genreId)) .isEqualTo(expected); } }