/** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.tests; import com.facebook.react.testing.ReactInstanceSpecForTest; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.testing.AssertModule; import com.facebook.react.testing.ReactAppInstrumentationTestCase; /** * Tests for {@link UIManagerModule#measure}, {@link UIManagerModule#measureLayout}, and * {@link UIManagerModule#measureLayoutRelativeToParent}. Tests measurement for views in the * following hierarchy: * * +---------------------------------------------+ * | A | * | | * | +-----------+ +---------+ | * | | B | | D | | * | | +---+ | | | | * | | | C | | | | | * | | | | | +---------+ | * | | +---+ | | * | +-----------+ | * | | * | | * | | * +---------------------------------------------+ * * View locations and dimensions: * A - (0,0) to (500, 500) (500x500) * B - (50,80) to (250, 380) (200x300) * C - (150,150) to (200, 300) (50x150) * D - (400,100) to (450, 300) (50x200) */ public class CatalystMeasureLayoutTest extends ReactAppInstrumentationTestCase { private static interface MeasureLayoutTestModule extends JavaScriptModule { public void verifyMeasureOnViewA(); public void verifyMeasureOnViewC(); public void verifyMeasureLayoutCRelativeToA(); public void verifyMeasureLayoutCRelativeToB(); public void verifyMeasureLayoutCRelativeToSelf(); public void verifyMeasureLayoutRelativeToParentOnViewA(); public void verifyMeasureLayoutRelativeToParentOnViewB(); public void verifyMeasureLayoutRelativeToParentOnViewC(); public void verifyMeasureLayoutDRelativeToB(); public void verifyMeasureLayoutNonExistentTag(); public void verifyMeasureLayoutNonExistentAncestor(); public void verifyMeasureLayoutRelativeToParentNonExistentTag(); } private MeasureLayoutTestModule mTestJSModule; private AssertModule mAssertModule; @Override protected void setUp() throws Exception { super.setUp(); mTestJSModule = getReactContext().getJSModule(MeasureLayoutTestModule.class); } @Override protected String getReactApplicationKeyUnderTest() { return "MeasureLayoutTestApp"; } @Override protected ReactInstanceSpecForTest createReactInstanceSpecForTest() { mAssertModule = new AssertModule(); return new ReactInstanceSpecForTest() .addNativeModule(mAssertModule) .addJSModule(MeasureLayoutTestModule.class); } private void waitForBridgeIdleAndVerifyAsserts() { waitForBridgeAndUIIdle(); mAssertModule.verifyAssertsAndReset(); } public void testMeasure() { mTestJSModule.verifyMeasureOnViewA(); waitForBridgeIdleAndVerifyAsserts(); mTestJSModule.verifyMeasureOnViewC(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayout() { mTestJSModule.verifyMeasureLayoutCRelativeToA(); waitForBridgeIdleAndVerifyAsserts(); mTestJSModule.verifyMeasureLayoutCRelativeToB(); waitForBridgeIdleAndVerifyAsserts(); mTestJSModule.verifyMeasureLayoutCRelativeToSelf(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayoutRelativeToParent() { mTestJSModule.verifyMeasureLayoutRelativeToParentOnViewA(); waitForBridgeIdleAndVerifyAsserts(); mTestJSModule.verifyMeasureLayoutRelativeToParentOnViewB(); waitForBridgeIdleAndVerifyAsserts(); mTestJSModule.verifyMeasureLayoutRelativeToParentOnViewC(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayoutCallsErrorCallbackWhenViewIsNotChildOfAncestor() { mTestJSModule.verifyMeasureLayoutDRelativeToB(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayoutCallsErrorCallbackWhenViewDoesNotExist() { mTestJSModule.verifyMeasureLayoutNonExistentTag(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayoutCallsErrorCallbackWhenAncestorDoesNotExist() { mTestJSModule.verifyMeasureLayoutNonExistentAncestor(); waitForBridgeIdleAndVerifyAsserts(); } public void testMeasureLayoutRelativeToParentCallsErrorCallbackWhenViewDoesNotExist() { mTestJSModule.verifyMeasureLayoutRelativeToParentNonExistentTag(); waitForBridgeIdleAndVerifyAsserts(); } }