/*
 * Copyright (C) 2016 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.cts;

import static android.view.Gravity.CENTER;
import static android.view.Gravity.LEFT;
import static android.view.Gravity.NO_GRAVITY;
import static android.view.Gravity.RIGHT;
import static android.view.View.TEXT_ALIGNMENT_INHERIT;
import static android.widget.TextView.TEXT_ALIGNMENT_TEXT_END;
import static android.widget.TextView.TEXT_ALIGNMENT_TEXT_START;
import static android.widget.TextView.TEXT_ALIGNMENT_VIEW_END;
import static android.widget.TextView.TEXT_ALIGNMENT_VIEW_START;

import static org.junit.Assert.assertEquals;

import android.app.Activity;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;

import com.android.compatibility.common.util.PollingCheck;
import com.android.compatibility.common.util.WidgetTestUtils;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@MediumTest
@RunWith(AndroidJUnit4.class)
public class TextViewFadingEdgeTest {
    private Activity mActivity;

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

    public static final float DELTA = 0.01f;
    private static final String LONG_RTL_STRING = "مرحبا الروبوت مرحبا الروبوت مرحبا الروبوت";
    private static final String LONG_LTR_STRING = "start start1 middle middle1 end end1";
    private static final String SHORT_RTL_STRING = "ت";
    private static final String SHORT_LTR_STRING = "s";
    public static final int ANY_PADDING = 20;
    public static final int ANY_FADE_LENGTH = 20;
    public static final int TEXT_SIZE = 20;
    public static final int WIDTH = 100;

    private static final TestCase[] TEST_DATA = {
            // no fade - fading disabled
            new TestCase("Should not fade when text:empty, fading:disabled",
                    null, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:LTR, fading:disabled",
                    SHORT_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:RTL, fading:disabled",
                    SHORT_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:long , dir:LTR, fading:disabled",
                    LONG_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:long , dir:RTL, fading:disabled",
                    LONG_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:long, dir:LTR, scroll:middle",
                    LONG_LTR_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 0f, 0f),
            new TestCase("Should not fade when text:long, dir:RTL, scroll:middle",
                    LONG_RTL_STRING, false, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 0f, 0f),

            // no fade - text is shorter than view width
            new TestCase("Should not fade when text:empty",
                    null, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:LTR",
                    SHORT_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:LTR, gravity:center",
                    SHORT_LTR_STRING, true, CENTER, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:RTL",
                    SHORT_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 0f),
            new TestCase("Should not fade when text:short, dir:RTL, gravity:center",
                    SHORT_RTL_STRING, true, CENTER, TEXT_ALIGNMENT_INHERIT, 0f, 0f),

            // left fade - LTR
            new TestCase("Should fade left when text:long, dir:LTR, gravity:right",
                    LONG_LTR_STRING, true, RIGHT, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
            new TestCase("Should fade left when text:long, dir:LTR, textAlignment:textEnd",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_END, 1f, 0f),
            new TestCase("Should fade left when text:long, dir:LTR, textAlignment:viewEnd",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_END, 1f, 0f),

            // left fade - RTL
            new TestCase("Should fade left when text:long, dir:RTL",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
            new TestCase("Should fade left when text:long, dir:RTL, gravity:right",
                    LONG_RTL_STRING, true, RIGHT, TEXT_ALIGNMENT_INHERIT, 1f, 0f),
            new TestCase("Should fade left when text:long, dir:RTL, textAlignment:textStart",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_START, 1f, 0f),
            new TestCase("Should fade left when text:long, dir:RTL, textAlignment:viewEnd",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_END, 1f, 0f),

            // right fade - LTR
            new TestCase("Should fade right when text:long, dir:LTR",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
            new TestCase("Should fade right when text:long, dir:LTR, textAlignment:textStart",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_START, 0f, 1f),
            new TestCase("Should fade right when text:long, dir:LTR, gravity:left",
                    LONG_LTR_STRING, true, LEFT, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
            new TestCase("Should fade right when text:long, dir:LTR, textAlignment:viewStart",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_START, 0f, 1f),

            // right fade - RTL
            new TestCase("Should fade right when text:long, dir:RTL, gravity:left",
                    LONG_RTL_STRING, true, LEFT, TEXT_ALIGNMENT_INHERIT, 0f, 1f),
            new TestCase("Should fade right when text:long, dir:RTL, textAlignment:viewStart",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_VIEW_START, 0f, 1f),
            new TestCase("Should fade right when text:long, dir:RTL, textAlignment:textEnd",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_TEXT_END, 0f, 1f),

            // left and right fade
            new TestCase("Should fade both when text:long, dir:LTR, scroll:middle",
                    LONG_LTR_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 1f, 1f),
            new TestCase("Should fade both when text:long, dir:RTL, scroll:middle",
                    LONG_RTL_STRING, true, NO_GRAVITY, TEXT_ALIGNMENT_INHERIT, true, 1f, 1f)
    };

    @Before
    public void setup() {
        mActivity = mActivityRule.getActivity();
        PollingCheck.waitFor(mActivity::hasWindowFocus);
    }

    @Test
    public void testFadingEdge() throws Throwable {
        for (TestCase data : TEST_DATA) {
            MockTextView textView = createTextView(data.text, data.horizontalFadingEnabled,
                    data.gravity, data.textAlignment, data.scrollToMiddle);

            assertEquals(data.errorMsg,
                    data.expectationLeft, textView.getLeftFadingEdgeStrength(), DELTA);
            assertEquals(data.errorMsg,
                    data.expectationRight, textView.getRightFadingEdgeStrength(), DELTA);
        }
    }

    private final MockTextView createTextView(String text, boolean horizontalFadingEnabled,
            int gravity, int textAlignment, boolean scrollToMiddle) throws Throwable {
        final MockTextView textView = new MockTextView(mActivity);
        textView.setSingleLine(true);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXT_SIZE);
        textView.setPadding(ANY_PADDING, ANY_PADDING, ANY_PADDING, ANY_PADDING);
        textView.setFadingEdgeLength(ANY_FADE_LENGTH);
        textView.setLayoutParams(new ViewGroup.LayoutParams(WIDTH,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        textView.setHorizontalFadingEdgeEnabled(horizontalFadingEnabled);
        textView.setText(text);
        textView.setGravity(gravity);
        textView.setTextAlignment(textAlignment);

        final FrameLayout layout = new FrameLayout(mActivity);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        layout.setLayoutParams(layoutParams);
        layout.addView(textView);

        WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, layout,
                () -> mActivity.setContentView(layout));
        if (scrollToMiddle) {
            WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, textView, () -> {
                float lineMid = (textView.getLayout().getLineLeft(0) +
                        textView.getLayout().getLineRight(0)) / 2;
                int scrollPosition = (int) lineMid;
                textView.setScrollX(scrollPosition);
            });
        }
        return textView;
    }

    private static class TestCase {
        final String errorMsg;
        final String text;
        final boolean horizontalFadingEnabled;
        final int gravity;
        final int textAlignment;
        final float expectationLeft;
        final float expectationRight;
        final boolean scrollToMiddle;

        TestCase(String errorMsg, String text, boolean horizontalFadingEnabled, int gravity,
                 int textAlignment, boolean scrollToMiddle, float expectationLeft,
                 float expectationRight) {
            this.errorMsg = errorMsg;
            this.text = text;
            this.horizontalFadingEnabled = horizontalFadingEnabled;
            this.gravity = gravity;
            this.textAlignment = textAlignment;
            this.expectationLeft = expectationLeft;
            this.expectationRight = expectationRight;
            this.scrollToMiddle = scrollToMiddle;
        }

        TestCase(String errorMsg, String text, boolean horizontalFadingEnabled, int gravity,
                 int textAlignment, float expectationLeft, float expectationRight) {
            this(errorMsg, text, horizontalFadingEnabled, gravity, textAlignment, false,
                    expectationLeft, expectationRight);
        }
    }
}
