/* * 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. */ #include #include static std::vector getChildren(YGNodeRef const node) { const auto count = YGNodeGetChildCount(node); std::vector children; children.reserve(count); for (size_t i = 0; i < count; i++) { children.push_back(YGNodeGetChild(node, i)); } return children; } TEST(YogaTest, set_children_adds_children_to_parent) { YGNodeRef const root = YGNodeNew(); YGNodeRef const root_child0 = YGNodeNew(); YGNodeRef const root_child1 = YGNodeNew(); YGNodeRef children[] = {root_child0, root_child1}; YGNodeSetChildren(root, children, 2); const std::vector expectedChildren = {root_child0, root_child1}; ASSERT_EQ(getChildren(root), expectedChildren); const std::vector owners = { YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)}; const std::vector expectedOwners = {root, root}; ASSERT_EQ(owners, expectedOwners); YGNodeFreeRecursive(root); } TEST(YogaTest, set_children_to_empty_removes_old_children) { YGNodeRef const root = YGNodeNew(); YGNodeRef const root_child0 = YGNodeNew(); YGNodeRef const root_child1 = YGNodeNew(); YGNodeRef children[] = {root_child0, root_child1}; YGNodeSetChildren(root, children, 2); YGNodeSetChildren(root, nullptr, 0); const std::vector expectedChildren = {}; ASSERT_EQ(getChildren(root), expectedChildren); const std::vector owners = { YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)}; const std::vector expectedOwners = {nullptr, nullptr}; ASSERT_EQ(owners, expectedOwners); YGNodeFreeRecursive(root); } TEST(YogaTest, set_children_replaces_non_common_children) { YGNodeRef const root = YGNodeNew(); YGNodeRef const root_child0 = YGNodeNew(); YGNodeRef const root_child1 = YGNodeNew(); YGNodeRef children1[] = {root_child0, root_child1}; YGNodeSetChildren(root, children1, 2); YGNodeRef const root_child2 = YGNodeNew(); YGNodeRef const root_child3 = YGNodeNew(); YGNodeRef children2[] = {root_child2, root_child3}; YGNodeSetChildren(root, children2, 2); const std::vector expectedChildren = {root_child2, root_child3}; ASSERT_EQ(getChildren(root), expectedChildren); const std::vector owners = { YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)}; const std::vector expectedOwners = {nullptr, nullptr}; ASSERT_EQ(owners, expectedOwners); YGNodeFreeRecursive(root); YGNodeFree(root_child0); YGNodeFree(root_child1); } TEST(YogaTest, set_children_keeps_and_reorders_common_children) { YGNodeRef const root = YGNodeNew(); YGNodeRef const root_child0 = YGNodeNew(); YGNodeRef const root_child1 = YGNodeNew(); YGNodeRef const root_child2 = YGNodeNew(); YGNodeRef children1[] = {root_child0, root_child1, root_child2}; YGNodeSetChildren(root, children1, 3); YGNodeRef const root_child3 = YGNodeNew(); YGNodeRef children2[] = {root_child2, root_child1, root_child3}; YGNodeSetChildren(root, children2, 3); const std::vector expectedChildren = { root_child2, root_child1, root_child3}; ASSERT_EQ(getChildren(root), expectedChildren); const std::vector owners = { YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1), YGNodeGetOwner(root_child2), YGNodeGetOwner(root_child3)}; const std::vector expectedOwners = {nullptr, root, root, root}; ASSERT_EQ(owners, expectedOwners); YGNodeFreeRecursive(root); YGNodeFree(root_child0); }