/* * Copyright (C) 2014 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.google.android.glass.sample.timer; import android.test.AndroidTestCase; import android.content.Context; import android.view.View; import android.widget.TextView; import java.util.concurrent.TimeUnit; /** * Unit tests for {@link TimerDrawer}. */ public class TimerViewTest extends AndroidTestCase { /** Initial duration of 02h30m00s. */ private static final long INITIAL_DURATION_MILLIS = TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(30); private static final String INITIAL_HOURS_COMPONENT = "02"; private static final String INITIAL_MINUTES_COMPONENT = "30"; private static final String INITIAL_SECONDS_COMPONENT = "00"; private long mRemainingTimeMillis; private TimerView mView; private TextView mHoursView; private TextView mMinutesView; private TextView mSecondsView; private TextView mTipView; // Test flags. private boolean mMockUpdateText; private boolean mOnChangeCalled; private boolean mPlaySoundCalled; private boolean mUpdateTextCalled; private int mTextColor; private long mPostedCallbackDelayMillis; private long mTimeMillis; private Runnable mPostedCallback; private Runnable mRemovedCallback; /** Extension of {@link Timer} for easier testing. */ private final Timer mTimer = new Timer() { @Override public long getRemainingTimeMillis() { return mRemainingTimeMillis; } }; /** Extension of {@link TimerView} for easier testing. */ private class MockTimerView extends TimerView { public MockTimerView(Context context, Timer timer) { super(context, null, 0, timer); } @Override public boolean postDelayed(Runnable action, long delayMillis) { mPostedCallback = action; mPostedCallbackDelayMillis = delayMillis; return true; } @Override public boolean removeCallbacks(Runnable action) { mRemovedCallback = action; return true; } @Override protected void updateText(long timeMillis, int textColor) { mUpdateTextCalled = true; mTimeMillis = timeMillis; mTextColor = textColor; if (!mMockUpdateText) { super.updateText(timeMillis, textColor); } } @Override protected void playSound() { mPlaySoundCalled = true; } } @Override protected void setUp() throws Exception { super.setUp(); // Reset the test flags. mMockUpdateText = true; mUpdateTextCalled = false; mPlaySoundCalled = false; mTimeMillis = 0; mTextColor = 0; mPostedCallback = null; mRemovedCallback = null; mPostedCallbackDelayMillis = 0; mOnChangeCalled = false; // Initialize test objects. mRemainingTimeMillis = INITIAL_DURATION_MILLIS; mView = new MockTimerView(getContext(), mTimer); mView.setListener(new TimerView.ChangeListener() { @Override public void onChange() { mOnChangeCalled = true; } }); // Retrieve the underlying views. mHoursView = (TextView) mView.findViewById(R.id.hours); mMinutesView = (TextView) mView.findViewById(R.id.minutes); mSecondsView = (TextView) mView.findViewById(R.id.seconds); mTipView = (TextView) mView.findViewById(R.id.tip); } public void testConstructorProperlyInitializeViews() { assertEquals( getContext().getResources().getString(R.string.timer_finished), mTipView.getText()); assertEquals(View.INVISIBLE, mTipView.getVisibility()); assertTrue(mUpdateTextCalled); } public void testListenerOnStart() { mTimer.start(); assertNotNull(mPostedCallback); assertEquals(TimerView.DELAY_MILLIS, mPostedCallbackDelayMillis); } public void testListenerOnStartWithNoneDefaultDelay() { // Remove 700ms from the remaining time. mRemainingTimeMillis -= 700; mTimer.start(); assertNotNull(mPostedCallback); assertEquals(300, mPostedCallbackDelayMillis); } public void testListenerOnPauseRemovesCallback() { mTimer.start(); mTimer.pause(); assertNotNull(mPostedCallback); assertNotNull(mRemovedCallback); assertEquals(mPostedCallback, mRemovedCallback); } public void testListenerOnReset() { mTimer.reset(); assertTrue(mUpdateTextCalled); assertEquals(INITIAL_DURATION_MILLIS, mTimeMillis); assertEquals(getContext().getResources().getColor(R.color.white), mTextColor); assertEquals(View.INVISIBLE, mTipView.getVisibility()); } public void testUpdateTextTimerRunning() { long expectedDurationMillis = INITIAL_DURATION_MILLIS - 1 + TimeUnit.SECONDS.toMillis(1); mView.updateText(); assertEquals(expectedDurationMillis, mTimeMillis); assertEquals(getContext().getResources().getColor(R.color.white), mTextColor); assertEquals(View.INVISIBLE, mTipView.getVisibility()); } public void testUpdateTextTimerFinished() { mRemainingTimeMillis = TimeUnit.SECONDS.toMillis(-2); mView.updateText(); assertEquals(-mRemainingTimeMillis, mTimeMillis); assertEquals(getContext().getResources().getColor(R.color.red), mTextColor); assertEquals(View.VISIBLE, mTipView.getVisibility()); } public void testUpdateTextTimerFinishedChangesTextColor() { int colorWhite = getContext().getResources().getColor(R.color.white); int colorRed = getContext().getResources().getColor(R.color.red); mRemainingTimeMillis = TimeUnit.SECONDS.toMillis(-2); mView.updateText(); assertEquals(colorRed, mTextColor); mView.updateText(); assertEquals(colorWhite, mTextColor); mView.updateText(); assertEquals(colorRed, mTextColor); } public void testUpdateTextWithArgs() { int colorRed = getContext().getResources().getColor(R.color.red); mMockUpdateText = false; mView.updateText(INITIAL_DURATION_MILLIS, colorRed); assertEquals(INITIAL_HOURS_COMPONENT, mHoursView.getText()); assertEquals(INITIAL_MINUTES_COMPONENT, mMinutesView.getText()); assertEquals(INITIAL_SECONDS_COMPONENT, mSecondsView.getText()); assertEquals(colorRed, mHoursView.getTextColors().getDefaultColor()); assertEquals(colorRed, mMinutesView.getTextColors().getDefaultColor()); assertEquals(colorRed, mSecondsView.getTextColors().getDefaultColor()); assertTrue(mOnChangeCalled); } }