blob: 124450865d44d487100f1072e56ad8d98b16e00d [file] [log] [blame]
/*
* Copyright (C) 2017 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 androidx.leanback.widget;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import androidx.leanback.R;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ThumbsBarTest {
private Context mContext;
private ThumbsBar mBar;
/**
* Check ThumbsBar's initialization based on the constructor
*/
@Test
public void checkThumbsBarInitialize() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
assertEquals(mBar.mThumbHeightInPixel, mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_thumbs_height));
assertEquals(mBar.mThumbWidthInPixel, mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_thumbs_width));
assertEquals(mBar.mHeroThumbHeightInPixel, mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_hero_thumbs_height));
assertEquals(mBar.mHeroThumbWidthInPixel, mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_hero_thumbs_width));
}
/**
* Check getHeroIndex method when input is an even number
*/
@Test
public void checkGetHeroIndexOnEvenNumber() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int childCountForTest = 4;
// according to the algorithm, hero thumb's index should be childCounts / 2
int expectedHeroIndex = 2;
when(mBar.getChildCount()).thenReturn(childCountForTest);
assertEquals(mBar.getHeroIndex(), expectedHeroIndex);
}
/**
* Check getHeroIndex method when input is an odd number.
*/
@Test
public void checkGetHeroIndexOnOddNumber() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int childCountForTest = 5;
// according to the algorithm, hero thumb's index should be childCounts / 2
int expectedHeroIndex = 2;
when(mBar.getChildCount()).thenReturn(childCountForTest);
assertEquals(mBar.getHeroIndex(), expectedHeroIndex);
}
/**
* Check setThumbSize method.
*/
@Test
public void checkSetThumbSize() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest = 2560;
int screenHeightInPixelForTest = 1600;
int thumbsWidthInPixelForTest = 128;
int thumbsHeightInPixelForTest = 256;
// set screen size explicitly so the thumbs bar will have child view inside of it
mBar.measure(View.MeasureSpec.makeMeasureSpec(screenWidthInPixelForTest,
View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(screenHeightInPixelForTest,
View.MeasureSpec.EXACTLY));
mBar.setThumbSize(thumbsWidthInPixelForTest, thumbsHeightInPixelForTest);
// Verify the behavior of setThumbSize method
assertEquals(mBar.mThumbWidthInPixel, thumbsWidthInPixelForTest);
assertEquals(mBar.mThumbHeightInPixel, thumbsHeightInPixelForTest);
// iterate through all child view to test if its width/ height has been set successfully
for (int i = 0; i < mBar.getChildCount(); i++) {
if (i != mBar.getHeroIndex()) {
assertEquals(mBar.getChildAt(i).getLayoutParams().width,
thumbsWidthInPixelForTest);
assertEquals(mBar.getChildAt(i).getLayoutParams().height,
thumbsHeightInPixelForTest);
} else {
assertEquals(mBar.getChildAt(i).getLayoutParams().width,
mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_hero_thumbs_width));
assertEquals(mBar.getChildAt(i).getLayoutParams().height,
mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_hero_thumbs_height));
}
}
}
/**
* Check setHeroThumbSize method.
*/
@Test
public void checkSetHeroThumbSize() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest = 2560;
int screenHeightInPixelForTest = 1600;
int HeroThumbsWidthInPixelForTest = 256;
int HeroThumbsHeightInPixelForTest = 512;
// set screen size explicitly so the thumbs bar will have child view inside of it
mBar.measure(View.MeasureSpec.makeMeasureSpec(
screenWidthInPixelForTest, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(
screenHeightInPixelForTest, View.MeasureSpec.EXACTLY));
mBar.setHeroThumbSize(HeroThumbsWidthInPixelForTest, HeroThumbsHeightInPixelForTest);
// Verify the behavior of setThumbSize method
assertEquals(mBar.mHeroThumbWidthInPixel, HeroThumbsWidthInPixelForTest);
assertEquals(mBar.mHeroThumbHeightInPixel, HeroThumbsHeightInPixelForTest);
// iterate through all child view to test if its width/ height has been set successfully
for (int i = 0; i < mBar.getChildCount(); i++) {
if (i != mBar.getHeroIndex()) {
assertEquals(mBar.getChildAt(i).getLayoutParams().width,
mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_thumbs_width));
assertEquals(mBar.getChildAt(i).getLayoutParams().height,
mContext.getResources().getDimensionPixelSize(
R.dimen.lb_playback_transport_thumbs_height));
} else {
assertEquals(mBar.getChildAt(i).getLayoutParams().width,
HeroThumbsWidthInPixelForTest);
assertEquals(mBar.getChildAt(i).getLayoutParams().height,
HeroThumbsHeightInPixelForTest);
}
}
}
/**
* Check setThumbSpace method.
*/
@Test
public void checkSetThumbSpace() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int thumbSpaceInPixelForTest = 48;
mBar.setThumbSpace(thumbSpaceInPixelForTest);
assertEquals(mBar.mMeasuredMarginInPixel, thumbSpaceInPixelForTest);
verify(mBar).requestLayout();
}
/**
* check calculateNumberOfThumbs method when the result from roundUp function is less than 2
*
* Firstly, to make sure the test cases can run on different devices with different screen
* density (i.e. The return value from roundUp function should be the same no matter what kind
* of device/ emulator is connected),
* the screen width for test is set using dp, the pixel value will be computed by
* multiplying context.getResources().getDisplayMetrics().density
*
* In this test case, the screen width is set to 240 in dp, so the calculation result should
* be 1. According to the algorithm of calculateNumOfThumbs, it should be reassigned to 2 and
* the final result should be 3 after counting the hero thumb.
*/
@Test
public void checkCalculateNumberOfThumbs1() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest =
(int) (240 * mContext.getResources().getDisplayMetrics().density);
int screenHeightInPixelForTest =
(int) (240 * mContext.getResources().getDisplayMetrics().density);
int expectedChildCounts = 3;
mBar.measure(View.MeasureSpec.makeMeasureSpec(
screenWidthInPixelForTest, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(
screenHeightInPixelForTest, View.MeasureSpec.EXACTLY));
assertEquals(mBar.getChildCount(), expectedChildCounts);
}
/**
* check calculateNumberOfThumbs method when the result from roundUp function is an odd number
* and larger than 2.
*
* In this test case, the screen width is set to 680 in dp, so the calculation result should
* be 3. According to the algorithm of calculateNumOfThumbs, it should be incremented by 1, so
* the final result is 5 after counting the hero thumb.
*/
@Test
public void checkCalculateNumberOfThumbs2() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest =
(int) (680 * mContext.getResources().getDisplayMetrics().density);
int screenHeightInPixelForTest =
(int) (680 * mContext.getResources().getDisplayMetrics().density);
int expectedChildCounts = 5;
mBar.measure(View.MeasureSpec.makeMeasureSpec(
screenWidthInPixelForTest, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(
screenHeightInPixelForTest, View.MeasureSpec.EXACTLY));
assertEquals(mBar.getChildCount(), expectedChildCounts);
}
/**
* check calculateNumberOfThumbs method when the result from roundUp function is an even number
* and larger than 2
*
* In this test case, the screen width is set to 800 in dp, so the calculation result should
* be 4. Finally the result is expected to be 5 after counting the hero thumb.
*/
@Test
public void checkCalculateNumberOfThumbs3() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest =
(int) (800 * mContext.getResources().getDisplayMetrics().density);
int screenHeightInPixelForTest =
(int) (800 * mContext.getResources().getDisplayMetrics().density);
int expectedChildCounts = 5;
mBar.measure(View.MeasureSpec.makeMeasureSpec(
screenWidthInPixelForTest, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(
screenHeightInPixelForTest, View.MeasureSpec.EXACTLY));
assertEquals(mBar.getChildCount(), expectedChildCounts);
}
/**
* check setNumberOfThumbs method
*
* When user calling setNumberOfThumbs(int numOfThumbs) method. The flag mIsUserSets will be
* toggled to true to honor user's choice, and the result of child view's number should
* not be impacted by calculateNumberOfThumbs(int widthInPixel) method.
*
* In this test case, the screen width is set to 960 in dp, the calculation result from
* calculateNumberOfThumbs method should be 5. But after calling setNumberOfThumbs function to
* set thumbs' number to 3, this value should not impact the final result.
*/
@Test
public void checkSetNumberOfThumbs() {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mBar = Mockito.spy(new ThumbsBar(mContext, null));
}
});
int screenWidthInPixelForTest =
(int) (960 * mContext.getResources().getDisplayMetrics().density);
int screenHeightInPixelForTest =
(int) (960 * mContext.getResources().getDisplayMetrics().density);
int numberOfThumbs = 3;
mBar.setNumberOfThumbs(numberOfThumbs);
mBar.measure(View.MeasureSpec.makeMeasureSpec(
screenWidthInPixelForTest, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(
screenHeightInPixelForTest, View.MeasureSpec.EXACTLY));
assertEquals(mBar.getChildCount(), numberOfThumbs);
}
}