Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 049214f0 authored by Ben Murdoch's avatar Ben Murdoch
Browse files

Refactor TextViewContextMenuTest

Some improvements to the test:
 - No need to rely on creating an activity anymore, so removed.
 - Test time improved ~10x

Bug: 345709107
Flag: EXEMPT minor refactoring to test only.
Test: atest TextViewContextMenuTest

Change-Id: I95e5fa397918b97fe0a983793c6d0d9ffad41ba6
parent 66e4924d
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -1654,15 +1654,6 @@
            </intent-filter>
        </activity>

        <activity android:name="android.widget.TextViewContextMenuActivity"
                  android:screenOrientation="locked"
                  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
            </intent-filter>
        </activity>

        <activity android:name="android.animation.AnimatorSetActivity"
                  android:screenOrientation="locked"
                  android:exported="true">
+0 −30
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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 android.widget;

import android.app.Activity;
import android.os.Bundle;

import com.android.frameworks.coretests.R;

public class TextViewContextMenuActivity extends Activity {
    @Override
    public void onCreate(Bundle savedBundleInstance) {
        super.onCreate(savedBundleInstance);
        setContentView(R.layout.textview_contextmenu);
    }
}
+30 −43
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.widget;

import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
@@ -31,9 +33,9 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import android.app.Activity;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
@@ -42,15 +44,9 @@ import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.textclassifier.TextClassification;

import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;

import com.android.frameworks.coretests.R;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -59,17 +55,12 @@ import org.mockito.ArgumentCaptor;
 * TextViewTest tests {@link TextView}.
 */
@RunWith(AndroidJUnit4.class)
@MediumTest
public class TextViewContextMenuTest {
    private static final String INTENT_ACTION_MOCK_ACTION_TEXT_CLASSIFICATION =
            "android.text.coretest.textclassifiation";
    private static final String ACTION_TITLE = "ACTION_TITLE";
    private static final String ACTION_DESCRIPTION = "ACTION_DESCRIPTION";

    @Rule
    public final ActivityTestRule<TextViewContextMenuActivity> mActivityRule =
            new ActivityTestRule<>(TextViewContextMenuActivity.class);

