From 35b913017ba92201379d10ff9b7d618fe1605bae Mon Sep 17 00:00:00 2001 From: giolaq Date: Wed, 16 Aug 2023 12:16:03 -0700 Subject: [PATCH] =?UTF-8?q?Migrated=20UIManagerModuleConstantsTest.java=20?= =?UTF-8?q?to=20UIManagerModuleConstant=E2=80=A6=20(#38994)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: This PR converts UIManagerModuleConstantsTest.java into Kotlin as requested in [https://github.com/facebook/react-native/issues/38825](https://github.com/facebook/react-native/issues/38825) ## Changelog: [INTERNAL] [CHANGED] - Convert to UIManagerModuleConstantsTest.java to UIManagerModuleConstantsText.kt Pull Request resolved: https://github.com/facebook/react-native/pull/38994 Test Plan: ```./gradlew :packages:react-native:ReactAndroid:test``` must pass and CI must be green Screenshot 2023-08-14 at 17 43 14 Reviewed By: mdvacca, rshest Differential Revision: D48387980 Pulled By: cortinico fbshipit-source-id: d5ab3f9a4ada2d0442daecb6c893458d9baa7558 --- .../UIManagerModuleConstantsTest.java | 169 -------------- .../uimanager/UIManagerModuleConstantsTest.kt | 219 ++++++++++++++++++ 2 files changed, 219 insertions(+), 169 deletions(-) delete mode 100644 packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java create mode 100644 packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java deleted file mode 100644 index 44f50a0fd7d..00000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.java +++ /dev/null @@ -1,169 +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 static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.common.MapBuilder; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import org.assertj.core.data.MapEntry; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -@Ignore // TODO T14964130 -public class UIManagerModuleConstantsTest { - - private static final String CUSTOM_BUBBLING_EVENT_TYPES = "customBubblingEventTypes"; - private static final String CUSTOM_DIRECT_EVENT_TYPES = "customDirectEventTypes"; - - private static final Map TWIRL_BUBBLING_EVENT_MAP = - MapBuilder.of( - "phasedRegistrationNames", - MapBuilder.of("bubbled", "onTwirl", "captured", "onTwirlCaptured")); - private static final Map TWIRL_DIRECT_EVENT_MAP = MapBuilder.of("registrationName", "onTwirl"); - - private ReactApplicationContext mReactContext; - - @Before - public void setUp() { - mReactContext = new ReactApplicationContext(RuntimeEnvironment.getApplication()); - } - - @Test - public void testNoCustomConstants() { - List viewManagers = Arrays.asList(mock(ViewManager.class)); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat(constants) - .containsKey(CUSTOM_BUBBLING_EVENT_TYPES) - .containsKey(CUSTOM_DIRECT_EVENT_TYPES) - .containsKey("Dimensions"); - } - - @Test - public void testCustomBubblingEvents() { - ViewManager mockViewManager = mock(ViewManager.class); - List viewManagers = Arrays.asList(mockViewManager); - when(mockViewManager.getExportedCustomBubblingEventTypeConstants()) - .thenReturn(MapBuilder.of("onTwirl", TWIRL_BUBBLING_EVENT_MAP)); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat((Map) constants.get(CUSTOM_BUBBLING_EVENT_TYPES)) - .contains(MapEntry.entry("onTwirl", TWIRL_BUBBLING_EVENT_MAP)) - .containsKey("topChange"); - } - - @Test - public void testCustomDirectEvents() { - ViewManager mockViewManager = mock(ViewManager.class); - List viewManagers = Arrays.asList(mockViewManager); - when(mockViewManager.getExportedCustomDirectEventTypeConstants()) - .thenReturn(MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP)); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat((Map) constants.get(CUSTOM_DIRECT_EVENT_TYPES)) - .contains(MapEntry.entry("onTwirl", TWIRL_DIRECT_EVENT_MAP)) - .containsKey("topLoadingStart"); - } - - @Test - public void testCustomViewConstants() { - ViewManager mockViewManager = mock(ViewManager.class); - List viewManagers = Arrays.asList(mockViewManager); - when(mockViewManager.getName()).thenReturn("RedPandaPhotoOfTheDayView"); - when(mockViewManager.getExportedViewConstants()) - .thenReturn(MapBuilder.of("PhotoSizeType", MapBuilder.of("Small", 1, "Large", 2))); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat(constants).containsKey("RedPandaPhotoOfTheDayView"); - assertThat((Map) constants.get("RedPandaPhotoOfTheDayView")).containsKey("Constants"); - assertThat((Map) valueAtPath(constants, "RedPandaPhotoOfTheDayView", "Constants")) - .containsKey("PhotoSizeType"); - } - - @Test - public void testNativeProps() { - ViewManager mockViewManager = mock(ViewManager.class); - List viewManagers = Arrays.asList(mockViewManager); - when(mockViewManager.getName()).thenReturn("SomeView"); - when(mockViewManager.getNativeProps()).thenReturn(MapBuilder.of("fooProp", "number")); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat((String) valueAtPath(constants, "SomeView", "NativeProps", "fooProp")) - .isEqualTo("number"); - } - - @Test - public void testMergeConstants() { - ViewManager managerX = mock(ViewManager.class); - when(managerX.getExportedCustomDirectEventTypeConstants()) - .thenReturn( - MapBuilder.of( - "onTwirl", - MapBuilder.of( - "registrationName", - "onTwirl", - "keyToOverride", - "valueX", - "mapToMerge", - MapBuilder.of("keyToOverride", "innerValueX", "anotherKey", "valueX")))); - - ViewManager managerY = mock(ViewManager.class); - when(managerY.getExportedCustomDirectEventTypeConstants()) - .thenReturn( - MapBuilder.of( - "onTwirl", - MapBuilder.of( - "extraKey", - "extraValue", - "keyToOverride", - "valueY", - "mapToMerge", - MapBuilder.of("keyToOverride", "innerValueY", "extraKey", "valueY")))); - - List viewManagers = Arrays.asList(managerX, managerY); - UIManagerModule uiManagerModule = new UIManagerModule(mReactContext, viewManagers, 0); - Map constants = uiManagerModule.getConstants(); - assertThat((Map) constants.get(CUSTOM_DIRECT_EVENT_TYPES)).containsKey("onTwirl"); - - Map twirlMap = (Map) valueAtPath(constants, CUSTOM_DIRECT_EVENT_TYPES, "onTwirl"); - assertThat(twirlMap) - .contains(MapEntry.entry("registrationName", "onTwirl")) - .contains(MapEntry.entry("keyToOverride", "valueY")) - .contains(MapEntry.entry("extraKey", "extraValue")) - .containsKey("mapToMerge"); - - Map mapToMerge = (Map) valueAtPath(twirlMap, "mapToMerge"); - assertThat(mapToMerge) - .contains(MapEntry.entry("keyToOverride", "innerValueY")) - .contains(MapEntry.entry("anotherKey", "valueX")) - .contains(MapEntry.entry("extraKey", "valueY")); - } - - private static Object valueAtPath(Map nestedMap, String... keyPath) { - assertThat(keyPath).isNotEmpty(); - Object value = nestedMap; - for (String key : keyPath) { - assertThat(value).isInstanceOf(Map.class); - nestedMap = (Map) value; - assertThat(nestedMap).containsKey(key); - value = nestedMap.get(key); - } - return value; - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt new file mode 100644 index 00000000000..5ae599e77b7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt @@ -0,0 +1,219 @@ +/* + * 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.view.View +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.common.MapBuilder +import org.assertj.core.api.Assertions +import org.assertj.core.data.MapEntry +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment + +@RunWith(RobolectricTestRunner::class) +class UIManagerModuleConstantsTest { + + private class ConcreteViewManager(val viewName: String) : SimpleViewManager() { + + private var customDirectEventTypeConstants: Map> = emptyMap() + + fun setExportedCustomDirectEventTypeConstants(constants: Map>) { + customDirectEventTypeConstants = constants + } + + override fun createViewInstance(reactContext: ThemedReactContext): View = View(reactContext) + + override fun getName(): String = viewName + + override fun getExportedCustomDirectEventTypeConstants(): Map> = + customDirectEventTypeConstants + + override fun getExportedCustomBubblingEventTypeConstants(): MutableMap? = + MapBuilder.of("onTwirl", TWIRL_BUBBLING_EVENT_MAP) + + override fun getExportedViewConstants(): MutableMap? = + MapBuilder.of("PhotoSizeType", MapBuilder.of("Small", 1, "Large", 2)) + + override fun getNativeProps(): MutableMap = MapBuilder.of("fooProp", "number") + } + + private lateinit var reactContext: ReactApplicationContext + + @Before + fun setUp() { + reactContext = ReactApplicationContext(RuntimeEnvironment.getApplication()) + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testNoCustomConstants() { + val manager = ConcreteViewManager(VIEW_MANAGER_NAME) + manager.exportedCustomDirectEventTypeConstants = + MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP) + + val viewManagers = listOf(manager) + + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val viewManagerConstants = + uiManagerModule.constants?.get(VIEW_MANAGER_NAME) as Map? + + Assertions.assertThat(viewManagerConstants) + .containsKey(BUBBLING_EVENTS_TYPES_KEY) + .containsKey(DIRECT_EVENTS_TYPES_KEY) + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testCustomBubblingEvents() { + val manager = ConcreteViewManager(VIEW_MANAGER_NAME) + manager.exportedCustomDirectEventTypeConstants = + MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP) + + val viewManagers = listOf(manager) + + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val viewManagerConstants = uiManagerModule.constants?.get(VIEW_MANAGER_NAME) as Map + + Assertions.assertThat(viewManagerConstants).containsKey(BUBBLING_EVENTS_TYPES_KEY) + val bubblingEventTypes = viewManagerConstants[BUBBLING_EVENTS_TYPES_KEY] as Map + Assertions.assertThat(bubblingEventTypes).containsEntry("onTwirl", TWIRL_BUBBLING_EVENT_MAP) + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testCustomDirectEvents() { + val manager = ConcreteViewManager(VIEW_MANAGER_NAME) + manager.exportedCustomDirectEventTypeConstants = + MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP) + + val viewManagers = listOf(manager) + + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val viewManagerConstants = uiManagerModule.constants?.get(VIEW_MANAGER_NAME) as Map + + Assertions.assertThat(viewManagerConstants).containsKey(DIRECT_EVENTS_TYPES_KEY) + val directEventTypes = viewManagerConstants[DIRECT_EVENTS_TYPES_KEY] as Map + Assertions.assertThat(directEventTypes).containsEntry("onTwirl", TWIRL_DIRECT_EVENT_MAP) + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testCustomViewConstants() { + val manager = ConcreteViewManager(VIEW_MANAGER_NAME) + manager.exportedCustomDirectEventTypeConstants = + MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP) + + val viewManagers = listOf(manager) + + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val constants = uiManagerModule.constants + Assertions.assertThat(constants).containsKey(VIEW_MANAGER_NAME) + + Assertions.assertThat(constants!![VIEW_MANAGER_NAME] as Map) + .containsKey("Constants") + Assertions.assertThat( + valueAtPath(constants, VIEW_MANAGER_NAME, "Constants") as Map?) + .containsKey("PhotoSizeType") + } + + @Test + fun testNativeProps() { + val manager = ConcreteViewManager(VIEW_MANAGER_NAME) + manager.exportedCustomDirectEventTypeConstants = + MapBuilder.of("onTwirl", TWIRL_DIRECT_EVENT_MAP) + + val viewManagers = listOf(manager) + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val constants = uiManagerModule.constants.orEmpty() + Assertions.assertThat( + valueAtPath(constants, VIEW_MANAGER_NAME, "NativeProps", "fooProp") as String?) + .isEqualTo("number") + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testMergeConstants() { + val managerX = ConcreteViewManager("ManagerX") + managerX.exportedCustomDirectEventTypeConstants = + MapBuilder.of( + "onTwirl", + MapBuilder.of( + "registrationName", + "onTwirl", + "keyToOverride", + "valueX", + "mapToMerge", + MapBuilder.of("keyToOverride", "innerValueX", "anotherKey", "valueX"))) + + val managerY = ConcreteViewManager("ManagerY") + managerY.exportedCustomDirectEventTypeConstants = + MapBuilder.of( + "onTwirl", + MapBuilder.of( + "extraKey", + "extraValue", + "keyToOverride", + "valueY", + "mapToMerge", + MapBuilder.of("keyToOverride", "innerValueY", "extraKey", "valueY"))) + + val viewManagers = listOf(managerX, managerY) + val uiManagerModule = UIManagerModule(reactContext, viewManagers, 0) + val constants = uiManagerModule.constants + val viewManagerConstants = constants!!["ManagerX"] as Map + Assertions.assertThat(viewManagerConstants[DIRECT_EVENTS_TYPES_KEY] as Map) + .containsKey("onTwirl") + val twirlMap = + valueAtPath(viewManagerConstants, DIRECT_EVENTS_TYPES_KEY, "onTwirl") as Map + + Assertions.assertThat(twirlMap) + .contains(MapEntry.entry("registrationName", "onTwirl")) + .contains(MapEntry.entry("keyToOverride", "valueY")) + .contains(MapEntry.entry("extraKey", "extraValue")) + .containsKey("mapToMerge") + + val mapToMerge = valueAtPath(twirlMap, "mapToMerge") as Map + Assertions.assertThat(mapToMerge) + .contains(MapEntry.entry("keyToOverride", "innerValueY")) + .contains(MapEntry.entry("anotherKey", "valueX")) + .contains(MapEntry.entry("extraKey", "valueY")) + } + + companion object { + + private val TWIRL_BUBBLING_EVENT_MAP: Map<*, *> = + MapBuilder.of( + "phasedRegistrationNames", + MapBuilder.of("bubbled", "onTwirl", "captured", "onTwirlCaptured")) + + private val TWIRL_DIRECT_EVENT_MAP: Map = + MapBuilder.of("registrationName", "onTwirl") + + private const val VIEW_MANAGER_NAME = "viewManagerName" + private const val BUBBLING_EVENTS_TYPES_KEY = "bubblingEventTypes" + private const val DIRECT_EVENTS_TYPES_KEY = "directEventTypes" + + @Suppress("UNCHECKED_CAST") + private fun valueAtPath(nestedMap: Map, vararg keyPath: String): Any? { + Assertions.assertThat(keyPath).isNotEmpty + var value: Any? = nestedMap + for (key in keyPath) { + Assertions.assertThat(value).isInstanceOf(MutableMap::class.java) + + val currentNestedMap = value as Map + Assertions.assertThat(key in currentNestedMap).isTrue + + value = currentNestedMap[key] + } + return value + } + } +}