mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
b39c75f20e
Summary: It makes perfect sense because `Builder` builds totally new shadow trees, so those are not sealed or used by anyone yet. Assigning it to const shared pointer will do logical sealing (and it does not requires const-cast). Fewer const-casts in the code, fewer bugs. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D19596284 fbshipit-source-id: 75d1c706034958ba7e4bc80a68af75a57c46eb6f
103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include <memory>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <react/components/root/RootComponentDescriptor.h>
|
|
#include <react/components/view/ViewComponentDescriptor.h>
|
|
#include <react/element/ComponentBuilder.h>
|
|
#include <react/element/Element.h>
|
|
#include <react/element/testUtils.h>
|
|
#include <react/uimanager/ComponentDescriptorProviderRegistry.h>
|
|
|
|
using namespace facebook::react;
|
|
|
|
TEST(ElementTest, testNormalCases) {
|
|
auto builder = simpleComponentBuilder();
|
|
|
|
auto shadowNodeA = std::shared_ptr<RootShadowNode>{};
|
|
auto shadowNodeAA = std::shared_ptr<ViewShadowNode>{};
|
|
auto shadowNodeAB = std::shared_ptr<ViewShadowNode>{};
|
|
auto shadowNodeABA = std::shared_ptr<ViewShadowNode>{};
|
|
|
|
auto propsAA = std::make_shared<ViewProps>();
|
|
propsAA->nativeId = "node AA";
|
|
|
|
// clang-format off
|
|
auto element =
|
|
Element<RootShadowNode>()
|
|
.reference(shadowNodeA)
|
|
.tag(1)
|
|
.props([]() {
|
|
auto props = std::make_shared<RootProps>();
|
|
props->nativeId = "node A";
|
|
return props;
|
|
})
|
|
.finalize([](RootShadowNode &shadowNode){
|
|
shadowNode.sealRecursive();
|
|
})
|
|
.children({
|
|
Element<ViewShadowNode>()
|
|
.reference(shadowNodeAA)
|
|
.tag(2)
|
|
.props(propsAA),
|
|
Element<ViewShadowNode>()
|
|
.reference(shadowNodeAB)
|
|
.tag(3)
|
|
.props([]() {
|
|
auto props = std::make_shared<ViewProps>();
|
|
props->nativeId = "node AB";
|
|
return props;
|
|
})
|
|
.children({
|
|
Element<ViewShadowNode>()
|
|
.reference(shadowNodeABA)
|
|
.tag(4)
|
|
.props([]() {
|
|
auto props = std::make_shared<ViewProps>();
|
|
props->nativeId = "node ABA";
|
|
return props;
|
|
})
|
|
})
|
|
});
|
|
// clang-format on
|
|
|
|
auto shadowNode = builder.build(element);
|
|
|
|
EXPECT_EQ(shadowNode, shadowNodeA);
|
|
|
|
// Tags
|
|
EXPECT_EQ(shadowNodeA->getTag(), 1);
|
|
EXPECT_EQ(shadowNodeAA->getTag(), 2);
|
|
EXPECT_EQ(shadowNodeAB->getTag(), 3);
|
|
EXPECT_EQ(shadowNodeABA->getTag(), 4);
|
|
|
|
// Children
|
|
EXPECT_EQ(shadowNodeA->getChildren().size(), 2);
|
|
EXPECT_EQ(shadowNodeAA->getChildren().size(), 0);
|
|
EXPECT_EQ(shadowNodeAB->getChildren().size(), 1);
|
|
EXPECT_EQ(shadowNodeABA->getChildren().size(), 0);
|
|
EXPECT_EQ(
|
|
shadowNodeA->getChildren(),
|
|
(ShadowNode::ListOfShared{shadowNodeAA, shadowNodeAB}));
|
|
EXPECT_EQ(
|
|
shadowNodeAB->getChildren(), (ShadowNode::ListOfShared{shadowNodeABA}));
|
|
|
|
// Props
|
|
EXPECT_EQ(shadowNodeA->getProps()->nativeId, "node A");
|
|
EXPECT_EQ(shadowNodeABA->getProps()->nativeId, "node ABA");
|
|
EXPECT_EQ(shadowNodeAA->getProps(), propsAA);
|
|
|
|
// Finalize
|
|
EXPECT_TRUE(shadowNodeA->getSealed());
|
|
EXPECT_TRUE(shadowNodeAA->getSealed());
|
|
EXPECT_TRUE(shadowNodeAB->getSealed());
|
|
EXPECT_TRUE(shadowNodeABA->getSealed());
|
|
}
|