| Index: chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9d107b1dc4fd4cd6d3652ddc3854ebc79e26d8b2
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java
|
| @@ -0,0 +1,198 @@
|
| +// Copyright 2015 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.infobar;
|
| +
|
| +import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_APART;
|
| +import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_END;
|
| +import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_START;
|
| +
|
| +import android.content.Context;
|
| +import android.test.InstrumentationTestCase;
|
| +import android.test.MoreAsserts;
|
| +import android.test.UiThreadTest;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.view.View;
|
| +import android.view.View.MeasureSpec;
|
| +import android.view.ViewGroup.LayoutParams;
|
| +import android.widget.Space;
|
| +
|
| +import org.chromium.chrome.R;
|
| +
|
| +/**
|
| + * Tests for InfoBarDualControlLayout.
|
| + */
|
| +public class InfoBarDualControlLayoutTest extends InstrumentationTestCase {
|
| + private static final int PRIMARY_HEIGHT = 16;
|
| + private static final int SECONDARY_HEIGHT = 8;
|
| + private static final int STACKED_MARGIN = 4;
|
| +
|
| + private int mMaxInfoBarWidth;
|
| + private int mTinyControlWidth;
|
| + private Context mContext;
|
| +
|
| + @Override
|
| + public void setUp() throws Exception {
|
| + super.setUp();
|
| + mContext = getInstrumentation().getTargetContext();
|
| + mContext.setTheme(R.style.MainTheme);
|
| + mMaxInfoBarWidth = mContext.getResources().getDimensionPixelSize(R.dimen.infobar_max_width);
|
| + mTinyControlWidth = mMaxInfoBarWidth / 4;
|
| + }
|
| +
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testAlignSideBySide() {
|
| + runLayoutTest(ALIGN_START, false, false);
|
| + runLayoutTest(ALIGN_START, false, true);
|
| + runLayoutTest(ALIGN_START, true, false);
|
| + runLayoutTest(ALIGN_START, true, true);
|
| +
|
| + runLayoutTest(ALIGN_APART, false, false);
|
| + runLayoutTest(ALIGN_APART, false, true);
|
| + runLayoutTest(ALIGN_APART, true, false);
|
| + runLayoutTest(ALIGN_APART, true, true);
|
| +
|
| + runLayoutTest(ALIGN_END, false, false);
|
| + runLayoutTest(ALIGN_END, false, true);
|
| + runLayoutTest(ALIGN_END, true, false);
|
| + runLayoutTest(ALIGN_END, true, true);
|
| + }
|
| +
|
| + /** Lays out two controls that fit on the same line. */
|
| + private void runLayoutTest(int alignment, boolean isRtl, boolean addSecondView) {
|
| + InfoBarDualControlLayout layout = new InfoBarDualControlLayout(mContext, null);
|
| + layout.setAlignment(alignment);
|
| + layout.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
|
| + layout.setLayoutParams(
|
| + new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
| +
|
| + View primary = new Space(mContext);
|
| + primary.setMinimumWidth(mTinyControlWidth);
|
| + primary.setMinimumHeight(PRIMARY_HEIGHT);
|
| + layout.addView(primary);
|
| +
|
| + View secondary = null;
|
| + if (addSecondView) {
|
| + secondary = new Space(mContext);
|
| + secondary.setMinimumWidth(mTinyControlWidth);
|
| + secondary.setMinimumHeight(SECONDARY_HEIGHT);
|
| + layout.addView(secondary);
|
| + }
|
| +
|
| + // Trigger the measurement & layout algorithms.
|
| + int parentWidthSpec = MeasureSpec.makeMeasureSpec(mMaxInfoBarWidth, MeasureSpec.EXACTLY);
|
| + int parentHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
|
| + layout.measure(parentWidthSpec, parentHeightSpec);
|
| + layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
|
| +
|
| + // Confirm that the primary View is in the correct place.
|
| + if ((isRtl && alignment == ALIGN_START)
|
| + || (!isRtl && (alignment == ALIGN_APART || alignment == ALIGN_END))) {
|
| + assertEquals("Primary should be on the right.", mMaxInfoBarWidth, primary.getRight());
|
| + } else {
|
| + assertEquals("Primary should be on the left.", 0, primary.getLeft());
|
| + }
|
| + assertEquals(mTinyControlWidth, primary.getMeasuredWidth());
|
| + assertEquals(PRIMARY_HEIGHT, primary.getMeasuredHeight());
|
| + MoreAsserts.assertNotEqual(primary.getLeft(), primary.getRight());
|
| +
|
| + // Confirm that the secondary View is in the correct place.
|
| + if (secondary != null) {
|
| + assertEquals(mTinyControlWidth, secondary.getMeasuredWidth());
|
| + assertEquals(SECONDARY_HEIGHT, secondary.getMeasuredHeight());
|
| + MoreAsserts.assertNotEqual(secondary.getLeft(), secondary.getRight());
|
| + if (alignment == ALIGN_START) {
|
| + if (isRtl) {
|
| + // Secondary View is immediately to the left of the parent.
|
| + assertTrue(secondary.getRight() < primary.getLeft());
|
| + MoreAsserts.assertNotEqual(0, secondary.getLeft());
|
| + } else {
|
| + // Secondary View is immediately to the right of the parent.
|
| + assertTrue(primary.getRight() < secondary.getLeft());
|
| + MoreAsserts.assertNotEqual(mMaxInfoBarWidth, secondary.getRight());
|
| + }
|
| + } else if (alignment == ALIGN_APART) {
|
| + if (isRtl) {
|
| + // Secondary View is on the far right.
|
| + assertTrue(primary.getRight() < secondary.getLeft());
|
| + assertEquals(mMaxInfoBarWidth, secondary.getRight());
|
| + } else {
|
| + // Secondary View is on the far left.
|
| + assertTrue(secondary.getRight() < primary.getLeft());
|
| + assertEquals(0, secondary.getLeft());
|
| + }
|
| + } else {
|
| + assertEquals(ALIGN_END, alignment);
|
| + if (isRtl) {
|
| + // Secondary View is immediately to the right of the parent.
|
| + assertTrue(primary.getRight() < secondary.getLeft());
|
| + MoreAsserts.assertNotEqual(mMaxInfoBarWidth, secondary.getRight());
|
| + } else {
|
| + // Secondary View is immediately to the left of the parent.
|
| + assertTrue(secondary.getRight() < primary.getLeft());
|
| + MoreAsserts.assertNotEqual(0, secondary.getLeft());
|
| + }
|
| + }
|
| +
|
| + // Confirm that the secondary View is centered with respect to the first.
|
| + int primaryCenter = (primary.getTop() + primary.getBottom()) / 2;
|
| + int secondaryCenter = (secondary.getTop() + secondary.getBottom()) / 2;
|
| + assertEquals(primaryCenter, secondaryCenter);
|
| + }
|
| +
|
| + assertEquals(layout.getMeasuredHeight(), primary.getMeasuredHeight());
|
| + }
|
| +
|
| + @SmallTest
|
| + @UiThreadTest
|
| + public void testStacked() {
|
| + runStackedLayoutTest(ALIGN_START, false);
|
| + runStackedLayoutTest(ALIGN_START, true);
|
| + runStackedLayoutTest(ALIGN_APART, false);
|
| + runStackedLayoutTest(ALIGN_APART, true);
|
| + runStackedLayoutTest(ALIGN_END, false);
|
| + runStackedLayoutTest(ALIGN_END, true);
|
| + }
|
| +
|
| + /** Runs a test where the controls don't fit on the same line. */
|
| + private void runStackedLayoutTest(int alignment, boolean isRtl) {
|
| + InfoBarDualControlLayout layout = new InfoBarDualControlLayout(mContext, null);
|
| + layout.setAlignment(alignment);
|
| + layout.setStackedMargin(STACKED_MARGIN);
|
| + layout.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
|
| + layout.setLayoutParams(
|
| + new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
| +
|
| + View primary = new Space(mContext);
|
| + primary.setMinimumWidth(mTinyControlWidth);
|
| + primary.setMinimumHeight(PRIMARY_HEIGHT);
|
| + layout.addView(primary);
|
| +
|
| + View secondary = new Space(mContext);
|
| + secondary.setMinimumWidth(mMaxInfoBarWidth);
|
| + secondary.setMinimumHeight(SECONDARY_HEIGHT);
|
| + layout.addView(secondary);
|
| +
|
| + // Trigger the measurement & layout algorithms.
|
| + int parentWidthSpec =
|
| + MeasureSpec.makeMeasureSpec(mMaxInfoBarWidth, MeasureSpec.AT_MOST);
|
| + int parentHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
|
| + layout.measure(parentWidthSpec, parentHeightSpec);
|
| + layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
|
| +
|
| + assertEquals(0, primary.getLeft());
|
| + assertEquals(0, secondary.getLeft());
|
| +
|
| + assertEquals(mMaxInfoBarWidth, primary.getRight());
|
| + assertEquals(mMaxInfoBarWidth, secondary.getRight());
|
| +
|
| + assertEquals(mMaxInfoBarWidth, primary.getMeasuredWidth());
|
| + assertEquals(mMaxInfoBarWidth, secondary.getMeasuredWidth());
|
| + assertEquals(mMaxInfoBarWidth, layout.getMeasuredWidth());
|
| +
|
| + assertEquals(primary.getBottom() + STACKED_MARGIN, secondary.getTop());
|
| + MoreAsserts.assertNotEqual(layout.getMeasuredHeight(), primary.getMeasuredHeight());
|
| + }
|
| +}
|
|
|