#include #include #include "renderive/base/node/Node.hpp" struct Multiway_Node_Test_Owner {}; struct Multiway_Node_Test_Tag {}; using Multiway_Node_Test_Type = Multiway_Node; static_assert(Multiway_Node_Type); static_assert(!std::same_as, Multiway_Node_Test_Type>); TEST(multiway_node_test, reparents_child_and_preserves_order) { Multiway_Node_Test_Owner first_owner; Multiway_Node_Test_Owner second_owner; Multiway_Node_Test_Owner third_owner; Multiway_Node_Test_Type root; Multiway_Node_Test_Type first(&first_owner); Multiway_Node_Test_Type second(&second_owner); Multiway_Node_Test_Type third(&third_owner); root.append_child(first); root.append_child(second); first.append_child(third); EXPECT_EQ(root.children.size(), 2); EXPECT_EQ(first.children.front(), &third); EXPECT_EQ(third.parent, &first); second.append_child(third); EXPECT_TRUE(first.children.empty()); EXPECT_EQ(third.parent, &second); } TEST(multiway_node_test, rejects_cycles) { Multiway_Node_Test_Type root; Multiway_Node_Test_Type child; root.append_child(child); EXPECT_THROW(child.append_child(root), std::invalid_argument); }