/**
 * Copyright (c) 2014-present, Facebook, Inc.
 * All rights reserved.
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

package com.facebook.react.tests;

import android.widget.ScrollView;

import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.testing.ReactAppInstrumentationTestCase;
import com.facebook.react.testing.SingleTouchGestureGenerator;

/**
 * Test case to verify that JSResponder flow work correctly.
 *
 * In a single test case scenario we have a view with pan gesture recognizer containing a scrollview
 * We werify that by vertical drags affects a scrollview while horizontal drags are suppose to
 * be recognized by pan responder and setJSResponder should be triggered resulting in scrollview
 * events being intercepted.
 */
public class JSResponderTestCase extends ReactAppInstrumentationTestCase {

  @Override
  protected String getReactApplicationKeyUnderTest() {
    return "JSResponderTestApp";
  }

  public void testResponderLocksScrollView() {
    ScrollView scrollView = getViewByTestId("scroll_view");
    assertNotNull(scrollView);
    assertEquals(0, scrollView.getScrollY());

    float inpx40dp = PixelUtil.toPixelFromDIP(40f);
    float inpx100dp = PixelUtil.toPixelFromDIP(100f);

    SingleTouchGestureGenerator gestureGenerator = createGestureGenerator();

    gestureGenerator
        .startGesture(30, 30 + inpx100dp)
        .dragTo(30 + inpx40dp, 30, 10, 1200)
        .endGesture(180, 100);

    waitForBridgeAndUIIdle();

    assertTrue("Expected to scroll by at least 80 dp", scrollView.getScrollY() >= inpx100dp * .8f);

    int previousScroll = scrollView.getScrollY();

    gestureGenerator
        .startGesture(30, 30 + inpx100dp)
        .dragTo(30 + inpx40dp, 30 + inpx100dp, 10, 1200);

    waitForBridgeAndUIIdle();

    gestureGenerator
        .dragTo(30 + inpx40dp, 30, 10, 1200)
        .endGesture();

    waitForBridgeAndUIIdle();
    assertEquals("Expected not to scroll", scrollView.getScrollY(), previousScroll);

  }

}
