diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/CatalystNativeJSToJavaParametersTestCase.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/CatalystNativeJSToJavaParametersTestCase.java index 9db47e58b09..5631647bcd8 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/CatalystNativeJSToJavaParametersTestCase.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/CatalystNativeJSToJavaParametersTestCase.java @@ -21,7 +21,9 @@ import com.facebook.react.bridge.ReadableNativeMap; import com.facebook.react.bridge.ReadableType; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.UnexpectedNativeTypeException; +import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.modules.appstate.AppStateModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; @@ -476,6 +478,78 @@ public class CatalystNativeJSToJavaParametersTestCase extends ReactIntegrationTe assertEquals("newvalue", dest.getString("newkey")); } + public void testEqualityMapAfterMerge() { + mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class).returnMapForMerge1(); + waitForBridgeAndUIIdle(); + + List maps = mRecordingTestModule.getMapCalls(); + assertEquals(1, maps.size()); + + WritableMap map1 = new WritableNativeMap(); + map1.merge(maps.get(0)); + WritableMap map2 = new WritableNativeMap(); + map2.merge(maps.get(0)); + + assertTrue(map1.equals(map2)); + } + + public void testWritableNativeMapEquals() { + WritableMap map1 = new WritableNativeMap(); + WritableMap map2 = new WritableNativeMap(); + + map1.putInt("key1", 123); + map2.putInt("key1", 123); + map1.putString("key2", "value"); + map2.putString("key2", "value"); + + assertTrue(map1.equals(map2)); + } + + public void testWritableNativeMapArraysEquals() { + WritableMap map1 = new WritableNativeMap(); + WritableMap map2 = new WritableNativeMap(); + + map1.putInt("key1", 123); + map2.putInt("key1", 123); + map1.putString("key2", "value"); + map2.putString("key2", "value"); + WritableArray array1 = new WritableNativeArray(); + array1.pushInt(321); + array1.pushNull(); + array1.pushString("test"); + map1.putArray("key3", array1); + + WritableArray array2 = new WritableNativeArray(); + array1.pushInt(321); + array1.pushNull(); + array1.pushString("test"); + map2.putArray("key3", array2); + + assertTrue(map1.equals(map2)); + } + + public void testWritableNativeMapArraysNonEquals() { + WritableMap map1 = new WritableNativeMap(); + WritableMap map2 = new WritableNativeMap(); + + map1.putInt("key1", 123); + map2.putInt("key1", 123); + map1.putString("key2", "value"); + map2.putString("key2", "value"); + WritableArray array1 = new WritableNativeArray(); + array1.pushInt(321); + array1.pushNull(); + array1.pushString("test"); + map1.putArray("key3", array1); + + WritableArray array2 = new WritableNativeArray(); + array1.pushNull(); + array1.pushString("test"); + map2.putArray("key3", array2); + + assertTrue(map1.equals(map2)); + } + public void testMapAccessibleAfterMerge() { mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class).returnMapForMerge1(); mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class).returnMapForMerge2(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java index 422f4995587..38fd926827c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java @@ -236,6 +236,20 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap { return new ReadableNativeMapKeySetIterator(this); } + @Override + public int hashCode() { + return getLocalMap().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ReadableNativeMap)) { + return false; + } + ReadableNativeMap other = (ReadableNativeMap) obj; + return getLocalMap().equals(other.getLocalMap()); + } + @Override public @Nonnull HashMap toHashMap() { if (ReactFeatureFlags.useMapNativeAccessor) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java index 94e23bf5cbf..42ba1209ed8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java @@ -251,7 +251,7 @@ public class MountingManager { && newLocalData.hasKey("hash") && viewState.mCurrentLocalData.getDouble("hash") == newLocalData.getDouble("hash") && viewState.mCurrentLocalData.toString().equals(newLocalData.toString())) { - // TODO: T31905686 implement a proper equality method + // TODO: T31905686 implement a proper equality method return; } viewState.mCurrentLocalData = newLocalData;