    // Setup MenuItem mock with chaining.
    private MenuItem newMockMenuItem() {
        MenuItem mockItem = mock(MenuItem.class);
@@ -83,43 +74,39 @@ public class TextViewContextMenuTest {
        return mockItem;
    }

    private RemoteAction createRemoteAction() {
    private RemoteAction createRemoteAction(Context context) {
        Intent intent = new Intent(INTENT_ACTION_MOCK_ACTION_TEXT_CLASSIFICATION)
                .setPackage(mActivity.getPackageName());
        PendingIntent pIntent = PendingIntent.getBroadcast(mActivity, 0, intent,
                .setPackage(context.getPackageName());
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent,
                PendingIntent.FLAG_MUTABLE);
        return new RemoteAction(
                Icon.createWithResource(mActivity, android.R.drawable.btn_star),
                Icon.createWithResource(context, android.R.drawable.btn_star),
                ACTION_TITLE, ACTION_DESCRIPTION, pIntent);
    }

    private Activity mActivity;
    private SelectionActionModeHelper mMockHelper;
    private Editor.AssistantCallbackHelper mCallbackHelper;

    @Before
    public void setUp() {
        mActivity = mActivityRule.getActivity();
        EditText et = mActivity.findViewById(R.id.editText);

        mMockHelper = mock(SelectionActionModeHelper.class);
        mCallbackHelper = et.getEditorForTesting().new AssistantCallbackHelper(mMockHelper);
    }

    @UiThreadTest
    @Test
    public void testNoMenuInteraction_noTextClassification() {
        when(mMockHelper.getTextClassification()).thenReturn(null);
        ContextMenu menu = mock(ContextMenu.class);
        mCallbackHelper.updateAssistMenuItems(menu, null);
        EditText et = new EditText(getInstrumentation().getContext());
        Editor.AssistantCallbackHelper cbh =
                et.getEditorForTesting().new AssistantCallbackHelper(mMockHelper);
        cbh.updateAssistMenuItems(menu, null);
        verifyNoMoreInteractions(menu);
    }

    @UiThreadTest
    @Test
    public void testAddMenuForTextClassification() {
        // Setup
        RemoteAction action = createRemoteAction();
        Context context = getInstrumentation().getContext();
        RemoteAction action = createRemoteAction(context);
        TextClassification classification = new TextClassification.Builder()
                .addAction(action).build();
        when(mMockHelper.getTextClassification()).thenReturn(classification);
@@ -129,7 +116,10 @@ public class TextViewContextMenuTest {
        when(menu.add(anyInt(), anyInt(), anyInt(), any())).thenReturn(mockMenuItem);

        // Execute
        mCallbackHelper.updateAssistMenuItems(menu, null);
        EditText et = new EditText(context);
        Editor.AssistantCallbackHelper cbh =
                et.getEditorForTesting().new AssistantCallbackHelper(mMockHelper);
        cbh.updateAssistMenuItems(menu, null);

        // Verify
        ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(Integer.class);
@@ -142,14 +132,14 @@ public class TextViewContextMenuTest {
        verify(mockMenuItem, times(1)).setContentDescription(eq(ACTION_DESCRIPTION));
    }

    @UiThreadTest
    @Test
    public void testAddMenuForLegacyTextClassification() {
        // Setup
        Context context = getInstrumentation().getContext();
        Intent intent = new Intent(INTENT_ACTION_MOCK_ACTION_TEXT_CLASSIFICATION)
                .setPackage(mActivity.getPackageName());
                .setPackage(context.getPackageName());
        TextClassification classification = new TextClassification.Builder()
                .setIcon(mActivity.getResources().getDrawable(android.R.drawable.star_on))
                .setIcon(context.getResources().getDrawable(android.R.drawable.star_on))
                .setLabel(ACTION_TITLE)
                .setIntent(intent)
                .build();
@@ -160,7 +150,10 @@ public class TextViewContextMenuTest {
        when(menu.add(anyInt(), anyInt(), anyInt(), any())).thenReturn(mockMenuItem);

        // Execute
        mCallbackHelper.updateAssistMenuItems(menu, null);
        EditText et = new EditText(context);
        Editor.AssistantCallbackHelper cbh =
                et.getEditorForTesting().new AssistantCallbackHelper(mMockHelper);
        cbh.updateAssistMenuItems(menu, null);

        // Verify
        ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(Integer.class);
@@ -172,7 +165,6 @@ public class TextViewContextMenuTest {
        assertThat(titleCaptor.getValue().toString()).isEqualTo(ACTION_TITLE);
    }

    @UiThreadTest
    @Test
    public void testAdjustIconSpaces() {
        GradientDrawable gd = new GradientDrawable();
@@ -195,9 +187,8 @@ public class TextViewContextMenuTest {
        when(menu.getItem(1)).thenReturn(mockNoIconMenu);
        when(menu.getItem(2)).thenReturn(mockNoIconMenu2);


        // Execute the test method
        EditText et = mActivity.findViewById(R.id.editText);
        EditText et = new EditText(getInstrumentation().getContext());
        Editor editor = et.getEditorForTesting();
        editor.adjustIconSpacing(menu);

@@ -217,7 +208,6 @@ public class TextViewContextMenuTest {
        assertThat(paddingDrawable2).isSameInstanceAs(paddingDrawable);
    }

    @UiThreadTest
    @Test
    public void testAdjustIconSpacesNoIconCase() {
        // Setup mocks
@@ -234,7 +224,7 @@ public class TextViewContextMenuTest {
        when(menu.getItem(1)).thenReturn(mockNoIconMenu2);

        // Execute the test method
        EditText et = mActivity.findViewById(R.id.editText);
        EditText et = new EditText(getInstrumentation().getContext());
        Editor editor = et.getEditorForTesting();
        editor.adjustIconSpacing(menu);

@@ -243,7 +233,6 @@ public class TextViewContextMenuTest {
        verify(mockNoIconMenu2, times(0)).setIcon(any());
    }

    @UiThreadTest
    @Test
    public void testAutofillMenuItemEnabledWhenNoTextSelected() {
        ContextMenu menu = mock(ContextMenu.class);
@@ -253,18 +242,17 @@ public class TextViewContextMenuTest {
        when(menu.add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt()))
                .thenReturn(mockAutofillMenuItem);

        EditText et = spy(mActivity.findViewById(R.id.editText));
        EditText et = spy(new EditText(getInstrumentation().getContext()));
        doReturn(true).when(et).canRequestAutofill();
        doReturn(null).when(et).getSelectedText();

        Editor editor = et.getEditorForTesting();
        editor.onCreateContextMenu(menu);
        Editor editor = new Editor(et);
        editor.setTextContextMenuItems(menu);

        verify(menu).add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt());
        verify(mockAutofillMenuItem).setEnabled(true);
    }

    @UiThreadTest
    @Test
    public void testAutofillMenuItemNotEnabledWhenTextSelected() {
        ContextMenu menu = mock(ContextMenu.class);
@@ -274,7 +262,7 @@ public class TextViewContextMenuTest {
        when(menu.add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt()))
                .thenReturn(mockAutofillMenuItem);

        EditText et = spy(mActivity.findViewById(R.id.editText));
        EditText et = spy(new EditText(getInstrumentation().getContext()));
        doReturn(true).when(et).canRequestAutofill();
        doReturn("test").when(et).getSelectedText();
        Editor editor = new Editor(et);
@@ -283,5 +271,4 @@ public class TextViewContextMenuTest {
        verify(menu).add(anyInt(), eq(TextView.ID_AUTOFILL), anyInt(), anyInt());
        verify(mockAutofillMenuItem).setEnabled(false);
    }

}