From af2095842535c05613240215052fbcdd2f34ce64 Mon Sep 17 00:00:00 2001 From: "Andrew Chen (Eng)" Date: Wed, 18 Apr 2018 14:55:52 -0700 Subject: [PATCH] Use real YogaNodes in FabricReconcilerTest Reviewed By: mdvacca Differential Revision: D7664493 fbshipit-source-id: 74b088a91ea4f691cc15b5ea15dd585fe46e2035 --- .../react/fabric/FabricReconcilerTest.java | 80 +++++++------------ 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricReconcilerTest.java b/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricReconcilerTest.java index 23272c2342..26def0ca1c 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricReconcilerTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/fabric/FabricReconcilerTest.java @@ -4,22 +4,21 @@ package com.facebook.react.fabric; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.mockStatic; +import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.common.ClearableSynchronizedPool; +import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.fabric.FabricReconciler; -import com.facebook.react.modules.core.ReactChoreographer; +import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.uimanager.NativeViewHierarchyManager; import com.facebook.react.uimanager.ReactShadowNode; import com.facebook.react.uimanager.ReactShadowNodeImpl; -import com.facebook.react.uimanager.ReactYogaConfigProvider; import com.facebook.react.uimanager.UIViewOperationQueue; import com.facebook.react.uimanager.ViewAtIndex; -import com.facebook.react.uimanager.YogaNodePool; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewManager; +import com.facebook.react.uimanager.ViewManagerRegistry; import com.facebook.testing.robolectric.v3.WithTestDefaultsRunner; -import com.facebook.yoga.YogaConfig; -import com.facebook.yoga.YogaNode; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -27,34 +26,27 @@ import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; import org.robolectric.RuntimeEnvironment; /** Tests {@link FabricReconciler} */ -@PrepareForTest({ - ReactChoreographer.class, - ReactYogaConfigProvider.class, - YogaNodePool.class, -}) @RunWith(WithTestDefaultsRunner.class) -@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) public class FabricReconcilerTest { private FabricReconciler mFabricReconciler; + private FabricUIManager mFabricUIManager; private MockUIViewOperationQueue mMockUIViewOperationQueue; @Before public void setUp() { + CatalystInstance catalystInstance = ReactTestHelper.createMockCatalystInstance(); ReactApplicationContext reactContext = new ReactApplicationContext(RuntimeEnvironment.application); + reactContext.initializeWithInstance(catalystInstance); + List viewManagers = new ArrayList<>(); + ViewManagerRegistry viewManagerRegistry = new ViewManagerRegistry(viewManagers); + mFabricUIManager = new FabricUIManager(reactContext, viewManagerRegistry); mMockUIViewOperationQueue = new MockUIViewOperationQueue(reactContext); mFabricReconciler = new FabricReconciler(mMockUIViewOperationQueue); - - setupHacks(); } @Test @@ -98,6 +90,12 @@ public class FabricReconcilerTest { assertThat(mMockUIViewOperationQueue.getOperations()).isEqualTo(expectedOperations); } + private void addChildren(ReactShadowNode parent, ReactShadowNode... children) { + for (ReactShadowNode child : children) { + mFabricUIManager.appendChild(parent, child); + } + } + private static ReactShadowNode createNode(int tag) { return createNode(tag, false); } @@ -114,20 +112,26 @@ public class FabricReconcilerTest { node = new ReactShadowNodeImpl(); } node.setReactTag(tag); + node.setThemedContext(mock(ThemedReactContext.class)); return node; } private static class VirtualReactShadowNode extends ReactShadowNodeImpl { + VirtualReactShadowNode() {} + + VirtualReactShadowNode(VirtualReactShadowNode original) { + super(original); + } + @Override public boolean isVirtual() { return true; } - } - private static void addChildren(ReactShadowNode parent, ReactShadowNode... children) { - for (ReactShadowNode child : children) { - parent.addChildAt(child, parent.getChildCount()); + @Override + public ReactShadowNodeImpl copy() { + return new VirtualReactShadowNode(this); } } @@ -193,32 +197,4 @@ public class FabricReconcilerTest { return Collections.unmodifiableList(mOperations); } } - - /** Hacks to get tests to start working end to end */ - private void setupHacks() { - // Hack around Yoga by mocking it out until the UnsatisfiedLinkErrors are fixed t14964130 - mockStatic(YogaNodePool.class, ReactYogaConfigProvider.class); - PowerMockito.when(YogaNodePool.get()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Exception { - ClearableSynchronizedPool yogaPool = - mock(ClearableSynchronizedPool.class); - YogaNode yogaNode = mock(YogaNode.class); - when(yogaNode.clone()).thenReturn(mock(YogaNode.class)); - when(yogaNode.isMeasureDefined()).thenReturn(true); - when(yogaPool.acquire()).thenReturn(yogaNode); - return yogaPool; - } - }); - PowerMockito.when(ReactYogaConfigProvider.get()) - .thenAnswer( - new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - return mock(YogaConfig.class); - } - }); - } }