/*
* Copyright (C) 2013 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.app.Activity;
import android.app.Instrumentation;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.ServiceConnection;
import android.test.ActivityUnitTestCase;
import java.util.concurrent.TimeUnit;
/**
* Unit tests for {@link MenuActivity}.
*/
public class MenuActivityTest extends ActivityUnitTestCase<MockMenuActivity> {
private static final long INITIAL_DURATION_MILLIS = TimeUnit.MINUTES.toMillis(5);
private Timer mTimer;
private boolean mServiceStopped;
private boolean mBindServiceCalled;
private boolean mUnbindServiceCalled;
private Intent mActivityIntent;
private TimerService.TimerBinder mTimerBinder;
public MenuActivityTest() {
super(MockMenuActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mTimer = new Timer(INITIAL_DURATION_MILLIS);
mTimerBinder = new TimerService.TimerBinder(mTimer);
// Set a mock context to simulate service binding.
setActivityContext(new ContextWrapper(getInstrumentation().getTargetContext()) {
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
assertNotNull(service);
assertNotNull(conn);
assertEquals(TimerService.class.getName(), service.getComponent().getClassName());
// Bind the mock service with the Activity.
conn.onServiceConnected(null, mTimerBinder);
mBindServiceCalled = true;
return true;
}
@Override
public void unbindService(ServiceConnection conn) {
mUnbindServiceCalled = true;
}
@Override
public boolean stopService(Intent intent) {
assertEquals(TimerService.class.getName(), intent.getComponent().getClassName());
mServiceStopped = true;
return true;
}
});
mActivityIntent = new Intent(getInstrumentation().getTargetContext(), MenuActivity.class);
}
public void testOnCreateBindsAndUnbindsService() {
MenuActivity activity = startActivity(mActivityIntent, null, null);
assertTrue(mBindServiceCalled);
assertTrue(mUnbindServiceCalled);
}
public void testOnActivityResult() {
MenuActivity activity = startActivity(mActivityIntent, null, null);
Intent data = new Intent();
long expectedDurationMillis = TimeUnit.SECONDS.toMillis(30);
data.putExtra(SetTimerActivity.EXTRA_DURATION_MILLIS, expectedDurationMillis);
activity.onActivityResult(MenuActivity.SET_TIMER, Activity.RESULT_OK, data);
assertEquals(expectedDurationMillis, mTimer.getDurationMillis());
assertTrue(isFinishCalled());
}
public void testOnActivityResultCanceled() {
MenuActivity activity = startActivity(mActivityIntent, null, null);
activity.onActivityResult(MenuActivity.SET_TIMER, Activity.RESULT_CANCELED, null);
assertEquals(INITIAL_DURATION_MILLIS, mTimer.getDurationMillis());
assertTrue(isFinishCalled());
}
public void testOptionsMenuEnabledNoTimerSet() {
// Reset Timer.
mTimer.setDurationMillis(0);
MenuActivity activity = startActivity(mActivityIntent, null, null);
Instrumentation inst = getInstrumentation();
// Those options menu should be disabled.
assertFalse(inst.invokeMenuActionSync(activity, R.id.change_timer, 0));
assertFalse(inst.invokeMenuActionSync(activity, R.id.start, 0));
assertFalse(inst.invokeMenuActionSync(activity, R.id.resume, 0));
assertFalse(inst.invokeMenuActionSync(activity, R.id.pause, 0));
assertFalse(inst.invokeMenuActionSync(activity, R.id.reset, 0));
// Those options menu should be enabled.
assertTrue(inst.invokeMenuActionSync(activity, R.id.set_timer, 0));
assertTrue(inst.invokeMenuActionSync(activity, R.id.stop, 0));
}
public void testOptionsMenuSetTimerNoTimeSet() {
// Reset Timer.
mTimer.setDurationMillis(0);
assertOptionsMenu(R.id.set_timer, true);
Intent startedIntent = getStartedActivityIntent();
assertNotNull(startedIntent);
assertEquals(SetTimerActivity.class.getName(), startedIntent.getComponent().getClassName());
assertEquals(0, startedIntent.getLongExtra(SetTimerActivity.EXTRA_DURATION_MILLIS, 0));
assertEquals(MenuActivity.SET_TIMER, getStartedActivityRequest());
assertFalse(isFinishCalled());
}
public void testOptionsMenuSetTimerTimeSet() {
assertOptionsMenu(R.id.set_timer, false);
}
public void testOptionsMenuChangeTimerNoTimeSet() {
// Reset Timer.
mTimer.setDurationMillis(0);
assertOptionsMenu(R.id.change_timer, false);
}
public void testOptionsMenuChangeTimerTimeSet() {
assertOptionsMenu(R.id.change_timer, true);
Intent startedIntent = getStartedActivityIntent();
assertNotNull(startedIntent);
assertEquals(SetTimerActivity.class.getName(), startedIntent.getComponent().getClassName());
assertEquals(
INITIAL_DURATION_MILLIS,
startedIntent.getLongExtra(SetTimerActivity.EXTRA_DURATION_MILLIS, 0));
assertEquals(MenuActivity.SET_TIMER, getStartedActivityRequest());
assertFalse(isFinishCalled());
}
public void testOptionsMenuStart() {
assertOptionsMenu(R.id.start, true);
assertTrue(isFinishCalled());
assertTrue(mTimer.isStarted());
assertTrue(mTimer.isRunning());
}
public void testOptionsMenuStartTimerRunning() {
mTimer.start();
assertOptionsMenu(R.id.start, false);
}
public void testOptionsMenuStartTimerPaused() {
mTimer.start();
mTimer.pause();
assertOptionsMenu(R.id.start, false);
}
public void testOptionsMenuResume() {
assertOptionsMenu(R.id.resume, false);
}
public void testOptionsMenuResumeTimerRunning() {
mTimer.start();
assertOptionsMenu(R.id.resume, false);
}
public void testOptionsMenuResumeTimerPaused() {
mTimer.start();
mTimer.pause();
assertOptionsMenu(R.id.resume, true);
assertTrue(isFinishCalled());
assertTrue(mTimer.isStarted());
assertTrue(mTimer.isRunning());
}
public void testOptionsMenuPause() {
assertOptionsMenu(R.id.pause, false);
}
public void testOptionsMenuPauseTimerRunning() {
mTimer.start();
assertOptionsMenu(R.id.pause, true);
assertTrue(isFinishCalled());
assertTrue(mTimer.isStarted());
assertFalse(mTimer.isRunning());
}
public void testOptionsMenuPauseTimerPaused() {
mTimer.start();
mTimer.pause();
assertOptionsMenu(R.id.pause, false);
}
public void testOptionsMenuReset() {
assertOptionsMenu(R.id.reset, false);
}
public void testOptionsMenuResetTimerRunning() {
mTimer.start();
assertOptionsMenu(R.id.reset, true);
assertTrue(isFinishCalled());
assertFalse(mTimer.isStarted());
assertFalse(mTimer.isRunning());
assertEquals(INITIAL_DURATION_MILLIS, mTimer.getDurationMillis());
}
public void testOptionsMenuResetTimerPaused() {
mTimer.start();
mTimer.reset();
assertOptionsMenu(R.id.reset, false);
assertTrue(isFinishCalled());
assertFalse(mTimer.isStarted());
assertFalse(mTimer.isRunning());
assertEquals(INITIAL_DURATION_MILLIS, mTimer.getDurationMillis());
}
public void testOptionsMenuStop() {
assertOptionsMenu(R.id.stop, true);
assertTrue(isFinishCalled());
assertTrue(mServiceStopped);
}
/** A convenience method to assert options menu behavior. */
private void assertOptionsMenu(int menuId, boolean shouldBeHandled) {
MenuActivity activity = startActivity(mActivityIntent, null, null);
boolean handled = getInstrumentation().invokeMenuActionSync(activity, menuId, 0);
assertEquals(shouldBeHandled, handled);
activity.onOptionsMenuClosed(null);
}
}