| Index: chrome/android/junit/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
 | 
| diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..499c6305cf0579d11051642a1dc443953b920d9d
 | 
| --- /dev/null
 | 
| +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
 | 
| @@ -0,0 +1,125 @@
 | 
| +// Copyright 2017 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +package org.chromium.chrome.browser.omnibox;
 | 
| +
 | 
| +import static org.junit.Assert.assertEquals;
 | 
| +import static org.junit.Assert.assertFalse;
 | 
| +import static org.junit.Assert.assertNotNull;
 | 
| +import static org.junit.Assert.assertTrue;
 | 
| +import static org.mockito.Mockito.inOrder;
 | 
| +import static org.mockito.Mockito.spy;
 | 
| +
 | 
| +import android.content.Context;
 | 
| +import android.text.TextUtils;
 | 
| +import android.util.AttributeSet;
 | 
| +import android.view.inputmethod.BaseInputConnection;
 | 
| +import android.view.inputmethod.InputConnection;
 | 
| +
 | 
| +import org.junit.Before;
 | 
| +import org.junit.Test;
 | 
| +import org.junit.runner.RunWith;
 | 
| +import org.mockito.InOrder;
 | 
| +import org.mockito.MockitoAnnotations;
 | 
| +import org.robolectric.RuntimeEnvironment;
 | 
| +import org.robolectric.annotation.Config;
 | 
| +import org.robolectric.shadows.ShadowLog;
 | 
| +
 | 
| +import org.chromium.base.Log;
 | 
| +import org.chromium.testing.local.LocalRobolectricTestRunner;
 | 
| +
 | 
| +/**
 | 
| + * A robolectric test for {@link AutocompleteEditText} class.
 | 
| + */
 | 
| +@RunWith(LocalRobolectricTestRunner.class)
 | 
| +@Config(manifest = Config.NONE)
 | 
| +public class AutocompleteEditTextTest {
 | 
| +    private static final String TAG = "cr_AutocompleteEdit";
 | 
| +    private static final boolean DEBUG = false;
 | 
| +
 | 
| +    private InOrder mInOrder;
 | 
| +    private AutocompleteEditText mAutocomplete;
 | 
| +    private Context mContext;
 | 
| +    private InputConnection mInputConnection;
 | 
| +    private BaseInputConnection mDummyTargetInputConnection;
 | 
| +    private AutocompleteEmbedder mEmbedder;
 | 
| +
 | 
| +    // This is needed to limit the target of inOrder#verify.
 | 
| +    private static class AutocompleteEmbedder {
 | 
| +        public void onAutocompleteTextStateChanged(boolean textDeleted, boolean updateDisplay) {
 | 
| +            if (DEBUG) Log.i(TAG, "onAutocompleteTextStateChanged");
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    private static class TestAutocompleteEditText extends AutocompleteEditText {
 | 
| +        private AutocompleteEmbedder mEmbedder;
 | 
| +
 | 
| +        public TestAutocompleteEditText(
 | 
| +                AutocompleteEmbedder embedder, Context context, AttributeSet attrs) {
 | 
| +            super(context, attrs);
 | 
| +            mEmbedder = embedder;
 | 
| +        }
 | 
| +
 | 
| +        @Override
 | 
| +        public void onAutocompleteTextStateChanged(boolean textDeleted, boolean updateDisplay) {
 | 
| +            // This function is called in super(), so mEmbedder may be null.
 | 
| +            if (mEmbedder != null) {
 | 
| +                mEmbedder.onAutocompleteTextStateChanged(textDeleted, updateDisplay);
 | 
| +            }
 | 
| +        }
 | 
| +
 | 
| +        @Override
 | 
| +        public boolean hasFocus() {
 | 
| +            return true;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    @Before
 | 
| +    public void setUp() throws Exception {
 | 
| +        ShadowLog.stream = System.out;
 | 
| +        if (DEBUG) Log.i(TAG, "setUp started.");
 | 
| +        MockitoAnnotations.initMocks(this);
 | 
| +        mContext = RuntimeEnvironment.application;
 | 
| +        mEmbedder = spy(new AutocompleteEmbedder());
 | 
| +        mAutocomplete = spy(new TestAutocompleteEditText(mEmbedder, mContext, null));
 | 
| +        assertNotNull(mAutocomplete);
 | 
| +        // Note: this cannot catch the first {@link
 | 
| +        // AutocompleteEditText#onAutocompleteTextStateChanged(boolean, boolean)}, which is caused
 | 
| +        // by View constructor's call to setText().
 | 
| +        mInOrder = inOrder(mEmbedder);
 | 
| +        mDummyTargetInputConnection = new BaseInputConnection(mAutocomplete, true);
 | 
| +        mInputConnection = mAutocomplete.createInputConnection(mDummyTargetInputConnection);
 | 
| +        assertNotNull(mInputConnection);
 | 
| +        mInOrder.verifyNoMoreInteractions();
 | 
| +        if (DEBUG) Log.i(TAG, "setUp finished.");
 | 
| +    }
 | 
| +
 | 
| +    private void assertTexts(String userText, String autocompleteText) {
 | 
| +        assertEquals(userText, mAutocomplete.getTextWithoutAutocomplete());
 | 
| +        assertEquals(userText + autocompleteText, mAutocomplete.getTextWithAutocomplete());
 | 
| +        assertEquals(autocompleteText.length(), mAutocomplete.getAutocompleteLength());
 | 
| +        assertEquals(!TextUtils.isEmpty(autocompleteText), mAutocomplete.hasAutocomplete());
 | 
| +    }
 | 
| +
 | 
| +    @Test
 | 
| +    public void testAppend_CommitText() {
 | 
| +        // Feeder should call this at the beginning.
 | 
| +        mAutocomplete.setIgnoreTextChangesForAutocomplete(false);
 | 
| +        // User types "h".
 | 
| +        assertTrue(mInputConnection.commitText("h", 1));
 | 
| +        // User types "hello".
 | 
| +        assertTrue(mInputConnection.commitText("ello", 1));
 | 
| +        mInOrder.verifyNoMoreInteractions();
 | 
| +        // The controller kicks in.
 | 
| +        mAutocomplete.setAutocompleteText("hello", " world");
 | 
| +        assertTexts("hello", " world");
 | 
| +        assertFalse(mInputConnection.beginBatchEdit());
 | 
| +        assertTrue(mInputConnection.commitText(" ", 1));
 | 
| +        mInOrder.verify(mEmbedder).onAutocompleteTextStateChanged(false, false);
 | 
| +        assertTexts("hello ", "world");
 | 
| +        assertFalse(mInputConnection.endBatchEdit());
 | 
| +        mAutocomplete.setAutocompleteText("hello ", "world");
 | 
| +        assertTexts("hello ", "world");
 | 
| +        mInOrder.verifyNoMoreInteractions();
 | 
| +    }
 | 
| +}
 | 
| 
 |