/* * 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.stopwatch; import android.content.Context; import android.test.AndroidTestCase; import android.widget.TextView; import java.util.concurrent.TimeUnit; /** * Unit tests for {@link ChronometerView}. */ public class ChronometerViewTest extends AndroidTestCase { private final long COUNT_DOWN_SECONDS = 5; private long mElapsedRealtime; private ChronometerView mView; private TextView mMinutesView; private TextView mSecondsView; private TextView mCentiSecondsView; // Test flags. private boolean mMockUpdateView; private boolean mMockUpdateTextWithArgs; private boolean mOnChangeCalled; private boolean mPlaySoundCalled; private boolean mUpdateTextCalled; private boolean mUpdateTextWithArgsCalled; private int mTextColor; private long mPostedCallbackDelayMillis; private long mTimeMillis; private Runnable mPostedCallback; private Runnable mRemovedCallback; private long mMillisLeft; private boolean mOnFinishCalled; /** Extension of {@link ChronometerView} for easier testing. */ private class MockChronometerView extends ChronometerView { public MockChronometerView(Context context) { super(context); } @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 public long getElapsedRealtime() { return mElapsedRealtime; } } @Override protected void setUp() throws Exception { super.setUp(); mView = new MockChronometerView(getContext()); mView.setListener(new ChronometerView.Listener() { @Override public void onChange() { mOnChangeCalled = true; } }); // Retrieve the underlying views. mMinutesView = (TextView) mView.findViewById(R.id.minute); mSecondsView = (TextView) mView.findViewById(R.id.second); mCentiSecondsView = (TextView) mView.findViewById(R.id.centi_second); // Reset the test flags. mPostedCallbackDelayMillis = 0; mPostedCallback = null; mRemovedCallback = null; mOnChangeCalled = false; } public void testSetBaseMillisProperlyUpdatesText() { mView.setBaseMillis(mElapsedRealtime); assertTrue(mOnChangeCalled); assertEquals("00", mMinutesView.getText()); assertEquals("00", mSecondsView.getText()); assertEquals("00", mCentiSecondsView.getText()); } public void testStartPostsRunnable() { mView.start(); assertNotNull(mPostedCallback); assertEquals(ChronometerView.DELAY_MILLIS, mPostedCallbackDelayMillis); } public void testStartWhenStartedIsNoOp() { mView.start(); assertNotNull(mPostedCallback); assertEquals(ChronometerView.DELAY_MILLIS, mPostedCallbackDelayMillis); // Reset flags. mPostedCallback = null; mPostedCallbackDelayMillis = 0; mView.start(); assertNull(mPostedCallback); assertEquals(0, mPostedCallbackDelayMillis); } public void testStopRemovesRunnable() { mView.start(); mView.stop(); assertNotNull(mRemovedCallback); } public void testStopWhenStoppedIsNoOp() { mView.stop(); assertNull(mRemovedCallback); } public void testUpdateTextProperlyUpdatesText() { long expectedMinutes = 3; long expectedSeconds = 45; long expectedCentiSeconds = 89; long elapsedTimeMillis = TimeUnit.MINUTES.toMillis(expectedMinutes) + TimeUnit.SECONDS.toMillis(expectedSeconds) + expectedCentiSeconds * 10; mElapsedRealtime += elapsedTimeMillis; mView.updateText(); assertTrue(mOnChangeCalled); assertEquals("03", mMinutesView.getText()); assertEquals("45", mSecondsView.getText()); assertEquals("89", mCentiSecondsView.getText()); } }