diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.java deleted file mode 100644 index 2de130c9a5cc8e..00000000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.java +++ /dev/null @@ -1,462 +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 junit.framework.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyFloat; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - -import android.util.DisplayMetrics; -import com.facebook.react.bridge.JavaOnlyMap; -import com.facebook.yoga.YogaAlign; -import com.facebook.yoga.YogaConstants; -import com.facebook.yoga.YogaFlexDirection; -import com.facebook.yoga.YogaJustify; -import com.facebook.yoga.YogaPositionType; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockedStatic; -import org.mockito.stubbing.Answer; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -@Ignore // TODO T14964130 -public class LayoutPropertyApplicatorTest { - - @Before - public void setup() { - DisplayMetricsHolder.setWindowDisplayMetrics(new DisplayMetrics()); - DisplayMetricsHolder.setScreenDisplayMetrics(new DisplayMetrics()); - } - - @After - public void teardown() { - DisplayMetricsHolder.setWindowDisplayMetrics(null); - DisplayMetricsHolder.setScreenDisplayMetrics(null); - } - - public ReactStylesDiffMap buildStyles(Object... keysAndValues) { - return new ReactStylesDiffMap(JavaOnlyMap.of(keysAndValues)); - } - - @Test - public void testDimensions() { - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = - spy(buildStyles("width", 10.0, "height", 10.0, "left", 10.0, "top", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setStyleWidth(anyFloat()); - verify(map).getFloat(eq("width"), anyFloat()); - verify(reactShadowNode).setStyleHeight(anyFloat()); - verify(map).getFloat(eq("height"), anyFloat()); - verify(reactShadowNode).setPosition(eq(Spacing.START), anyFloat()); - verify(map).getFloat(eq("left"), anyFloat()); - verify(reactShadowNode).setPosition(eq(Spacing.TOP), anyFloat()); - verify(map).getFloat(eq("top"), anyFloat()); - - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles()); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode, never()).setStyleWidth(anyFloat()); - verify(map, never()).getFloat(eq("width"), anyFloat()); - verify(reactShadowNode, never()).setStyleHeight(anyFloat()); - verify(map, never()).getFloat(eq("height"), anyFloat()); - verify(reactShadowNode, never()).setPosition(eq(Spacing.START), anyFloat()); - verify(map, never()).getFloat(eq("left"), anyFloat()); - verify(reactShadowNode, never()).setPosition(eq(Spacing.TOP), anyFloat()); - verify(map, never()).getFloat(eq("top"), anyFloat()); - } - - @Test - public void testFlex() { - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = spy(buildStyles("flex", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setFlex(anyFloat()); - verify(map).getFloat("flex", 0.f); - - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles()); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode, never()).setFlex(anyFloat()); - verify(map, never()).getFloat("flex", 0.f); - } - - @Test - public void testPosition() { - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = spy(buildStyles("position", "absolute", "bottom", 10.0, "right", 5.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPosition(eq(Spacing.BOTTOM), anyFloat()); - verify(reactShadowNode).setPosition(eq(Spacing.END), anyFloat()); - verify(reactShadowNode).setPositionType(any(YogaPositionType.class)); - verify(map).getFloat("bottom", Float.NaN); - verify(map).getFloat("right", Float.NaN); - - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles()); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode, never()).setPosition(eq(Spacing.BOTTOM), anyFloat()); - verify(reactShadowNode, never()).setPosition(eq(Spacing.END), anyFloat()); - verify(reactShadowNode, never()).setPositionType(any(YogaPositionType.class)); - verify(map, never()).getFloat("bottom", Float.NaN); - verify(map, never()).getFloat("right", Float.NaN); - } - - @Test - public void testMargin() { - // margin - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = spy(buildStyles("margin", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.ALL), anyFloat()); - verify(map).getFloat("margin", YogaConstants.UNDEFINED); - - // marginVertical - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginVertical", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.VERTICAL), anyFloat()); - verify(map).getFloat("marginVertical", YogaConstants.UNDEFINED); - - // marginHorizontal - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginHorizontal", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.HORIZONTAL), anyFloat()); - verify(map).getFloat("marginHorizontal", YogaConstants.UNDEFINED); - - // marginTop - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginTop", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.TOP), anyFloat()); - verify(map).getFloat("marginTop", YogaConstants.UNDEFINED); - - // marginBottom - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginBottom", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.BOTTOM), anyFloat()); - verify(map).getFloat("marginBottom", YogaConstants.UNDEFINED); - - // marginLeft - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginLeft", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.START), anyFloat()); - verify(map).getFloat("marginLeft", YogaConstants.UNDEFINED); - - // marginRight - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("marginRight", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setMargin(eq(Spacing.END), anyFloat()); - verify(map).getFloat("marginRight", YogaConstants.UNDEFINED); - - // no margin - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles()); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode, never()).setMargin(anyInt(), anyFloat()); - verify(map, never()).getFloat("margin", YogaConstants.UNDEFINED); - } - - @Test - public void testPadding() { - // padding - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = spy(buildStyles("padding", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.ALL), anyFloat()); - verify(map).getFloat("padding", YogaConstants.UNDEFINED); - - // paddingVertical - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingVertical", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.VERTICAL), anyFloat()); - verify(map).getFloat("paddingVertical", YogaConstants.UNDEFINED); - - // paddingHorizontal - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingHorizontal", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.HORIZONTAL), anyFloat()); - verify(map).getFloat("paddingHorizontal", YogaConstants.UNDEFINED); - - // paddingTop - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingTop", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.TOP), anyFloat()); - verify(map).getFloat("paddingTop", YogaConstants.UNDEFINED); - - // paddingBottom - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingBottom", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.BOTTOM), anyFloat()); - verify(map).getFloat("paddingBottom", YogaConstants.UNDEFINED); - - // paddingLeft - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingLeft", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.START), anyFloat()); - verify(map).getFloat("paddingLeft", YogaConstants.UNDEFINED); - - // paddingRight - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles("paddingRight", 10.0)); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setPadding(eq(Spacing.END), anyFloat()); - verify(map).getFloat("paddingRight", YogaConstants.UNDEFINED); - - // no padding - reactShadowNode = spy(new LayoutShadowNode()); - map = spy(buildStyles()); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode, never()).setPadding(anyInt(), anyFloat()); - verify(map, never()).getFloat("padding", YogaConstants.UNDEFINED); - } - - @Test - public void testEnumerations() { - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = - buildStyles( - "flexDirection", - "column", - "alignSelf", - "stretch", - "alignItems", - "center", - "justifyContent", - "space_between", - "position", - "relative"); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setFlexDirection(YogaFlexDirection.COLUMN); - verify(reactShadowNode).setAlignSelf(YogaAlign.STRETCH); - verify(reactShadowNode).setAlignItems(YogaAlign.CENTER); - verify(reactShadowNode).setJustifyContent(YogaJustify.SPACE_BETWEEN); - verify(reactShadowNode).setPositionType(YogaPositionType.RELATIVE); - - reactShadowNode = spy(new LayoutShadowNode()); - map = buildStyles(); - reactShadowNode.updateProperties(map); - - verify(reactShadowNode, never()).setFlexDirection(any(YogaFlexDirection.class)); - verify(reactShadowNode, never()).setAlignSelf(any(YogaAlign.class)); - verify(reactShadowNode, never()).setAlignItems(any(YogaAlign.class)); - verify(reactShadowNode, never()).setJustifyContent(any(YogaJustify.class)); - verify(reactShadowNode, never()).setPositionType(any(YogaPositionType.class)); - } - - @Test - public void testPropertiesResetToDefault() { - DisplayMetrics displayMetrics = new DisplayMetrics(); - displayMetrics.density = 1.0f; - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics); - - LayoutShadowNode reactShadowNode = spy(new LayoutShadowNode()); - ReactStylesDiffMap map = - buildStyles( - "width", - 10.0, - "height", - 10.0, - "left", - 10.0, - "top", - 10.0, - "flex", - 1.0, - "padding", - 10.0, - "marginLeft", - 10.0, - "borderTopWidth", - 10.0, - "flexDirection", - "row", - "alignSelf", - "stretch", - "alignItems", - "center", - "justifyContent", - "space_between", - "position", - "absolute"); - - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setStyleWidth(10.f); - verify(reactShadowNode).setStyleHeight(10.f); - verify(reactShadowNode).setPosition(Spacing.START, 10.f); - verify(reactShadowNode).setPosition(Spacing.TOP, 10.f); - verify(reactShadowNode).setFlex(1.0f); - verify(reactShadowNode).setPadding(Spacing.ALL, 10.f); - verify(reactShadowNode).setMargin(Spacing.START, 10.f); - verify(reactShadowNode).setBorder(Spacing.TOP, 10.f); - verify(reactShadowNode).setFlexDirection(YogaFlexDirection.ROW); - verify(reactShadowNode).setAlignSelf(YogaAlign.STRETCH); - verify(reactShadowNode).setAlignItems(YogaAlign.CENTER); - verify(reactShadowNode).setJustifyContent(YogaJustify.SPACE_BETWEEN); - verify(reactShadowNode).setPositionType(YogaPositionType.ABSOLUTE); - - map = - buildStyles( - "width", - null, - "height", - null, - "left", - null, - "top", - null, - "flex", - null, - "padding", - null, - "marginLeft", - null, - "borderTopWidth", - null, - "flexDirection", - null, - "alignSelf", - null, - "alignItems", - null, - "justifyContent", - null, - "position", - null); - - reset(reactShadowNode); - reactShadowNode.updateProperties(map); - verify(reactShadowNode).setStyleWidth(YogaConstants.UNDEFINED); - verify(reactShadowNode).setStyleHeight(YogaConstants.UNDEFINED); - verify(reactShadowNode).setPosition(Spacing.START, YogaConstants.UNDEFINED); - verify(reactShadowNode).setPosition(Spacing.TOP, YogaConstants.UNDEFINED); - verify(reactShadowNode).setFlex(0.f); - verify(reactShadowNode).setPadding(Spacing.ALL, YogaConstants.UNDEFINED); - verify(reactShadowNode).setMargin(Spacing.START, YogaConstants.UNDEFINED); - verify(reactShadowNode).setBorder(Spacing.TOP, YogaConstants.UNDEFINED); - verify(reactShadowNode).setFlexDirection(YogaFlexDirection.COLUMN); - verify(reactShadowNode).setAlignSelf(YogaAlign.AUTO); - verify(reactShadowNode).setAlignItems(YogaAlign.STRETCH); - verify(reactShadowNode).setJustifyContent(YogaJustify.FLEX_START); - verify(reactShadowNode).setPositionType(YogaPositionType.RELATIVE); - } - - @Test - public void testSettingDefaultStyleValues() { - MockedStatic pixelUtil = mockStatic(PixelUtil.class); - pixelUtil - .when(() -> PixelUtil.toPixelFromDIP(anyFloat())) - .thenAnswer( - (Answer) - invocation -> { - Object[] args = invocation.getArguments(); - return (Float) args[0]; - }); - - LayoutShadowNode[] nodes = new LayoutShadowNode[7]; - for (int idx = 0; idx < nodes.length; idx++) { - nodes[idx] = new LayoutShadowNode(); - nodes[idx].setDefaultPadding(Spacing.START, 15); - nodes[idx].setDefaultPadding(Spacing.TOP, 25); - nodes[idx].setDefaultPadding(Spacing.END, 35); - nodes[idx].setDefaultPadding(Spacing.BOTTOM, 45); - } - - ReactStylesDiffMap[] mapNodes = new ReactStylesDiffMap[7]; - mapNodes[0] = buildStyles("paddingLeft", 10.0, "paddingHorizontal", 5.0); - mapNodes[1] = buildStyles("padding", 10.0, "paddingTop", 5.0); - mapNodes[2] = buildStyles("paddingLeft", 10.0, "paddingVertical", 5.0); - mapNodes[3] = buildStyles("paddingBottom", 10.0, "paddingHorizontal", 5.0); - mapNodes[4] = buildStyles("padding", null, "paddingTop", 5.0); - mapNodes[5] = - buildStyles("paddingRight", 10.0, "paddingHorizontal", null, "paddingVertical", 7.0); - mapNodes[6] = buildStyles("margin", 5.0); - - for (int idx = 0; idx < nodes.length; idx++) { - nodes[idx].updateProperties(mapNodes[idx]); - } - - assertEquals(10.0, nodes[0].getPadding(Spacing.START), .0001); - assertEquals(25.0, nodes[0].getPadding(Spacing.TOP), .0001); - assertEquals(5.0, nodes[0].getPadding(Spacing.END), .0001); - assertEquals(45.0, nodes[0].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(10.0, nodes[1].getPadding(Spacing.START), .0001); - assertEquals(5.0, nodes[1].getPadding(Spacing.TOP), .0001); - assertEquals(10.0, nodes[1].getPadding(Spacing.END), .0001); - assertEquals(10.0, nodes[1].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(10.0, nodes[2].getPadding(Spacing.START), .0001); - assertEquals(5.0, nodes[2].getPadding(Spacing.TOP), .0001); - assertEquals(35.0, nodes[2].getPadding(Spacing.END), .0001); - assertEquals(5.0, nodes[2].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(5.0, nodes[3].getPadding(Spacing.START), .0001); - assertEquals(25.0, nodes[3].getPadding(Spacing.TOP), .0001); - assertEquals(5.0, nodes[3].getPadding(Spacing.END), .0001); - assertEquals(10.0, nodes[3].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(15.0, nodes[4].getPadding(Spacing.START), .0001); - assertEquals(5.0, nodes[4].getPadding(Spacing.TOP), .0001); - assertEquals(35.0, nodes[4].getPadding(Spacing.END), .0001); - assertEquals(45.0, nodes[4].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(15.0, nodes[5].getPadding(Spacing.START), .0001); - assertEquals(7.0, nodes[5].getPadding(Spacing.TOP), .0001); - assertEquals(10.0, nodes[5].getPadding(Spacing.END), .0001); - assertEquals(7.0, nodes[5].getPadding(Spacing.BOTTOM), .0001); - - assertEquals(15.0, nodes[6].getPadding(Spacing.START), .0001); - assertEquals(25.0, nodes[6].getPadding(Spacing.TOP), .0001); - assertEquals(35.0, nodes[6].getPadding(Spacing.END), .0001); - assertEquals(45.0, nodes[6].getPadding(Spacing.BOTTOM), .0001); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.kt new file mode 100644 index 00000000000000..5f83847bd54109 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.kt @@ -0,0 +1,464 @@ +/* + * 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.util.DisplayMetrics +import com.facebook.react.bridge.JavaOnlyMap +import com.facebook.react.uimanager.Spacing.* +import com.facebook.yoga.YogaAlign +import com.facebook.yoga.YogaConstants +import com.facebook.yoga.YogaFlexDirection +import com.facebook.yoga.YogaJustify +import com.facebook.yoga.YogaPositionType +import org.junit.After +import org.junit.Assert.* +import org.junit.Before +import org.junit.Ignore +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyFloat +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.eq +import org.mockito.Mockito.mockStatic +import org.mockito.Mockito.never +import org.mockito.Mockito.reset +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +@Ignore +class LayoutPropertyApplicatorTest { + @Before + fun setup() { + DisplayMetricsHolder.setWindowDisplayMetrics(DisplayMetrics()) + DisplayMetricsHolder.setScreenDisplayMetrics(DisplayMetrics()) + } + + @After + fun teardown() { + DisplayMetricsHolder.setWindowDisplayMetrics(null) + DisplayMetricsHolder.setScreenDisplayMetrics(null) + } + + private fun buildStyles(vararg keysAndValues: Any?): ReactStylesDiffMap { + return ReactStylesDiffMap(JavaOnlyMap.of(*keysAndValues)) + } + + @Test + fun testDimensions() { + var reactShadowNode = spy(LayoutShadowNode()) + var map = spy(buildStyles("width", 10.0f, "height", 10.0f, "left", 10.0f, "top", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setStyleWidth(anyFloat()) + verify(map).getFloat(eq("width"), anyFloat()) + verify(reactShadowNode).setStyleHeight(anyFloat()) + verify(map).getFloat(eq("height"), anyFloat()) + verify(reactShadowNode).setPosition(eq(START), anyFloat()) + verify(map).getFloat(eq("left"), anyFloat()) + verify(reactShadowNode).setPosition(eq(TOP), anyFloat()) + verify(map).getFloat(eq("top"), anyFloat()) + + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles()) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode, never()).setStyleWidth(anyFloat()) + verify(map, never()).getFloat(eq("width"), anyFloat()) + verify(reactShadowNode, never()).setStyleHeight(anyFloat()) + verify(map, never()).getFloat(eq("height"), anyFloat()) + verify(reactShadowNode, never()).setPosition(eq(START), anyFloat()) + verify(map, never()).getFloat(eq("left"), anyFloat()) + verify(reactShadowNode, never()).setPosition(eq(TOP), anyFloat()) + verify(map, never()).getFloat(eq("top"), anyFloat()) + } + + @Test + fun testFlex() { + var reactShadowNode = spy(LayoutShadowNode()) + var map = spy(buildStyles("flex", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).flex = anyFloat() + verify(map).getFloat("flex", 0.0f) + + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles()) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode, never()).flex = anyFloat() + verify(map, never()).getFloat("flex", 0.0f) + } + + @Test + fun testPosition() { + var reactShadowNode = spy(LayoutShadowNode()) + var map = spy(buildStyles("position", "absolute", "bottom", 10.0f, "right", 5.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPosition(eq(BOTTOM), anyFloat()) + verify(reactShadowNode).setPosition(eq(END), anyFloat()) + verify(reactShadowNode).setPositionType(any(YogaPositionType::class.java)) + verify(map).getFloat("bottom", Float.NaN) + verify(map).getFloat("right", Float.NaN) + + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles()) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode, never()).setPosition(eq(BOTTOM), anyFloat()) + verify(reactShadowNode, never()).setPosition(eq(END), anyFloat()) + verify(reactShadowNode, never()).setPositionType(any(YogaPositionType::class.java)) + verify(map, never()).getFloat("bottom", Float.NaN) + verify(map, never()).getFloat("right", Float.NaN) + } + + @Test + fun testMargin() { + // margin + var reactShadowNode = spy(LayoutShadowNode()) + var map = spy(buildStyles("margin", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(ALL), anyFloat()) + verify(map).getFloat("margin", YogaConstants.UNDEFINED) + + // marginVertical + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginVertical", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(VERTICAL), anyFloat()) + verify(map).getFloat("marginVertical", YogaConstants.UNDEFINED) + + // marginHorizontal + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginHorizontal", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(HORIZONTAL), anyFloat()) + verify(map).getFloat("marginHorizontal", YogaConstants.UNDEFINED) + + // marginTop + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginTop", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(TOP), anyFloat()) + verify(map).getFloat("marginTop", YogaConstants.UNDEFINED) + + // marginBottom + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginBottom", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(BOTTOM), anyFloat()) + verify(map).getFloat("marginBottom", YogaConstants.UNDEFINED) + + // marginLeft + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginLeft", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(START), anyFloat()) + verify(map).getFloat("marginLeft", YogaConstants.UNDEFINED) + + // marginRight + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("marginRight", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setMargin(eq(END), anyFloat()) + verify(map).getFloat("marginRight", YogaConstants.UNDEFINED) + + // no margin + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles()) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode, never()).setMargin(anyInt(), anyFloat()) + verify(map, never()).getFloat("margin", YogaConstants.UNDEFINED) + } + + @Test + fun testPadding() { + // padding + var reactShadowNode = spy(LayoutShadowNode()) + var map = spy(buildStyles("padding", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(ALL), anyFloat()) + verify(map).getFloat("padding", YogaConstants.UNDEFINED) + + // paddingVertical + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingVertical", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(VERTICAL), anyFloat()) + verify(map).getFloat("paddingVertical", YogaConstants.UNDEFINED) + + // paddingHorizontal + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingHorizontal", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(HORIZONTAL), anyFloat()) + verify(map).getFloat("paddingHorizontal", YogaConstants.UNDEFINED) + + // paddingTop + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingTop", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(TOP), anyFloat()) + verify(map).getFloat("paddingTop", YogaConstants.UNDEFINED) + + // paddingBottom + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingBottom", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(BOTTOM), anyFloat()) + verify(map).getFloat("paddingBottom", YogaConstants.UNDEFINED) + + // paddingLeft + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingLeft", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(START), anyFloat()) + verify(map).getFloat("paddingLeft", YogaConstants.UNDEFINED) + + // paddingRight + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles("paddingRight", 10.0f)) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setPadding(eq(END), anyFloat()) + verify(map).getFloat("paddingRight", YogaConstants.UNDEFINED) + + // no padding + reactShadowNode = spy(LayoutShadowNode()) + map = spy(buildStyles()) + + reactShadowNode.updateProperties(map) + verify(reactShadowNode, never()).setPadding(anyInt(), anyFloat()) + verify(map, never()).getFloat("padding", YogaConstants.UNDEFINED) + } + + @Test + fun testEnumerations() { + var reactShadowNode = spy(LayoutShadowNode()) + var map = + buildStyles( + "flexDirection", + "column", + "alignSelf", + "stretch", + "alignItems", + "center", + "justifyContent", + "space_between", + "position", + "relative") + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setFlexDirection(YogaFlexDirection.COLUMN) + verify(reactShadowNode).setAlignSelf(YogaAlign.STRETCH) + verify(reactShadowNode).setAlignItems(YogaAlign.CENTER) + verify(reactShadowNode).setJustifyContent(YogaJustify.SPACE_BETWEEN) + verify(reactShadowNode).setPositionType(YogaPositionType.RELATIVE) + + reactShadowNode = spy(LayoutShadowNode()) + map = buildStyles() + reactShadowNode.updateProperties(map) + + verify(reactShadowNode, never()).setFlexDirection(any(YogaFlexDirection::class.java)) + verify(reactShadowNode, never()).setAlignSelf(any(YogaAlign::class.java)) + verify(reactShadowNode, never()).setAlignItems(any(YogaAlign::class.java)) + verify(reactShadowNode, never()).setJustifyContent(any(YogaJustify::class.java)) + verify(reactShadowNode, never()).setPositionType(any(YogaPositionType::class.java)) + } + + @Test + fun testPropertiesResetToDefault() { + val displayMetrics = DisplayMetrics() + displayMetrics.density = 1.0f + DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) + + val reactShadowNode = spy(LayoutShadowNode()) + var map = + buildStyles( + "width", + 10.0f, + "height", + 10.0f, + "left", + 10.0f, + "top", + 10.0f, + "flex", + 1.0f, + "padding", + 10.0f, + "marginLeft", + 10.0f, + "borderTopWidth", + 10.0f, + "flexDirection", + "row", + "alignSelf", + "stretch", + "alignItems", + "center", + "justifyContent", + "space_between", + "position", + "absolute") + + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setStyleWidth(10.0f) + verify(reactShadowNode).setStyleHeight(10.0f) + verify(reactShadowNode).setPosition(START, 10.0f) + verify(reactShadowNode).setPosition(TOP, 10.0f) + verify(reactShadowNode).flex = 1.0f + verify(reactShadowNode).setPadding(ALL, 10.0f) + verify(reactShadowNode).setMargin(START, 10.0f) + verify(reactShadowNode).setBorder(TOP, 10.0f) + verify(reactShadowNode).setFlexDirection(YogaFlexDirection.ROW) + verify(reactShadowNode).setAlignSelf(YogaAlign.STRETCH) + verify(reactShadowNode).setAlignItems(YogaAlign.CENTER) + verify(reactShadowNode).setJustifyContent(YogaJustify.SPACE_BETWEEN) + verify(reactShadowNode).setPositionType(YogaPositionType.ABSOLUTE) + + map = + buildStyles( + "width", + null, + "height", + null, + "left", + null, + "top", + null, + "flex", + null, + "padding", + null, + "marginLeft", + null, + "borderTopWidth", + null, + "flexDirection", + null, + "alignSelf", + null, + "alignItems", + null, + "justifyContent", + null, + "position", + null) + + reset(reactShadowNode) + reactShadowNode.updateProperties(map) + verify(reactShadowNode).setStyleWidth(YogaConstants.UNDEFINED) + verify(reactShadowNode).setStyleHeight(YogaConstants.UNDEFINED) + verify(reactShadowNode).setPosition(START, YogaConstants.UNDEFINED) + verify(reactShadowNode).setPosition(TOP, YogaConstants.UNDEFINED) + verify(reactShadowNode).flex = 0.0f + verify(reactShadowNode).setPadding(ALL, YogaConstants.UNDEFINED) + verify(reactShadowNode).setMargin(START, YogaConstants.UNDEFINED) + verify(reactShadowNode).setBorder(TOP, YogaConstants.UNDEFINED) + verify(reactShadowNode).setFlexDirection(YogaFlexDirection.COLUMN) + verify(reactShadowNode).setAlignSelf(YogaAlign.AUTO) + verify(reactShadowNode).setAlignItems(YogaAlign.STRETCH) + verify(reactShadowNode).setJustifyContent(YogaJustify.FLEX_START) + verify(reactShadowNode).setPositionType(YogaPositionType.RELATIVE) + } + + @Test + fun testSettingDefaultStyleValues() { + val pixelUtil = mockStatic(PixelUtil::class.java) + pixelUtil + .`when` { PixelUtil.toPixelFromDIP(anyFloat()) } + .thenAnswer { + return@thenAnswer it.arguments[0] + } + val nodesSize = 7 + val nodes = + Array(nodesSize) { + val node = LayoutShadowNode() + node.setDefaultPadding(START, 15.0f) + node.setDefaultPadding(TOP, 25.0f) + node.setDefaultPadding(END, 35.0f) + node.setDefaultPadding(BOTTOM, 45.0f) + node + } + + val mapNodes = + Array(nodesSize) { + when (it) { + 0 -> buildStyles("paddingLeft", 10.0f, "paddingHorizontal", 5.0f) + 1 -> buildStyles("padding", 10.0f, "paddingTop", 5.0f) + 2 -> buildStyles("paddingLeft", 10.0f, "paddingVertical", 5.0f) + 3 -> buildStyles("paddingBottom", 10.0f, "paddingHorizontal", 5.0f) + 4 -> buildStyles("padding", null, "paddingTop", 5.0f) + 5 -> + buildStyles( + "paddingRight", 10.0f, "paddingHorizontal", null, "paddingVertical", 7.0f) + 6 -> buildStyles("margin", 5.0f) + else -> { + null + } + } + } + + for (i in 0..nodesSize) { + nodes[i].updateProperties(mapNodes[i]) + } + + assertEquals(10.0f, nodes[0].getPadding(START), .0001f) + assertEquals(25.0f, nodes[0].getPadding(TOP), .0001f) + assertEquals(5.0f, nodes[0].getPadding(END), .0001f) + assertEquals(45.0f, nodes[0].getPadding(BOTTOM), .0001f) + + assertEquals(10.0f, nodes[1].getPadding(START), .0001f) + assertEquals(5.0f, nodes[1].getPadding(TOP), .0001f) + assertEquals(10.0f, nodes[1].getPadding(END), .0001f) + assertEquals(10.0f, nodes[1].getPadding(BOTTOM), .0001f) + + assertEquals(10.0f, nodes[2].getPadding(START), .0001f) + assertEquals(5.0f, nodes[2].getPadding(TOP), .0001f) + assertEquals(35.0f, nodes[2].getPadding(END), .0001f) + assertEquals(5.0f, nodes[2].getPadding(BOTTOM), .0001f) + + assertEquals(5.0f, nodes[3].getPadding(START), .0001f) + assertEquals(25.0f, nodes[3].getPadding(TOP), .0001f) + assertEquals(5.0f, nodes[3].getPadding(END), .0001f) + assertEquals(10.0f, nodes[3].getPadding(BOTTOM), .0001f) + + assertEquals(15.0f, nodes[4].getPadding(START), .0001f) + assertEquals(5.0f, nodes[4].getPadding(TOP), .0001f) + assertEquals(35.0f, nodes[4].getPadding(END), .0001f) + assertEquals(45.0f, nodes[4].getPadding(BOTTOM), .0001f) + + assertEquals(15.0f, nodes[5].getPadding(START), .0001f) + assertEquals(7.0f, nodes[5].getPadding(TOP), .0001f) + assertEquals(10.0f, nodes[5].getPadding(END), .0001f) + assertEquals(7.0f, nodes[5].getPadding(BOTTOM), .0001f) + + assertEquals(15.0f, nodes[6].getPadding(START), .0001f) + assertEquals(25.0f, nodes[6].getPadding(TOP), .0001f) + assertEquals(35.0f, nodes[6].getPadding(END), .0001f) + assertEquals(45.0f, nodes[6].getPadding(BOTTOM), .0001f) + } +}