/* * 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 #include "TestComponent.h" using namespace facebook::react; /* *┌─────────────────────────┐ *│nodeA_ │ *│ │ *│ │ *│ │ *│ │ *│ │ *│ │ *│ ┌────────────────┐ │ *│ │nodeAA_ │ │ *│ │ │ │ *│ │ ┌───────┐ │ │ *│ │ │nodeAA_│ │ │ *│ │ │ │ │ │ *│ │ └───────┘ │ │ *│ └────────────────┘ │ *└─────────────────────────┘ */ class FindNodeAtPointTest : public ::testing::Test { protected: FindNodeAtPointTest() : eventDispatcher_(std::shared_ptr()), componentDescriptor_(TestComponentDescriptor({eventDispatcher_})) { auto traits = TestShadowNode::BaseTraits(); auto familyA = std::make_shared( ShadowNodeFamilyFragment{ /* .tag = */ 9, /* .surfaceId = */ 1, /* .eventEmitter = */ nullptr, }, eventDispatcher_, componentDescriptor_); nodeA_ = std::make_shared( ShadowNodeFragment{ /* .props = */ std::make_shared(), /* .children = */ ShadowNode::emptySharedShadowNodeSharedList(), }, familyA, traits); auto familyAA = std::make_shared( ShadowNodeFamilyFragment{ /* .tag = */ 10, /* .surfaceId = */ 1, /* .eventEmitter = */ nullptr, }, eventDispatcher_, componentDescriptor_); nodeAA_ = std::make_shared( ShadowNodeFragment{ /* .props = */ std::make_shared(), /* .children = */ ShadowNode::emptySharedShadowNodeSharedList(), }, familyAA, traits); auto familyAAA = std::make_shared( ShadowNodeFamilyFragment{ /* .tag = */ 11, /* .surfaceId = */ 1, /* .eventEmitter = */ nullptr, }, eventDispatcher_, componentDescriptor_); nodeAAA_ = std::make_shared( ShadowNodeFragment{ /* .props = */ std::make_shared(), /* .children = */ ShadowNode::emptySharedShadowNodeSharedList(), }, familyAAA, traits); nodeA_->appendChild(nodeAA_); nodeAA_->appendChild(nodeAAA_); auto layoutMetrics = EmptyLayoutMetrics; layoutMetrics.frame = facebook::react::Rect{ facebook::react::Point{0, 0}, facebook::react::Size{1000, 1000}}; nodeA_->setLayoutMetrics(layoutMetrics); layoutMetrics.frame = facebook::react::Rect{ facebook::react::Point{100, 100}, facebook::react::Size{100, 100}}; nodeAA_->setLayoutMetrics(layoutMetrics); layoutMetrics.frame = facebook::react::Rect{facebook::react::Point{10, 10}, facebook::react::Size{10, 10}}; nodeAAA_->setLayoutMetrics(layoutMetrics); } std::shared_ptr eventDispatcher_; std::shared_ptr nodeA_; std::shared_ptr nodeAA_; std::shared_ptr nodeAAA_; TestComponentDescriptor componentDescriptor_; }; TEST_F(FindNodeAtPointTest, withoutTransform) { EXPECT_EQ( LayoutableShadowNode::findNodeAtPoint(nodeA_, {115, 115}), nodeAAA_); EXPECT_EQ(LayoutableShadowNode::findNodeAtPoint(nodeA_, {105, 105}), nodeAA_); EXPECT_EQ(LayoutableShadowNode::findNodeAtPoint(nodeA_, {900, 900}), nodeA_); EXPECT_EQ( LayoutableShadowNode::findNodeAtPoint(nodeA_, {1001, 1001}), nullptr); } TEST_F(FindNodeAtPointTest, viewIsTranslated) { nodeA_->_contentOriginOffset = {-100, -100}; EXPECT_EQ( LayoutableShadowNode::findNodeAtPoint(nodeA_, {15, 15})->getTag(), nodeAAA_->getTag()); EXPECT_EQ(LayoutableShadowNode::findNodeAtPoint(nodeA_, {5, 5}), nodeAA_); } TEST_F(FindNodeAtPointTest, viewIsScaled) { nodeAAA_->_transform = Transform::Identity() * Transform::Scale(0.5, 0.5, 0); EXPECT_EQ( LayoutableShadowNode::findNodeAtPoint(nodeA_, {119, 119})->getTag(), nodeAA_->getTag()); }