blob: 56be4006e418cfb8af731140a3fba34d0201f9e3 [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.mozc.android.inputmethod.japanese;
import static org.easymock.EasyMock.isA;
import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.base.Optional;
import android.annotation.TargetApi;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
/**
* Test for CandidateViewManager.
*/
public class CandidateViewManagerTest extends InstrumentationTestCaseWithMock {
private Command createCommand(int candidateNum) {
CandidateList.Builder candidateListBuilder = CandidateList.newBuilder();
for (int i = 0; i < candidateNum; ++i) {
candidateListBuilder.addCandidates(CandidateWord.getDefaultInstance());
}
return Command.newBuilder()
.setOutput(Output.newBuilder()
.setAllCandidateWords(candidateListBuilder.buildPartial())
.buildPartial())
.buildPartial();
}
@SmallTest
public void testUpdateForKeyboardCandidateView() {
CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
CandidateViewManager candidateViewManager =
new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
assertFalse(candidateViewManager.isFloatingMode());
{
Command emptyCommand = createCommand(0);
resetAll();
keyboardCandidateView.startOutAnimation();
replayAll();
candidateViewManager.update(emptyCommand);
verifyAll();
}
{
Command nonEmptyCommand = createCommand(1);
resetAll();
keyboardCandidateView.update(nonEmptyCommand);
keyboardCandidateView.startInAnimation();
replayAll();
candidateViewManager.update(nonEmptyCommand);
verifyAll();
}
}
@ApiLevel(21)
@TargetApi(21)
@SmallTest
public void testUpdateForFloatingCandidateView() {
CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
CandidateViewManager candidateViewManager =
new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
resetAll();
keyboardCandidateView.enableFoldButton(false);
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
floatingCandidateView.setEditorInfo(isA(EditorInfo.class));
floatingCandidateView.setCursorAnchorInfo(isA(CursorAnchorInfo.class));
floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
floatingCandidateView.setVisibility(View.VISIBLE);
replayAll();
candidateViewManager.setNarrowMode(true);
candidateViewManager.setAllowFloatingMode(true);
candidateViewManager.setExtractedMode(false);
verifyAll();
assertTrue(candidateViewManager.isFloatingMode());
{
Command emptyCommand = createCommand(0);
resetAll();
floatingCandidateView.setCandidates(emptyCommand);
replayAll();
candidateViewManager.update(emptyCommand);
verifyAll();
}
{
Command nonEmptyCommand = createCommand(1);
resetAll();
floatingCandidateView.setCandidates(nonEmptyCommand);
replayAll();
candidateViewManager.update(nonEmptyCommand);
verifyAll();
}
}
@SmallTest
public void testNarrowMode() {
CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
CandidateViewManager candidateViewManager =
new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
assertFalse(candidateViewManager.isFloatingMode());
EditorInfo editorInfo = new EditorInfo();
candidateViewManager.setEditorInfo(editorInfo);
CursorAnchorInfo cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
candidateViewManager.setCursorAnchorInfo(cursorAnchorInfo);
resetAll();
keyboardCandidateView.enableFoldButton(false);
replayAll();
candidateViewManager.setNarrowMode(true);
candidateViewManager.setAllowFloatingMode(false);
verifyAll();
assertFalse(candidateViewManager.isFloatingMode());
resetAll();
keyboardCandidateView.enableFoldButton(true);
replayAll();
candidateViewManager.setNarrowMode(false);
candidateViewManager.setAllowFloatingMode(false);
verifyAll();
assertFalse(candidateViewManager.isFloatingMode());
// Sets candidates
Command command = createCommand(1);
resetAll();
keyboardCandidateView.update(command);
keyboardCandidateView.startInAnimation();
replayAll();
candidateViewManager.update(command);
verifyAll();
if (FloatingCandidateView.isAvailable()) {
resetAll();
keyboardCandidateView.enableFoldButton(false);
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
floatingCandidateView.setCursorAnchorInfo(cursorAnchorInfo);
floatingCandidateView.setEditorInfo(editorInfo);
floatingCandidateView.setVisibility(View.VISIBLE);
replayAll();
candidateViewManager.setNarrowMode(true);
candidateViewManager.setAllowFloatingMode(true);
verifyAll();
assertTrue(candidateViewManager.isFloatingMode());
resetAll();
keyboardCandidateView.enableFoldButton(true);
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
floatingCandidateView.setVisibility(View.GONE);
replayAll();
candidateViewManager.setNarrowMode(false);
candidateViewManager.setAllowFloatingMode(true);
verifyAll();
assertFalse(candidateViewManager.isFloatingMode());
}
}
@SmallTest
public void testKeyboardCandidateViewAnimationListener() {
CandidateView keyboardCandidateView = createViewMockBuilder(CandidateView.class)
.createNiceMock();
FloatingCandidateView floatingCandidateView = createViewMockBuilder(FloatingCandidateView.class)
.createNiceMock();
CandidateViewManager candidateViewManager =
new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
KeyboardCandidateViewHeightListener animationListener =
createMock(KeyboardCandidateViewHeightListener.class);
resetAll();
keyboardCandidateView.setViewEventListener(viewEventListener);
floatingCandidateView.setViewEventListener(viewEventListener);
replayAll();
candidateViewManager.setEventListener(viewEventListener, animationListener);
verifyAll();
Command nonEmptyCommand = createCommand(1);
assertFalse(candidateViewManager.isFloatingMode());
resetAll();
animationListener.onExpanded();
replayAll();
candidateViewManager.update(nonEmptyCommand);
verifyAll();
Command emptyCommand = createCommand(0);
resetAll();
animationListener.onCollapse();
replayAll();
candidateViewManager.update(emptyCommand);
verifyAll();
if (FloatingCandidateView.isAvailable()) {
candidateViewManager.setNarrowMode(true);
candidateViewManager.setAllowFloatingMode(true);
assertTrue(candidateViewManager.isFloatingMode());
resetAll();
replayAll();
candidateViewManager.update(nonEmptyCommand);
candidateViewManager.update(emptyCommand);
verifyAll();
}
}
@SmallTest
public void testShowNumberKeyboard() {
int candidateTextSize = 10;
int descriptionTextSize = 5;
ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
KeyboardCandidateViewHeightListener heightListener =
createNiceMock(KeyboardCandidateViewHeightListener.class);
InOutAnimatedFrameLayout.VisibilityChangeListener visibilityChangeListener =
createNiceMock(InOutAnimatedFrameLayout.VisibilityChangeListener.class);
Skin skin = new Skin();
{ // Set a view and update.
CandidateViewManager candidateViewManager = new CandidateViewManager(
createViewMockBuilder(CandidateView.class).createNiceMock(),
createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
CandidateView view = createViewMock(CandidateView.class);
resetAll();
view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
view.setViewEventListener(viewEventListener);
view.setOnVisibilityChangeListener(visibilityChangeListener);
view.setSkin(skin);
view.enableFoldButton(true);
view.setInAnimation(isA(Animation.class));
view.setOutAnimation(isA(Animation.class));
view.setOutAnimationListener(isA(AnimationListener.class));
replayAll();
candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
candidateViewManager.setEventListener(viewEventListener, heightListener);
candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
candidateViewManager.setSkin(skin);
candidateViewManager.setNumberCandidateView(view);
verifyAll();
}
{ // Update and set a view.
CandidateViewManager candidateViewManager = new CandidateViewManager(
createViewMockBuilder(CandidateView.class).createNiceMock(),
createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
CandidateView view = createViewMock(CandidateView.class);
resetAll();
// Set default values when number keyboard is set.
view.setSkin(Skin.getFallbackInstance());
view.setOnVisibilityChangeListener(null);
// Set actual values.
view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
view.setViewEventListener(viewEventListener);
view.enableFoldButton(true);
view.setOnVisibilityChangeListener(visibilityChangeListener);
view.setSkin(skin);
view.setInAnimation(isA(Animation.class));
view.setOutAnimation(isA(Animation.class));
view.setOutAnimationListener(isA(AnimationListener.class));
replayAll();
candidateViewManager.setNumberCandidateView(view);
candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
candidateViewManager.setEventListener(viewEventListener, heightListener);
candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
candidateViewManager.setSkin(skin);
verifyAll();
}
}
@SmallTest
public void testSwitchNumberKeyboard() {
CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
CandidateView numberCandidateView = createViewMock(CandidateView.class);
CandidateViewManager candidateViewManager = new CandidateViewManager(
keyboardCandidateView, createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
candidateViewManager.setNumberCandidateView(numberCandidateView);
Command command = createCommand(1);
{
resetAll();
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
numberCandidateView.setVisibility(View.GONE);
replayAll();
candidateViewManager.setNumberMode(true);
verifyAll();
resetAll();
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
replayAll();
candidateViewManager.setNumberMode(false);
verifyAll();
}
{
resetAll();
keyboardCandidateView.update(command);
keyboardCandidateView.startInAnimation();
replayAll();
candidateViewManager.update(command);
verifyAll();
resetAll();
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
numberCandidateView.setVisibility(View.GONE);
replayAll();
candidateViewManager.setNumberMode(true);
verifyAll();
resetAll();
numberCandidateView.update(command);
numberCandidateView.startInAnimation();
replayAll();
candidateViewManager.update(command);
verifyAll();
resetAll();
keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
keyboardCandidateView.setVisibility(View.GONE);
replayAll();
candidateViewManager.setNumberMode(false);
verifyAll();
}
}
}