mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
(refactor): kotlinify JSPointerDispatcherTest.java (#38878)
Summary: This PR converts the java logic inside of `JSPointerDispatcherTest.java` to Kotlin as requested in https://github.com/facebook/react-native/issues/38825 We also swap `JSPointerDispatcherTest.java` for `JSPointerDispatcherTest.kt` ## Changelog: [Internal][Changed]: Convert JSPointerDispatcherTest to Kotlin Pull Request resolved: https://github.com/facebook/react-native/pull/38878 Test Plan: `./gradlew :packages:react-native:ReactAndroid:test` must pass and CI must be green ## Screenshot of Tests passing locally:  Reviewed By: rshest Differential Revision: D48189629 Pulled By: cortinico fbshipit-source-id: 92d869f690457986413bcae33a15225aa6e006be
This commit is contained in:
committed by
Facebook GitHub Bot
parent
51faa1863f
commit
5657d2d3bd
-97
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.uimanager;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.os.SystemClock;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import com.facebook.react.uimanager.events.Event;
|
||||
import com.facebook.react.uimanager.events.EventDispatcher;
|
||||
import com.facebook.react.uimanager.events.PointerEventHelper;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentMatcher;
|
||||
import org.mockito.Mockito;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class JSPointerDispatcherTest {
|
||||
|
||||
private ViewGroup mRoot;
|
||||
private JSPointerDispatcher mPointerDispatcher;
|
||||
|
||||
class EventWithName implements ArgumentMatcher<Event> {
|
||||
private String mEventName;
|
||||
|
||||
public EventWithName(String eventName) {
|
||||
mEventName = eventName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Event argument) {
|
||||
return argument.getEventName().equals(mEventName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[event with name: " + mEventName + "]";
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setupViewHierarchy() {
|
||||
Context ctx = RuntimeEnvironment.getApplication();
|
||||
mRoot = new LinearLayout(ctx);
|
||||
TextView childView = new TextView(ctx);
|
||||
childView.append("Hello, world!");
|
||||
// need > 0 ID to consider it as a react view (see
|
||||
// TouchTargetHelper::findTargetPathAndCoordinatesForTouch)
|
||||
childView.setId(100);
|
||||
mRoot.addView(childView);
|
||||
// needed for test to ensure that child has dimensions
|
||||
mRoot.measure(500, 500);
|
||||
mRoot.layout(0, 0, 500, 500);
|
||||
mPointerDispatcher = new JSPointerDispatcher(mRoot);
|
||||
}
|
||||
|
||||
private static MotionEvent createMotionEvent(int action, float x, float y) {
|
||||
long downTime = SystemClock.uptimeMillis();
|
||||
long eventTime = downTime;
|
||||
int metaState = 0; // no modifiers pressed
|
||||
|
||||
return MotionEvent.obtain(downTime, eventTime, action, x, y, metaState);
|
||||
}
|
||||
|
||||
private Rect getChildViewRectInRootCoordinates(int childIndex) {
|
||||
View child = mRoot.getChildAt(childIndex);
|
||||
Rect outRect = new Rect();
|
||||
child.getDrawingRect(outRect);
|
||||
|
||||
mRoot.offsetDescendantRectToMyCoords(child, outRect);
|
||||
|
||||
return outRect;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPointerEnter() {
|
||||
Rect childRect = getChildViewRectInRootCoordinates(0);
|
||||
MotionEvent ev =
|
||||
createMotionEvent(MotionEvent.ACTION_DOWN, childRect.centerX(), childRect.centerY());
|
||||
EventDispatcher mockDispatcher = Mockito.mock(EventDispatcher.class);
|
||||
mPointerDispatcher.handleMotionEvent(ev, mockDispatcher, false);
|
||||
Mockito.verify(mockDispatcher)
|
||||
.dispatchEvent(Mockito.argThat(new EventWithName(PointerEventHelper.POINTER_DOWN)));
|
||||
}
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.uimanager
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Rect
|
||||
import android.os.SystemClock
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import com.facebook.react.uimanager.events.Event
|
||||
import com.facebook.react.uimanager.events.EventDispatcher
|
||||
import com.facebook.react.uimanager.events.PointerEventHelper
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentMatcher
|
||||
import org.mockito.Mockito.argThat
|
||||
import org.mockito.Mockito.mock
|
||||
import org.mockito.Mockito.verify
|
||||
import org.robolectric.RobolectricTestRunner
|
||||
import org.robolectric.RuntimeEnvironment
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
class JSPointerDispatcherTest {
|
||||
|
||||
private lateinit var root: ViewGroup
|
||||
private lateinit var pointerDispatcher: JSPointerDispatcher
|
||||
|
||||
class EventWithName(private val eventName: String) : ArgumentMatcher<Event<Event<*>>> {
|
||||
override fun matches(argument: Event<Event<*>>?): Boolean = argument?.eventName == eventName
|
||||
|
||||
override fun toString(): String = "[event with name: $eventName]"
|
||||
}
|
||||
|
||||
@Before
|
||||
fun setupViewHierarchy() {
|
||||
val ctx: Context = RuntimeEnvironment.application
|
||||
root = LinearLayout(ctx)
|
||||
val childView = TextView(ctx)
|
||||
childView.append("Hello, world!")
|
||||
childView.id = 100
|
||||
root.addView(childView)
|
||||
root.measure(500, 500)
|
||||
root.layout(0, 0, 500, 500)
|
||||
pointerDispatcher = JSPointerDispatcher(root)
|
||||
}
|
||||
|
||||
private fun createMotionEvent(action: Int, x: Float, y: Float): MotionEvent {
|
||||
val downTime = SystemClock.uptimeMillis()
|
||||
val eventTime = downTime
|
||||
val metaState = 0 // no modifiers pressed
|
||||
|
||||
return MotionEvent.obtain(downTime, eventTime, action, x, y, metaState)
|
||||
}
|
||||
|
||||
private fun getChildViewRectInRootCoordinates(childIndex: Int): Rect {
|
||||
val child: View = root.getChildAt(childIndex)
|
||||
val outRect = Rect()
|
||||
child.getDrawingRect(outRect)
|
||||
root.offsetDescendantRectToMyCoords(child, outRect)
|
||||
return outRect
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPointerEnter() {
|
||||
val childRect = getChildViewRectInRootCoordinates(0)
|
||||
val ev =
|
||||
createMotionEvent(
|
||||
MotionEvent.ACTION_DOWN, childRect.centerX().toFloat(), childRect.centerY().toFloat())
|
||||
val mockDispatcher: EventDispatcher = mock(EventDispatcher::class.java)
|
||||
pointerDispatcher.handleMotionEvent(ev, mockDispatcher, false)
|
||||
verify(mockDispatcher).dispatchEvent(argThat(EventWithName(PointerEventHelper.POINTER_DOWN)))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user