Commit 6b6777d8 authored by Lijin Shen's avatar Lijin Shen Committed by Commit Bot

Add instrument tests for Language settings and List menu button

Add tests for language setting screen to ensure items are correctly
added / removed and "offer to translate" can be selected.

Add a render test for list menu button.

Bug: 1057051
Change-Id: I4ccc141a55a19bed2ec64ffa966f2440e56be4d8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2102078
Commit-Queue: Lijin Shen <lazzzis@google.com>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#752664}
parent 1dc4903d
......@@ -428,6 +428,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/settings/SettingsActivityTest.java",
"javatests/src/org/chromium/chrome/browser/settings/homepage/HomepageSettingsFragmentTest.java",
"javatests/src/org/chromium/chrome/browser/settings/homepage/HomepageSettingsFragmentWithEditorTest.java",
"javatests/src/org/chromium/chrome/browser/settings/language/LanguageSettingsTest.java",
"javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
"javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java",
"javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java",
......
......@@ -17,6 +17,7 @@ import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
......@@ -219,4 +220,9 @@ public class LanguageListBaseAdapter extends DragReorderableListAdapter<Language
protected boolean isPassivelyDraggable(ViewHolder viewHolder) {
return viewHolder instanceof LanguageRowViewHolder;
}
@VisibleForTesting
public List<LanguageItem> getLanguageItemList() {
return mElements;
}
}
// Copyright 2020 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.settings.language;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.hasSibling;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.core.AllOf.allOf;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.contrib.RecyclerViewActions;
import android.view.View;
import android.widget.ImageView;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.language.settings.LanguageItem;
import org.chromium.chrome.browser.language.settings.LanguageListBaseAdapter;
import org.chromium.chrome.browser.language.settings.LanguageSettings;
import org.chromium.chrome.browser.settings.SettingsActivity;
import org.chromium.chrome.browser.settings.SettingsActivityTest;
import org.chromium.chrome.browser.translate.TranslateBridge;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.RecyclerViewTestUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.UiRestriction;
/**
* Tests for the "Languages" settings screen.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
// clang-format off
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
public class LanguageSettingsTest {
// clang-format on
private SettingsActivity mActivity;
@Before
public void setUp() throws Exception {
mActivity = SettingsActivityTest.startSettingsActivity(
InstrumentationRegistry.getInstrumentation(), LanguageSettings.class.getName());
}
private void addLanguage() {
onView(withId(R.id.add_language)).check(matches(isDisplayed()));
RecyclerView acceptLanguageList = mActivity.findViewById(R.id.language_list);
int originalAcceptLanguageCount = acceptLanguageList.getChildCount();
// Disable animation to reduce flakiness.
acceptLanguageList.setItemAnimator(null);
// Enter "Add language" screen.
onView(withId(R.id.add_language)).perform(click());
onView(withId(R.id.language_list)).check(matches(isDisplayed()));
onView(withId(R.id.language_list))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
// Back to "Language" screen.
Assert.assertEquals(mActivity.getString(R.string.language_settings), mActivity.getTitle());
acceptLanguageList = mActivity.findViewById(R.id.language_list);
Assert.assertEquals("Failed to add a new language.", originalAcceptLanguageCount + 1,
acceptLanguageList.getChildCount());
}
@Test
@SmallTest
public void testRemoveLanguage() {
RecyclerView acceptLanguageList = mActivity.findViewById(R.id.language_list);
int originalAcceptLanguageCount = acceptLanguageList.getChildCount();
// Enter "Add language" screen.
addLanguage();
View newLangView =
acceptLanguageList.findViewHolderForAdapterPosition(originalAcceptLanguageCount)
.itemView;
// Toggle popup menu to remove a language.
TestThreadUtils.runOnUiThreadBlocking(
() -> { newLangView.findViewById(R.id.more).performClick(); });
onView(withText(R.string.remove)).perform(click());
Assert.assertEquals("The language is not removed.", originalAcceptLanguageCount,
acceptLanguageList.getChildCount());
}
@Test
@SmallTest
public void testToggleOfferToTranslate() {
RecyclerView acceptLanguageList = mActivity.findViewById(R.id.language_list);
int originalAcceptLanguageCount = acceptLanguageList.getChildCount();
// Enter "Add language" screen.
addLanguage();
Assert.assertEquals(mActivity.getString(R.string.language_settings), mActivity.getTitle());
acceptLanguageList = mActivity.findViewById(R.id.language_list);
Assert.assertEquals("Failed to add a new language.", originalAcceptLanguageCount + 1,
acceptLanguageList.getChildCount());
View newLangView =
acceptLanguageList.findViewHolderForAdapterPosition(originalAcceptLanguageCount)
.itemView;
LanguageItem languageItem = ((LanguageListBaseAdapter) acceptLanguageList.getAdapter())
.getLanguageItemList()
.get(originalAcceptLanguageCount);
// Turn on "offer to translate".
TestThreadUtils.runOnUiThreadBlocking(
() -> { newLangView.findViewById(R.id.more).performClick(); });
onView(withText(R.string.languages_item_option_offer_to_translate)).perform(click());
// Verify that the "offer to translate" is on.
TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertFalse("Language should not be blocked when 'offer to translate' is on.",
TranslateBridge.isBlockedLanguage(languageItem.getCode()));
});
RecyclerViewTestUtils.waitForStableRecyclerView(acceptLanguageList);
// Open popup menu to verify the drawable (blue tick) is visible.
TestThreadUtils.runOnUiThreadBlocking(
() -> { newLangView.findViewById(R.id.more).performClick(); });
onView(withText(R.string.languages_item_option_offer_to_translate))
.check(matches(isDisplayed()));
onView(allOf(hasSibling(withText(R.string.languages_item_option_offer_to_translate)),
withId(R.id.menu_item_end_icon)))
.check((v, e) -> {
Assert.assertNotNull(
"There should exist an icon next to the text to indicate 'offer to translate' is on",
((ImageView) v).getDrawable());
});
// Turn off "offer to translate".
onView(withText(R.string.languages_item_option_offer_to_translate)).perform(click());
TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertTrue("Language should be blocked when 'offer to translate' is off.",
TranslateBridge.isBlockedLanguage(languageItem.getCode()));
});
// Open popup menu to verify the drawable (blue tick) is invisible.
TestThreadUtils.runOnUiThreadBlocking(
() -> { newLangView.findViewById(R.id.more).performClick(); });
onView(allOf(hasSibling(withText(R.string.languages_item_option_offer_to_translate)),
withId(R.id.menu_item_end_icon)))
.check((v, e) -> { Assert.assertNull(((ImageView) v).getDrawable()); });
// Reset states by toggling popup menu to remove a language.
TestThreadUtils.runOnUiThreadBlocking(
() -> { newLangView.findViewById(R.id.more).performClick(); });
onView(withText(R.string.remove)).perform(click());
}
}
......@@ -198,6 +198,7 @@ android_library("javatests") {
"java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditTextTest.java",
"java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java",
"java/src/org/chromium/components/browser_ui/widget/highlight/ViewHighlighterTest.java",
"java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuRenderTest.java",
"java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java",
"java/src/org/chromium/components/browser_ui/widget/text/ChromeTextInputLayoutRenderTest.java",
]
......
......@@ -28,4 +28,11 @@
android:singleLine="false"
android:textAppearance="@style/TextAppearance.ListMenuItem" />
<org.chromium.ui.widget.ChromeImageView
android:id="@+id/menu_item_end_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:tint="@color/default_icon_color_secondary" />
</LinearLayout>
......@@ -6,7 +6,6 @@ package org.chromium.components.browser_ui.widget.listmenu;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
......@@ -25,7 +24,8 @@ import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey;
public class ListMenuItemViewBinder {
public static void binder(PropertyModel model, View view, PropertyKey propertyKey) {
TextView textView = view.findViewById(R.id.menu_item_text);
ImageView imageView = view.findViewById(R.id.menu_item_icon);
ImageView startIcon = view.findViewById(R.id.menu_item_icon);
ImageView endIcon = view.findViewById(R.id.menu_item_end_icon);
if (propertyKey == ListMenuItemProperties.TITLE_ID) {
textView.setText(model.get(ListMenuItemProperties.TITLE_ID));
} else if (propertyKey == ListMenuItemProperties.START_ICON_ID
......@@ -33,28 +33,34 @@ public class ListMenuItemViewBinder {
int id = model.get((ReadableIntPropertyKey) propertyKey);
Drawable drawable =
id == 0 ? null : AppCompatResources.getDrawable(view.getContext(), id);
imageView.setImageDrawable(drawable);
if (drawable != null) {
if (propertyKey == ListMenuItemProperties.START_ICON_ID) {
// need more space between the start and the icon if icon is on the start.
startIcon.setImageDrawable(drawable);
textView.setPaddingRelative(
view.getResources().getDimensionPixelOffset(R.dimen.menu_padding_start),
textView.getPaddingTop(), textView.getPaddingEnd(),
textView.getPaddingBottom());
startIcon.setVisibility(View.VISIBLE);
endIcon.setVisibility(View.GONE);
} else {
// Move to the end.
ViewGroup layout = (ViewGroup) view;
layout.removeView(imageView);
layout.addView(imageView);
endIcon.setImageDrawable(drawable);
startIcon.setVisibility(View.GONE);
endIcon.setVisibility(View.VISIBLE);
}
}
} else if (propertyKey == ListMenuItemProperties.TINT_COLOR_ID) {
ApiCompatibilityUtils.setImageTintList(imageView,
ApiCompatibilityUtils.setImageTintList(startIcon,
ContextCompat.getColorStateList(
view.getContext(), model.get(ListMenuItemProperties.TINT_COLOR_ID)));
ApiCompatibilityUtils.setImageTintList(endIcon,
ContextCompat.getColorStateList(
view.getContext(), model.get(ListMenuItemProperties.TINT_COLOR_ID)));
} else if (propertyKey == ListMenuItemProperties.ENABLED) {
textView.setEnabled(model.get(ListMenuItemProperties.ENABLED));
imageView.setEnabled(model.get(ListMenuItemProperties.ENABLED));
startIcon.setEnabled(model.get(ListMenuItemProperties.ENABLED));
endIcon.setEnabled(model.get(ListMenuItemProperties.ENABLED));
}
}
}
// Copyright 2020 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.components.browser_ui.widget.listmenu;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.app.Activity;
import android.view.View;
import android.widget.LinearLayout.LayoutParams;
import androidx.test.filters.MediumTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.test.params.BaseJUnit4RunnerDelegate;
import org.chromium.base.test.params.ParameterAnnotations;
import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
import org.chromium.base.test.params.ParameterSet;
import org.chromium.base.test.params.ParameterizedRunner;
import org.chromium.base.test.util.Feature;
import org.chromium.components.browser_ui.widget.test.R;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.test.util.DummyUiActivityTestCase;
import org.chromium.ui.test.util.NightModeTestUtils;
import org.chromium.ui.test.util.RenderTestRule;
import java.io.IOException;
import java.util.List;
/**
* Render tests for {@link BasicListMenu}.
*/
@RunWith(ParameterizedRunner.class)
@UseRunnerDelegate(BaseJUnit4RunnerDelegate.class)
public class ListMenuRenderTest extends DummyUiActivityTestCase {
@ParameterAnnotations.ClassParameter
private static List<ParameterSet> sClassParams =
new NightModeTestUtils.NightModeParams().getParameters();
@Rule
public RenderTestRule mRenderTestRule =
new RenderTestRule("chrome/test/data/android/render_tests");
private View mView;
public ListMenuRenderTest(boolean nightModeEnabled) {
NightModeTestUtils.setUpNightModeForDummyUiActivity(nightModeEnabled);
mRenderTestRule.setNightModeEnabled(nightModeEnabled);
}
@Override
public void setUpTest() throws Exception {
super.setUpTest();
TestThreadUtils.runOnUiThreadBlocking(() -> {
Activity activity = getActivity();
ModelList data = new ModelList();
data.add(BasicListMenu.buildMenuListItem(
R.string.test_primary_1, 0, R.drawable.ic_check_googblue_24dp));
data.add(BasicListMenu.buildMenuListItem(
R.string.test_primary_1, 0, R.drawable.ic_check_googblue_24dp, false));
data.add(BasicListMenu.buildMenuListItemWithEndIcon(
R.string.test_primary_1, 0, R.drawable.ic_check_googblue_24dp, true));
data.add(BasicListMenu.buildMenuListItemWithEndIcon(
R.string.test_primary_1, 0, R.drawable.ic_check_googblue_24dp, false));
data.add(BasicListMenu.buildMenuListItem(R.string.test_primary_1, 0, 0));
data.add(BasicListMenu.buildMenuListItem(R.string.test_primary_1, 0, 0, false));
data.add(BasicListMenu.buildMenuDivider());
BasicListMenu listMenu = new BasicListMenu(activity, data, null);
mView = listMenu.getContentView();
mView.setBackground(ApiCompatibilityUtils.getDrawable(
activity.getResources(), R.drawable.popup_bg_tinted));
int width = activity.getResources().getDimensionPixelSize(R.dimen.list_menu_width);
activity.setContentView(mView, new LayoutParams(width, WRAP_CONTENT));
});
}
@Override
public void tearDownTest() throws Exception {
NightModeTestUtils.tearDownNightModeForDummyUiActivity();
super.tearDownTest();
}
@Test
@MediumTest
@Feature({"RenderTest"})
public void testRender_BasicListMenu() throws IOException {
mRenderTestRule.render(mView, "basic_list_menu");
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment