blob: 4c5c7176610b8063ee51413f9e94e17d294ae1f7 [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 com.android.cts.stub.R;
import dalvik.annotation.BrokenTest;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import dalvik.annotation.ToBeFixed;
import android.content.Context;
import android.content.res.Resources.NotFoundException;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.test.InstrumentationTestCase;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.CycleInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ProgressBar;
@TestTargetClass(ProgressBar.class)
public class ProgressBarTest extends InstrumentationTestCase {
// The target context.
private Context mContext;
@Override
protected void setUp() throws Exception {
super.setUp();
mContext = getInstrumentation().getTargetContext();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ProgressBar",
args = {android.content.Context.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ProgressBar",
args = {android.content.Context.class, android.util.AttributeSet.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ProgressBar",
args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
)
})
public void testConstructor() {
new ProgressBar(mContext);
new ProgressBar(mContext, null);
new ProgressBar(mContext, null, com.android.internal.R.attr.progressBarStyle);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setIndeterminate",
args = {boolean.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "isIndeterminate",
args = {}
)
})
public void testSetIndeterminate() {
ProgressBar progressBar = new ProgressBar(mContext);
assertTrue(progressBar.isIndeterminate());
progressBar.setIndeterminate(true);
assertTrue(progressBar.isIndeterminate());
progressBar.setIndeterminate(false);
// because default is Indeterminate only progressBar, can't change the status
assertTrue(progressBar.isIndeterminate());
progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
assertFalse(progressBar.isIndeterminate());
progressBar.setIndeterminate(true);
assertTrue(progressBar.isIndeterminate());
progressBar.setIndeterminate(false);
assertFalse(progressBar.isIndeterminate());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getIndeterminateDrawable",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setIndeterminateDrawable",
args = {android.graphics.drawable.Drawable.class}
)
})
public void testAccessIndeterminateDrawable() {
ProgressBar progressBar = new ProgressBar(mContext);
// set IndeterminateDrawable
// normal value
MockDrawable mockDrawable = new MockDrawable();
progressBar.setIndeterminateDrawable(mockDrawable);
assertSame(mockDrawable, progressBar.getIndeterminateDrawable());
assertFalse(mockDrawable.hasCalledDraw());
progressBar.draw(new Canvas());
assertTrue(mockDrawable.hasCalledDraw());
// exceptional value
progressBar.setIndeterminateDrawable(null);
assertNull(progressBar.getIndeterminateDrawable());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getProgressDrawable",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setProgressDrawable",
args = {android.graphics.drawable.Drawable.class}
)
})
public void testAccessProgressDrawable() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
// set ProgressDrawable
// normal value
MockDrawable mockDrawable = new MockDrawable();
progressBar.setProgressDrawable(mockDrawable);
assertSame(mockDrawable, progressBar.getProgressDrawable());
assertFalse(mockDrawable.hasCalledDraw());
progressBar.draw(new Canvas());
assertTrue(mockDrawable.hasCalledDraw());
// exceptional value
progressBar.setProgressDrawable(null);
assertNull(progressBar.getProgressDrawable());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getProgress",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setProgress",
args = {int.class}
)
})
public void testAccessProgress() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
assertEquals(0, progressBar.getProgress());
final int maxProgress = progressBar.getMax();
// set Progress
// normal value
progressBar.setProgress(maxProgress >> 1);
assertEquals(maxProgress >> 1, progressBar.getProgress());
// exceptional values
progressBar.setProgress(-1);
assertEquals(0, progressBar.getProgress());
progressBar.setProgress(maxProgress + 1);
assertEquals(maxProgress, progressBar.getProgress());
progressBar.setProgress(Integer.MAX_VALUE);
assertEquals(maxProgress, progressBar.getProgress());
// when in indeterminate mode
progressBar.setIndeterminate(true);
progressBar.setProgress(maxProgress >> 1);
assertEquals(0, progressBar.getProgress());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getSecondaryProgress",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setSecondaryProgress",
args = {int.class}
)
})
public void testAccessSecondaryProgress() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
assertEquals(0, progressBar.getSecondaryProgress());
final int maxProgress = progressBar.getMax();
// set SecondaryProgress
// normal value
progressBar.setSecondaryProgress(maxProgress >> 1);
assertEquals(maxProgress >> 1, progressBar.getSecondaryProgress());
// exceptional value
progressBar.setSecondaryProgress(-1);
assertEquals(0, progressBar.getSecondaryProgress());
progressBar.setSecondaryProgress(maxProgress + 1);
assertEquals(maxProgress, progressBar.getSecondaryProgress());
progressBar.setSecondaryProgress(Integer.MAX_VALUE);
assertEquals(maxProgress, progressBar.getSecondaryProgress());
// when in indeterminate mode
progressBar.setIndeterminate(true);
progressBar.setSecondaryProgress(maxProgress >> 1);
assertEquals(0, progressBar.getSecondaryProgress());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "incrementProgressBy",
args = {int.class}
)
public void testIncrementProgressBy() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
// normal value
int increment = 1;
int oldProgress = progressBar.getProgress();
progressBar.incrementProgressBy(increment);
assertEquals(oldProgress + increment, progressBar.getProgress());
increment = progressBar.getMax() >> 1;
oldProgress = progressBar.getProgress();
progressBar.incrementProgressBy(increment);
assertEquals(oldProgress + increment, progressBar.getProgress());
// exceptional values
progressBar.setProgress(0);
progressBar.incrementProgressBy(Integer.MAX_VALUE);
assertEquals(progressBar.getMax(), progressBar.getProgress());
progressBar.setProgress(0);
progressBar.incrementProgressBy(Integer.MIN_VALUE);
assertEquals(0, progressBar.getProgress());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "incrementSecondaryProgressBy",
args = {int.class}
)
public void testIncrementSecondaryProgressBy() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
// normal value
int increment = 1;
int oldSecondaryProgress = progressBar.getSecondaryProgress();
progressBar.incrementSecondaryProgressBy(increment);
assertEquals(oldSecondaryProgress + increment, progressBar.getSecondaryProgress());
increment = progressBar.getMax() >> 1;
oldSecondaryProgress = progressBar.getSecondaryProgress();
progressBar.incrementSecondaryProgressBy(increment);
assertEquals(oldSecondaryProgress + increment, progressBar.getSecondaryProgress());
// exceptional values
progressBar.setSecondaryProgress(0);
progressBar.incrementSecondaryProgressBy(Integer.MAX_VALUE);
assertEquals(progressBar.getMax(), progressBar.getSecondaryProgress());
progressBar.setSecondaryProgress(0);
progressBar.incrementSecondaryProgressBy(Integer.MIN_VALUE);
assertEquals(0, progressBar.getSecondaryProgress());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "setInterpolator",
args = {android.view.animation.Interpolator.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "getInterpolator",
args = {}
)
})
public void testAccessInterpolator() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyle);
// default should be LinearInterpolator
assertTrue(progressBar.getInterpolator() instanceof LinearInterpolator);
// normal value
Interpolator i = new AccelerateDecelerateInterpolator();
progressBar.setInterpolator(i);
assertEquals(i, progressBar.getInterpolator());
// exceptional value
progressBar.setInterpolator(null);
assertNull(progressBar.getInterpolator());
// TODO: test whether setInterpolator takes effect? How to get the animation?
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setInterpolator",
args = {android.content.Context.class, int.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getInterpolator",
args = {}
)
})
@ToBeFixed(bug = "1695243", explanation = "the javadoc for setInterpolator() is incomplete." +
"1. not clear what is supposed to happen if context or resID is exceptional.")
@BrokenTest("Initial setInterpolator() call occasionally fails with NPE. context null?")
public void testAccessInterpolatorContext() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyle);
// default is LinearInterpolator
assertTrue(progressBar.getInterpolator() instanceof LinearInterpolator);
// normal value
progressBar.setInterpolator(mContext.getApplicationContext(), R.anim.move_cycle);
assertTrue(progressBar.getInterpolator() instanceof CycleInterpolator);
// exceptional value
try {
progressBar.setInterpolator(null, R.anim.move_ani);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// issue 1695243, not clear what is supposed to happen if context is null.
}
try {
progressBar.setInterpolator(mContext.getApplicationContext(), -1);
fail("Should throw NotFoundException");
} catch (NotFoundException e) {
// issue 1695243, not clear what is supposed to happen if resID is exceptional.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setVisibility",
args = {int.class}
)
@ToBeFixed(bug = "1695243", explanation = "the javadoc for setVisibility() is incomplete." +
"1. not clear what is supposed result if visibility isn't VISIBLE, INVISIBLE or GONE.")
public void testSetVisibility() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
// set visibility
// normal value
int visibility = View.VISIBLE;
progressBar.setVisibility(visibility);
assertEquals(visibility, progressBar.getVisibility());
visibility = View.GONE;
progressBar.setVisibility(visibility);
assertEquals(visibility, progressBar.getVisibility());
// exceptional value
visibility = 0xfffffff5; // -11
int mask = 0x0000000C; // View.VISIBILITY_MASK
int expected = (progressBar.getVisibility() & ~mask) | (visibility & mask);
progressBar.setVisibility(visibility);
assertEquals(expected, progressBar.getVisibility());
visibility = 0x7fffffff; // Integer.MAX_VALUE;
expected = (progressBar.getVisibility() & ~mask) | (visibility & mask);
progressBar.setVisibility(Integer.MAX_VALUE);
assertEquals(expected, progressBar.getVisibility());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "invalidateDrawable",
args = {android.graphics.drawable.Drawable.class}
)
@ToBeFixed(bug = "1695243", explanation = "the javadoc for invalidateDrawable() is incomplete." +
"1. not clear what is supposed to happen if drawable is null.")
public void testInvalidateDrawable() {
MockProgressBar mockProgressBar = new MockProgressBar(mContext);
MockDrawable mockDrawable1 = new MockDrawable();
MockDrawable mockDrawable2 = new MockDrawable();
mockProgressBar.setBackgroundDrawable(mockDrawable1);
mockProgressBar.invalidateDrawable(mockDrawable1);
assertTrue(mockProgressBar.hasCalledInvalidate());
mockProgressBar.reset();
mockProgressBar.invalidateDrawable(mockDrawable2);
assertFalse(mockProgressBar.hasCalledInvalidate());
try {
mockProgressBar.invalidateDrawable(null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
// issue 1695243, not clear what is supposed to happen if drawable is null.
}
mockProgressBar.setIndeterminateDrawable(mockDrawable1);
mockProgressBar.setProgressDrawable(mockDrawable2);
mockProgressBar.invalidateDrawable(null);
assertFalse(mockProgressBar.hasCalledInvalidate());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "postInvalidate",
args = {}
)
public void testPostInvalidate() {
MockProgressBar mockProgressBar = new MockProgressBar(mContext);
mockProgressBar.postInvalidate();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getMax",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "setMax",
args = {int.class}
)
})
public void testAccessMax() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
// set Progress
int progress = 10;
progressBar.setProgress(progress);
// normal value
int max = progress + 1;
progressBar.setMax(max);
assertEquals(max, progressBar.getMax());
assertEquals(progress, progressBar.getProgress());
max = progress - 1;
progressBar.setMax(max);
assertEquals(max, progressBar.getMax());
assertEquals(max, progressBar.getProgress());
// exceptional values
progressBar.setMax(-1);
assertEquals(0, progressBar.getMax());
assertEquals(0, progressBar.getProgress());
progressBar.setMax(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, progressBar.getMax());
assertEquals(0, progressBar.getProgress());
}
@TestTargetNew(
level = TestLevel.NOT_NECESSARY,
method = "onDraw",
args = {android.graphics.Canvas.class}
)
public void testOnDraw() {
// Do not test, it's controlled by View. Implementation details
}
private class MockDrawable extends Drawable {
private boolean mCalledDraw = false;
@Override
public void draw(Canvas canvas) {
mCalledDraw = true;
}
@Override
public int getOpacity() {
return 0;
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
public boolean hasCalledDraw() {
return mCalledDraw;
}
public void reset() {
mCalledDraw = false;
}
}
@TestTargetNew(
level = TestLevel.NOT_NECESSARY,
method = "onMeasure",
args = {int.class, int.class}
)
public void testOnMeasure() {
// onMeasure() is implementation details, do NOT test
}
@TestTargetNew(
level = TestLevel.NOT_NECESSARY,
method = "onSizeChanged",
args = {int.class, int.class, int.class, int.class}
)
public void testOnSizeChange() {
// onSizeChanged() is implementation details, do NOT test
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "verifyDrawable",
args = {android.graphics.drawable.Drawable.class}
)
public void testVerifyDrawable() {
MockProgressBar mockProgressBar = new MockProgressBar(mContext);
assertTrue(mockProgressBar.verifyDrawable(null));
Drawable d1 = mContext.getResources().getDrawable(R.drawable.blue);
Drawable d2 = mContext.getResources().getDrawable(R.drawable.red);
Drawable d3 = mContext.getResources().getDrawable(R.drawable.yellow);
mockProgressBar.setBackgroundDrawable(d1);
assertTrue(mockProgressBar.verifyDrawable(null));
assertTrue(mockProgressBar.verifyDrawable(d1));
assertFalse(mockProgressBar.verifyDrawable(d2));
assertFalse(mockProgressBar.verifyDrawable(d3));
mockProgressBar.setIndeterminateDrawable(d2);
assertTrue(mockProgressBar.verifyDrawable(null));
assertTrue(mockProgressBar.verifyDrawable(d1));
assertTrue(mockProgressBar.verifyDrawable(d2));
assertFalse(mockProgressBar.verifyDrawable(d3));
mockProgressBar.setProgressDrawable(d3);
assertFalse(mockProgressBar.verifyDrawable(null));
assertTrue(mockProgressBar.verifyDrawable(d1));
assertTrue(mockProgressBar.verifyDrawable(d2));
assertTrue(mockProgressBar.verifyDrawable(d3));
}
@TestTargetNew(
level = TestLevel.NOT_NECESSARY,
method = "drawableStateChanged",
args = {}
)
public void testDrawableStateChanged() {
// drawableStateChanged() is implementation details, do NOT test
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "onRestoreInstanceState",
args = {android.os.Parcelable.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "onSaveInstanceState",
args = {}
)
})
public void testOnSaveAndRestoreInstanceState() {
ProgressBar progressBar = new ProgressBar(mContext, null,
com.android.internal.R.attr.progressBarStyleHorizontal);
int oldProgress = 1;
int oldSecondaryProgress = progressBar.getMax() - 1;
progressBar.setProgress(oldProgress);
progressBar.setSecondaryProgress(oldSecondaryProgress);
assertEquals(oldProgress, progressBar.getProgress());
assertEquals(oldSecondaryProgress, progressBar.getSecondaryProgress());
Parcelable state = progressBar.onSaveInstanceState();
int newProgress = 2;
int newSecondaryProgress = progressBar.getMax() - 2;
progressBar.setProgress(newProgress);
progressBar.setSecondaryProgress(newSecondaryProgress);
assertEquals(newProgress, progressBar.getProgress());
assertEquals(newSecondaryProgress, progressBar.getSecondaryProgress());
progressBar.onRestoreInstanceState(state);
assertEquals(oldProgress, progressBar.getProgress());
assertEquals(oldSecondaryProgress, progressBar.getSecondaryProgress());
}
/*
* Mock class for ProgressBar to test protected methods
*/
private class MockProgressBar extends ProgressBar {
private boolean mCalledInvalidate = false;
/**
* @param context
*/
public MockProgressBar(Context context) {
super(context);
}
@Override
protected boolean verifyDrawable(Drawable who) {
return super.verifyDrawable(who);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
}
public void invalidate(int l, int t, int r, int b) {
mCalledInvalidate = true;
super.invalidate(l, t, r, b);
}
public void invalidate() {
mCalledInvalidate = true;
super.invalidate();
}
public boolean hasCalledInvalidate() {
return mCalledInvalidate;
}
public void reset() {
mCalledInvalidate = false;
}
}
}