blob: ce4d4a332ed038a928a94607c48f3a494a1d1d8b [file] [log] [blame]
/*
* Copyright (C) 2008 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 android.widget.cts;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ProgressBar;
import android.widget.cts.util.TestUtils;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ProgressBarTest {
private ProgressBarCtsActivity mActivity;
private ProgressBar mProgressBar;
private ProgressBar mProgressBarHorizontal;
@Rule
public ActivityTestRule<ProgressBarCtsActivity> mActivityRule =
new ActivityTestRule<>(ProgressBarCtsActivity.class);
@Before
public void setup() {
mActivity = mActivityRule.getActivity();
mProgressBar = (ProgressBar) mActivity.findViewById(R.id.progress);
mProgressBarHorizontal = (ProgressBar) mActivity.findViewById(R.id.progress_horizontal);
}
@Test
public void testConstructor() {
new ProgressBar(mActivity);
new ProgressBar(mActivity, null);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyle);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleHorizontal);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleInverse);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleLarge);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleLargeInverse);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmall);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmallInverse);
new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmallTitle);
new ProgressBar(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_ProgressBar);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Horizontal);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Large);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Large_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small_Title);
new ProgressBar(mActivity, null, 0, android.R.style.Widget_Material_Light_ProgressBar);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Horizontal);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Large);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Large_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Small);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Small_Inverse);
new ProgressBar(mActivity, null, 0,
android.R.style.Widget_Material_Light_ProgressBar_Small_Title);
}
@UiThreadTest
@Test
public void testSetIndeterminate() {
assertTrue(mProgressBar.isIndeterminate());
mProgressBar.setIndeterminate(true);
assertTrue(mProgressBar.isIndeterminate());
mProgressBar.setIndeterminate(false);
// because default is Indeterminate only progressBar, can't change the status
assertTrue(mProgressBar.isIndeterminate());
assertFalse(mProgressBarHorizontal.isIndeterminate());
mProgressBarHorizontal.setIndeterminate(true);
assertTrue(mProgressBarHorizontal.isIndeterminate());
mProgressBarHorizontal.setIndeterminate(false);
assertFalse(mProgressBarHorizontal.isIndeterminate());
}
@UiThreadTest
@Test
public void testQueryAnimationState() {
assertTrue(mProgressBar.isAnimating());
assertFalse(mProgressBarHorizontal.isAnimating());
mProgressBarHorizontal.setIndeterminate(true);
assertTrue(mProgressBarHorizontal.isAnimating());
mProgressBarHorizontal.setIndeterminate(false);
assertFalse(mProgressBarHorizontal.isAnimating());
mProgressBar.setVisibility(View.GONE);
assertFalse(mProgressBar.isAnimating());
mProgressBar.setVisibility(View.INVISIBLE);
assertFalse(mProgressBar.isAnimating());
mProgressBar.setVisibility(View.VISIBLE);
assertTrue(mProgressBar.isAnimating());
}
@UiThreadTest
@Test
public void testAccessIndeterminateDrawable() {
// set IndeterminateDrawable
// normal value
Drawable mockProgressDrawable = spy(new ColorDrawable(Color.YELLOW));
mProgressBar.setIndeterminateDrawable(mockProgressDrawable);
assertSame(mockProgressDrawable, mProgressBar.getIndeterminateDrawable());
verify(mockProgressDrawable, never()).draw(any(Canvas.class));
mProgressBar.draw(new Canvas());
verify(mockProgressDrawable, atLeastOnce()).draw(any(Canvas.class));
// exceptional value
mProgressBar.setIndeterminateDrawable(null);
assertNull(mProgressBar.getIndeterminateDrawable());
}
@UiThreadTest
@Test
public void testAccessProgressDrawable() {
// set ProgressDrawable
// normal value
Drawable mockProgressDrawable = spy(new ColorDrawable(Color.BLUE));
mProgressBarHorizontal.setProgressDrawable(mockProgressDrawable);
assertSame(mockProgressDrawable, mProgressBarHorizontal.getProgressDrawable());
verify(mockProgressDrawable, never()).draw(any(Canvas.class));
mProgressBarHorizontal.draw(new Canvas());
verify(mockProgressDrawable, atLeastOnce()).draw(any(Canvas.class));
// exceptional value
mProgressBarHorizontal.setProgressDrawable(null);
assertNull(mProgressBarHorizontal.getProgressDrawable());
}
@UiThreadTest
@Test
public void testAccessProgress() {
assertEquals(0, mProgressBarHorizontal.getProgress());
final int maxProgress = mProgressBarHorizontal.getMax();
// set Progress
// normal value
mProgressBarHorizontal.setProgress(maxProgress >> 1);
assertEquals(maxProgress >> 1, mProgressBarHorizontal.getProgress());
// exceptional values
mProgressBarHorizontal.setProgress(-1);
assertEquals(0, mProgressBarHorizontal.getProgress());
mProgressBarHorizontal.setProgress(maxProgress + 1);
assertEquals(maxProgress, mProgressBarHorizontal.getProgress());
mProgressBarHorizontal.setProgress(Integer.MAX_VALUE);
assertEquals(maxProgress, mProgressBarHorizontal.getProgress());
mProgressBarHorizontal.setProgress(0, true);
assertEquals(0, mProgressBarHorizontal.getProgress());
// when in indeterminate mode
mProgressBarHorizontal.setIndeterminate(true);
mProgressBarHorizontal.setProgress(maxProgress >> 1);
assertEquals(0, mProgressBarHorizontal.getProgress());
}
@UiThreadTest
@Test
public void testAccessSecondaryProgress() {
assertEquals(0, mProgressBarHorizontal.getSecondaryProgress());
final int maxProgress = mProgressBarHorizontal.getMax();
// set SecondaryProgress
// normal value
mProgressBarHorizontal.setSecondaryProgress(maxProgress >> 1);
assertEquals(maxProgress >> 1, mProgressBarHorizontal.getSecondaryProgress());
// exceptional value
mProgressBarHorizontal.setSecondaryProgress(-1);
assertEquals(0, mProgressBarHorizontal.getSecondaryProgress());
mProgressBarHorizontal.setSecondaryProgress(maxProgress + 1);
assertEquals(maxProgress, mProgressBarHorizontal.getSecondaryProgress());
mProgressBarHorizontal.setSecondaryProgress(Integer.MAX_VALUE);
assertEquals(maxProgress, mProgressBarHorizontal.getSecondaryProgress());
// when in indeterminate mode
mProgressBarHorizontal.setIndeterminate(true);
mProgressBarHorizontal.setSecondaryProgress(maxProgress >> 1);
assertEquals(0, mProgressBarHorizontal.getSecondaryProgress());
}
@UiThreadTest
@Test
public void testIncrementProgressBy() {
// normal value
int increment = 1;
int oldProgress = mProgressBarHorizontal.getProgress();
mProgressBarHorizontal.incrementProgressBy(increment);
assertEquals(oldProgress + increment, mProgressBarHorizontal.getProgress());
increment = mProgressBarHorizontal.getMax() >> 1;
oldProgress = mProgressBarHorizontal.getProgress();
mProgressBarHorizontal.incrementProgressBy(increment);
assertEquals(oldProgress + increment, mProgressBarHorizontal.getProgress());
// exceptional values
mProgressBarHorizontal.setProgress(0);
mProgressBarHorizontal.incrementProgressBy(Integer.MAX_VALUE);
assertEquals(mProgressBarHorizontal.getMax(), mProgressBarHorizontal.getProgress());
mProgressBarHorizontal.setProgress(0);
mProgressBarHorizontal.incrementProgressBy(Integer.MIN_VALUE);
assertEquals(0, mProgressBarHorizontal.getProgress());
}
@UiThreadTest
@Test
public void testIncrementSecondaryProgressBy() {
// normal value
int increment = 1;
int oldSecondaryProgress = mProgressBarHorizontal.getSecondaryProgress();
mProgressBarHorizontal.incrementSecondaryProgressBy(increment);
assertEquals(oldSecondaryProgress + increment,
mProgressBarHorizontal.getSecondaryProgress());
increment = mProgressBarHorizontal.getMax() >> 1;
oldSecondaryProgress = mProgressBarHorizontal.getSecondaryProgress();
mProgressBarHorizontal.incrementSecondaryProgressBy(increment);
assertEquals(oldSecondaryProgress + increment,
mProgressBarHorizontal.getSecondaryProgress());
// exceptional values
mProgressBarHorizontal.setSecondaryProgress(0);
mProgressBarHorizontal.incrementSecondaryProgressBy(Integer.MAX_VALUE);
assertEquals(mProgressBarHorizontal.getMax(),
mProgressBarHorizontal.getSecondaryProgress());
mProgressBarHorizontal.setSecondaryProgress(0);
mProgressBarHorizontal.incrementSecondaryProgressBy(Integer.MIN_VALUE);
assertEquals(0, mProgressBarHorizontal.getSecondaryProgress());
}
@UiThreadTest
@Test
public void testAccessInterpolator() {
// default should be LinearInterpolator
assertTrue(mProgressBar.getInterpolator() instanceof LinearInterpolator);
Interpolator interpolator = new AccelerateDecelerateInterpolator();
mProgressBar.setInterpolator(interpolator);
assertEquals(interpolator, mProgressBar.getInterpolator());
mProgressBar.setInterpolator(mActivity, android.R.anim.accelerate_interpolator);
assertTrue(mProgressBar.getInterpolator() instanceof AccelerateInterpolator);
}
@UiThreadTest
@Test
public void testSetVisibility() {
// set visibility
// normal value
int visibility = View.VISIBLE;
mProgressBarHorizontal.setVisibility(visibility);
assertEquals(visibility, mProgressBarHorizontal.getVisibility());
visibility = View.GONE;
mProgressBarHorizontal.setVisibility(visibility);
assertEquals(visibility, mProgressBarHorizontal.getVisibility());
// exceptional value
visibility = 0xfffffff5; // -11
int mask = 0x0000000C; // View.VISIBILITY_MASK
int expected = (mProgressBarHorizontal.getVisibility() & ~mask) | (visibility & mask);
mProgressBarHorizontal.setVisibility(visibility);
assertEquals(expected, mProgressBarHorizontal.getVisibility());
visibility = 0x7fffffff; // Integer.MAX_VALUE;
expected = (mProgressBarHorizontal.getVisibility() & ~mask) | (visibility & mask);
mProgressBarHorizontal.setVisibility(Integer.MAX_VALUE);
assertEquals(expected, mProgressBarHorizontal.getVisibility());
}
@UiThreadTest
@Test
public void testInvalidateDrawable() {
ProgressBar mockProgressBar = spy(new ProgressBar(mActivity));
Drawable mockDrawable1 = spy(new ColorDrawable(Color.RED));
Drawable mockDrawable2 = spy(new ColorDrawable(Color.GREEN));
mockProgressBar.setBackgroundDrawable(mockDrawable1);
mockProgressBar.invalidateDrawable(mockDrawable1);
verify(mockProgressBar, atLeastOnce()).invalidate(anyInt(), anyInt(), anyInt(), anyInt());
reset(mockProgressBar);
mockProgressBar.invalidateDrawable(mockDrawable2);
verify(mockProgressBar, never()).invalidate(anyInt(), anyInt(), anyInt(), anyInt());
mockProgressBar.setIndeterminateDrawable(mockDrawable1);
mockProgressBar.setProgressDrawable(mockDrawable2);
}
@UiThreadTest
@Test
public void testPostInvalidate() {
mProgressBarHorizontal.postInvalidate();
}
@UiThreadTest
@Test
public void testAccessMax() {
// set Progress
int progress = 10;
mProgressBarHorizontal.setProgress(progress);
// normal value
int max = progress + 1;
mProgressBarHorizontal.setMax(max);
assertEquals(max, mProgressBarHorizontal.getMax());
assertEquals(progress, mProgressBarHorizontal.getProgress());
max = progress - 1;
mProgressBarHorizontal.setMax(max);
assertEquals(max, mProgressBarHorizontal.getMax());
assertEquals(max, mProgressBarHorizontal.getProgress());
// exceptional values
mProgressBarHorizontal.setMax(-1);
assertEquals(0, mProgressBarHorizontal.getMax());
assertEquals(0, mProgressBarHorizontal.getProgress());
mProgressBarHorizontal.setMax(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, mProgressBarHorizontal.getMax());
assertEquals(0, mProgressBarHorizontal.getProgress());
}
@UiThreadTest
@Test
public void testProgressTint() {
ProgressBar tintedProgressBar = (ProgressBar) mActivity.findViewById(R.id.progress_tint);
assertEquals("Progress tint inflated correctly",
Color.WHITE, tintedProgressBar.getProgressTintList().getDefaultColor());
assertEquals("Progress tint mode inflated correctly",
PorterDuff.Mode.SRC_OVER, tintedProgressBar.getProgressTintMode());
assertEquals("Progress background tint inflated correctly",
Color.WHITE, tintedProgressBar.getProgressBackgroundTintList().getDefaultColor());
assertEquals("Progress background tint mode inflated correctly",
PorterDuff.Mode.SRC_OVER, tintedProgressBar.getProgressBackgroundTintMode());
assertEquals("Secondary progress tint inflated correctly",
Color.WHITE, tintedProgressBar.getSecondaryProgressTintList().getDefaultColor());
assertEquals("Secondary progress tint mode inflated correctly",
PorterDuff.Mode.SRC_OVER, tintedProgressBar.getSecondaryProgressTintMode());
Drawable mockProgressDrawable = spy(new ColorDrawable(Color.BLACK));
mProgressBar.setProgressDrawable(mockProgressDrawable);
// No progress tint applied by default
verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class));
mProgressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.WHITE));
// Progress background tint not applied when layer missing
verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class));
mProgressBar.setSecondaryProgressTintList(ColorStateList.valueOf(Color.WHITE));
// Secondary progress tint not applied when layer missing
verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class));
mProgressBar.setProgressTintList(ColorStateList.valueOf(Color.WHITE));
// Progress tint applied when setProgressTintList() called after setProgress()
verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE));
mProgressBar.setProgressBackgroundTintMode(PorterDuff.Mode.DST_OVER);
assertEquals(PorterDuff.Mode.DST_OVER, mProgressBar.getProgressBackgroundTintMode());
mProgressBar.setSecondaryProgressTintMode(PorterDuff.Mode.DST_IN);
assertEquals(PorterDuff.Mode.DST_IN, mProgressBar.getSecondaryProgressTintMode());
mProgressBar.setProgressTintMode(PorterDuff.Mode.DST_ATOP);
assertEquals(PorterDuff.Mode.DST_ATOP, mProgressBar.getProgressTintMode());
reset(mockProgressDrawable);
mProgressBar.setProgressDrawable(null);
mProgressBar.setProgressDrawable(mockProgressDrawable);
// Progress tint applied when setProgressTintList() called before setProgress()
verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE));
}
@UiThreadTest
@Test
public void testIndeterminateTint() {
ProgressBar tintedProgressBar =
(ProgressBar) mActivity.findViewById(R.id.indeterminate_tint);
assertEquals("Indeterminate tint inflated correctly",
Color.WHITE, tintedProgressBar.getIndeterminateTintList().getDefaultColor());
assertEquals("Indeterminate tint mode inflated correctly",
PorterDuff.Mode.SRC_OVER, tintedProgressBar.getIndeterminateTintMode());
Drawable mockIndeterminateDrawable = spy(new ColorDrawable(Color.MAGENTA));
mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable);
// No indeterminate tint applied by default
verify(mockIndeterminateDrawable, never()).setTintList(any(ColorStateList.class));
mProgressBar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED));
// Indeterminate tint applied when setIndeterminateTintList() called after
// setIndeterminate()
verify(mockIndeterminateDrawable, times(1)).setTintList(
TestUtils.colorStateListOf(Color.RED));
mProgressBar.setIndeterminateTintMode(PorterDuff.Mode.LIGHTEN);
assertEquals(PorterDuff.Mode.LIGHTEN, mProgressBar.getIndeterminateTintMode());
reset(mockIndeterminateDrawable);
mProgressBar.setIndeterminateDrawable(null);
mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable);
// Indeterminate tint applied when setIndeterminateTintList() called before
// setIndeterminate()
verify(mockIndeterminateDrawable, times(1)).setTintList(
TestUtils.colorStateListOf(Color.RED));
}
@UiThreadTest
@Test
public void testVerifyDrawable() {
MockProgressBar mockProgressBar =
(MockProgressBar) mActivity.findViewById(R.id.progress_custom);
Drawable d1 = mActivity.getDrawable(R.drawable.blue);
Drawable d2 = mActivity.getDrawable(R.drawable.red);
Drawable d3 = mActivity.getDrawable(R.drawable.yellow);
mockProgressBar.setBackgroundDrawable(d1);
assertTrue(mockProgressBar.verifyDrawable(d1));
assertFalse(mockProgressBar.verifyDrawable(d2));
assertFalse(mockProgressBar.verifyDrawable(d3));
mockProgressBar.setIndeterminateDrawable(d2);
assertTrue(mockProgressBar.verifyDrawable(d1));
assertTrue(mockProgressBar.verifyDrawable(d2));
assertFalse(mockProgressBar.verifyDrawable(d3));
mockProgressBar.setProgressDrawable(d3);
assertTrue(mockProgressBar.verifyDrawable(d1));
assertTrue(mockProgressBar.verifyDrawable(d2));
assertTrue(mockProgressBar.verifyDrawable(d3));
}
@UiThreadTest
@Test
public void testOnSaveAndRestoreInstanceState() {
int oldProgress = 1;
int oldSecondaryProgress = mProgressBarHorizontal.getMax() - 1;
mProgressBarHorizontal.setProgress(oldProgress);
mProgressBarHorizontal.setSecondaryProgress(oldSecondaryProgress);
assertEquals(oldProgress, mProgressBarHorizontal.getProgress());
assertEquals(oldSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress());
Parcelable state = mProgressBarHorizontal.onSaveInstanceState();
int newProgress = 2;
int newSecondaryProgress = mProgressBarHorizontal.getMax() - 2;
mProgressBarHorizontal.setProgress(newProgress);
mProgressBarHorizontal.setSecondaryProgress(newSecondaryProgress);
assertEquals(newProgress, mProgressBarHorizontal.getProgress());
assertEquals(newSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress());
mProgressBarHorizontal.onRestoreInstanceState(state);
assertEquals(oldProgress, mProgressBarHorizontal.getProgress());
assertEquals(oldSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress());
}
/*
* Mock class for ProgressBar to test protected methods
*/
public static class MockProgressBar extends ProgressBar {
public MockProgressBar(Context context) {
super(context);
}
public MockProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected boolean verifyDrawable(Drawable who) {
return super.verifyDrawable(who);
}
}
}