mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
basic actor node
This commit is contained in:
@@ -8,20 +8,21 @@
|
||||
|
||||
#include "_high.hpp"
|
||||
|
||||
#include "assets.hpp"
|
||||
#include "library.hpp"
|
||||
#include "library.inl"
|
||||
#include "starter.hpp"
|
||||
#include "world.hpp"
|
||||
|
||||
#include "components/camera.hpp"
|
||||
#include "components/drawable.hpp"
|
||||
#include "components/sprite.hpp"
|
||||
#include "components/transform.hpp"
|
||||
|
||||
#include "scene/actor.hpp"
|
||||
#include "scene/node.hpp"
|
||||
#include "scene/node.inl"
|
||||
#include "scene/scene.hpp"
|
||||
|
||||
#include "systems/render_system.hpp"
|
||||
#include "systems/sprite_system.hpp"
|
||||
|
||||
#include "assets.hpp"
|
||||
#include "library.hpp"
|
||||
#include "library.inl"
|
||||
#include "starter.hpp"
|
||||
#include "world.hpp"
|
||||
|
||||
@@ -16,13 +16,17 @@ namespace e2d
|
||||
{
|
||||
using namespace ecs_hpp;
|
||||
}
|
||||
}
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class camera;
|
||||
class drawable;
|
||||
class sprite;
|
||||
class transform2d;
|
||||
class transform3d;
|
||||
|
||||
class actor;
|
||||
class node;
|
||||
class scene;
|
||||
|
||||
|
||||
@@ -7,17 +7,18 @@
|
||||
#pragma once
|
||||
|
||||
#include "../_high.hpp"
|
||||
#include "../scene/scene.hpp"
|
||||
#include "../scene/node.hpp"
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class drawable {
|
||||
public:
|
||||
drawable();
|
||||
drawable(const node_iptr& node);
|
||||
|
||||
node_iptr node() noexcept;
|
||||
const_node_iptr node() const noexcept;
|
||||
private:
|
||||
node_iptr node_;
|
||||
node_iptr node_ = node::create();
|
||||
};
|
||||
}
|
||||
|
||||
33
headers/enduro2d/high/scene/actor.hpp
Normal file
33
headers/enduro2d/high/scene/actor.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
/*******************************************************************************
|
||||
* This file is part of the "Enduro2D"
|
||||
* For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||
* Copyright (C) 2018 Matvey Cherevko
|
||||
******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../_high.hpp"
|
||||
#include "node.hpp"
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class actor;
|
||||
using actor_iptr = intrusive_ptr<actor>;
|
||||
using const_actor_iptr = intrusive_ptr<const actor>;
|
||||
}
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
class actor final : public node {
|
||||
public:
|
||||
~actor() noexcept final;
|
||||
static actor_iptr create(const ecs::entity& entity);
|
||||
|
||||
ecs::entity entity() noexcept;
|
||||
ecs::const_entity entity() const noexcept;
|
||||
private:
|
||||
actor(const ecs::entity& entity);
|
||||
private:
|
||||
ecs::entity entity_;
|
||||
};
|
||||
}
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
drawable::drawable() = default;
|
||||
|
||||
drawable::drawable(const node_iptr& node)
|
||||
: node_(node) {}
|
||||
|
||||
|
||||
27
sources/enduro2d/high/scene/actor.cpp
Normal file
27
sources/enduro2d/high/scene/actor.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
/*******************************************************************************
|
||||
* This file is part of the "Enduro2D"
|
||||
* For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||
* Copyright (C) 2018 Matvey Cherevko
|
||||
******************************************************************************/
|
||||
|
||||
#include <enduro2d/high/scene/actor.hpp>
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
actor::actor(const ecs::entity& entity)
|
||||
: entity_(entity) {}
|
||||
|
||||
actor::~actor() noexcept = default;
|
||||
|
||||
actor_iptr actor::create(const ecs::entity& entity) {
|
||||
return actor_iptr(new actor(entity));
|
||||
}
|
||||
|
||||
ecs::entity actor::entity() noexcept {
|
||||
return entity_;
|
||||
}
|
||||
|
||||
ecs::const_entity actor::entity() const noexcept {
|
||||
return entity_;
|
||||
}
|
||||
}
|
||||
@@ -42,8 +42,28 @@ function(add_e2d_tests NAME)
|
||||
add_test(${TESTS_NAME} ${TESTS_NAME})
|
||||
endfunction(add_e2d_tests)
|
||||
|
||||
add_e2d_tests(base)
|
||||
add_e2d_tests(core)
|
||||
add_e2d_tests(high)
|
||||
add_e2d_tests(math)
|
||||
add_e2d_tests(utils)
|
||||
option(E2D_BUILD_BASE_UNTESTS "Build base untests" ON)
|
||||
option(E2D_BUILD_CORE_UNTESTS "Build core untests" ON)
|
||||
option(E2D_BUILD_HIGH_UNTESTS "Build high untests" ON)
|
||||
option(E2D_BUILD_MATH_UNTESTS "Build math untests" ON)
|
||||
option(E2D_BUILD_UTILS_UNTESTS "Build utils untests" ON)
|
||||
|
||||
if(E2D_BUILD_BASE_UNTESTS)
|
||||
add_e2d_tests(base)
|
||||
endif()
|
||||
|
||||
if(E2D_BUILD_CORE_UNTESTS)
|
||||
add_e2d_tests(core)
|
||||
endif()
|
||||
|
||||
if(E2D_BUILD_HIGH_UNTESTS)
|
||||
add_e2d_tests(high)
|
||||
endif()
|
||||
|
||||
if(E2D_BUILD_MATH_UNTESTS)
|
||||
add_e2d_tests(math)
|
||||
endif()
|
||||
|
||||
if(E2D_BUILD_UTILS_UNTESTS)
|
||||
add_e2d_tests(utils)
|
||||
endif()
|
||||
|
||||
@@ -1,800 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* This file is part of the "Enduro2D"
|
||||
* For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||
* Copyright (C) 2018 Matvey Cherevko
|
||||
******************************************************************************/
|
||||
|
||||
#include "_high.hpp"
|
||||
using namespace e2d;
|
||||
|
||||
namespace
|
||||
{
|
||||
class fake_node : public node {
|
||||
public:
|
||||
void on_change_parent_() noexcept override {
|
||||
++parent_changes;
|
||||
++s_parent_changes;
|
||||
}
|
||||
|
||||
void on_change_children_() noexcept override {
|
||||
++children_changes;
|
||||
++s_children_changes;
|
||||
}
|
||||
public:
|
||||
static void reset_counters() noexcept {
|
||||
s_parent_changes = 0;
|
||||
s_children_changes = 0;
|
||||
}
|
||||
std::size_t parent_changes{0};
|
||||
std::size_t children_changes{0};
|
||||
static std::size_t s_parent_changes;
|
||||
static std::size_t s_children_changes;
|
||||
public:
|
||||
static intrusive_ptr<fake_node> create() {
|
||||
return intrusive_ptr<fake_node>(new fake_node());
|
||||
}
|
||||
|
||||
static intrusive_ptr<fake_node> create(const node_iptr& parent) {
|
||||
auto child = create();
|
||||
if ( parent ) {
|
||||
parent->add_child(child);
|
||||
}
|
||||
return child;
|
||||
}
|
||||
};
|
||||
|
||||
std::size_t fake_node::s_parent_changes{0};
|
||||
std::size_t fake_node::s_children_changes{0};
|
||||
}
|
||||
|
||||
TEST_CASE("node") {
|
||||
SECTION("empty_node") {
|
||||
auto n = node::create();
|
||||
REQUIRE(n);
|
||||
REQUIRE(n->root() == n);
|
||||
REQUIRE_FALSE(n->parent());
|
||||
REQUIRE(n->child_count() == 0);
|
||||
REQUIRE_FALSE(n->prev_sibling());
|
||||
REQUIRE_FALSE(n->next_sibling());
|
||||
{
|
||||
const_node_iptr cn = n;
|
||||
REQUIRE(cn);
|
||||
REQUIRE(cn->root() == cn);
|
||||
REQUIRE_FALSE(cn->parent());
|
||||
REQUIRE(cn->child_count() == 0);
|
||||
REQUIRE_FALSE(cn->prev_sibling());
|
||||
REQUIRE_FALSE(cn->next_sibling());
|
||||
}
|
||||
}
|
||||
SECTION("parent/root") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create();
|
||||
|
||||
REQUIRE(p->add_child(n));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE(p->add_child(n));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE_FALSE(p->add_child(nullptr));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
|
||||
auto n1 = node::create(p);
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
auto n2 = node::create(nullptr);
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create();
|
||||
|
||||
auto n = node::create(p1);
|
||||
REQUIRE(n->parent() == p1);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p2->child_count() == 0);
|
||||
|
||||
REQUIRE(p2->add_child(n));
|
||||
REQUIRE(n->parent() == p2);
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p2->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create(p1);
|
||||
|
||||
auto n1 = node::create(p1);
|
||||
auto n2 = node::create(p2);
|
||||
|
||||
REQUIRE(n1->parent() == p1);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
|
||||
REQUIRE(n1->root() == p1);
|
||||
REQUIRE(n2->root() == p1);
|
||||
|
||||
auto n3 = node::create();
|
||||
REQUIRE_FALSE(n3->parent());
|
||||
REQUIRE(n3->root() == n3);
|
||||
|
||||
{
|
||||
const_node_iptr cn1 = n1;
|
||||
const_node_iptr cn2 = n2;
|
||||
|
||||
REQUIRE(cn1->parent() == p1);
|
||||
REQUIRE(cn2->parent() == p2);
|
||||
|
||||
REQUIRE(cn1->root() == p1);
|
||||
REQUIRE(cn2->root() == p1);
|
||||
|
||||
const_node_iptr cn3 = node::create();
|
||||
REQUIRE_FALSE(cn3->parent());
|
||||
REQUIRE(cn3->root() == cn3);
|
||||
}
|
||||
}
|
||||
}
|
||||
SECTION("has_parent") {
|
||||
auto p = node::create();
|
||||
REQUIRE_FALSE(p->has_parent());
|
||||
REQUIRE_FALSE(p->has_parent(nullptr));
|
||||
|
||||
auto n = node::create(p);
|
||||
REQUIRE(n->has_parent());
|
||||
REQUIRE(n->has_parent(p));
|
||||
REQUIRE(n->has_parent(nullptr));
|
||||
|
||||
auto pp = node::create();
|
||||
REQUIRE_FALSE(n->has_parent(pp));
|
||||
|
||||
pp->add_child(p);
|
||||
REQUIRE(n->has_parent(p));
|
||||
REQUIRE(n->has_parent(pp));
|
||||
}
|
||||
SECTION("auto_remove/remove_all_children") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create(p);
|
||||
n.reset();
|
||||
REQUIRE(p->child_count() == 0);
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create(p);
|
||||
p.reset();
|
||||
REQUIRE_FALSE(n->parent());
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
REQUIRE(p->child_count() == 2);
|
||||
REQUIRE(p->remove_all_children() == 2);
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 0);
|
||||
REQUIRE(p->remove_all_children() == 0);
|
||||
}
|
||||
}
|
||||
SECTION("auto_remove/remove_all_children/events") {
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n = fake_node::create(p);
|
||||
n.reset();
|
||||
REQUIRE(p->children_changes == 2);
|
||||
REQUIRE(fake_node::s_parent_changes == 1);
|
||||
}
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n = fake_node::create(p);
|
||||
p.reset();
|
||||
REQUIRE(fake_node::s_children_changes == 1);
|
||||
REQUIRE(n->parent_changes == 2);
|
||||
}
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
REQUIRE(p->remove_all_children() == 2);
|
||||
REQUIRE(p->remove_all_children() == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(fake_node::s_parent_changes == 4);
|
||||
}
|
||||
}
|
||||
SECTION("remove_from_parent") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
|
||||
auto np = node::create();
|
||||
np->remove_from_parent();
|
||||
REQUIRE(np->root() == np);
|
||||
REQUIRE_FALSE(np->parent());
|
||||
|
||||
REQUIRE(p->child_count() == 2);
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p);
|
||||
|
||||
REQUIRE(n1->remove_from_parent());
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE(n2->remove_from_parent());
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 0);
|
||||
}
|
||||
SECTION("remove_from_parent/events") {
|
||||
fake_node::reset_counters();
|
||||
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
|
||||
auto np = fake_node::create();
|
||||
np->remove_from_parent();
|
||||
REQUIRE(fake_node::s_parent_changes == 2);
|
||||
REQUIRE(fake_node::s_children_changes == 2);
|
||||
|
||||
REQUIRE(n1->remove_from_parent());
|
||||
REQUIRE(fake_node::s_parent_changes == 3);
|
||||
REQUIRE(fake_node::s_children_changes == 3);
|
||||
|
||||
REQUIRE(n2->remove_from_parent());
|
||||
REQUIRE(fake_node::s_parent_changes == 4);
|
||||
REQUIRE(fake_node::s_children_changes == 4);
|
||||
}
|
||||
SECTION("child_count/child_count_recursive") {
|
||||
auto p1 = node::create();
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p1->child_count_recursive() == 0);
|
||||
|
||||
auto p2 = node::create(p1);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p1->child_count_recursive() == 1);
|
||||
REQUIRE(p2->child_count() == 0);
|
||||
REQUIRE(p2->child_count_recursive() == 0);
|
||||
|
||||
auto n1 = node::create(p2);
|
||||
auto n2 = node::create(p2);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p1->child_count_recursive() == 3);
|
||||
REQUIRE(p2->child_count() == 2);
|
||||
REQUIRE(p2->child_count_recursive() == 2);
|
||||
}
|
||||
SECTION("send_backward/bring_to_back") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n1 n3 n2
|
||||
REQUIRE(n1->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE_FALSE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
}
|
||||
{
|
||||
auto n = node::create();
|
||||
REQUIRE_FALSE(n->send_backward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
}
|
||||
}
|
||||
SECTION("send_backward/bring_to_back/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
auto n3 = fake_node::create(p);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n1 n3 n2
|
||||
REQUIRE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE_FALSE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->children_changes == 6);
|
||||
}
|
||||
{
|
||||
auto n = fake_node::create();
|
||||
REQUIRE_FALSE(n->send_backward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
REQUIRE(n->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("send_forward/bring_to_front") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n1 n3
|
||||
REQUIRE(n2->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE_FALSE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
}
|
||||
{
|
||||
auto n = node::create();
|
||||
REQUIRE_FALSE(n->send_forward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
}
|
||||
}
|
||||
SECTION("send_forward/bring_to_front/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
auto n3 = fake_node::create(p);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n1 n3
|
||||
REQUIRE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE_FALSE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
|
||||
REQUIRE(p->children_changes == 6);
|
||||
}
|
||||
{
|
||||
auto n = fake_node::create();
|
||||
REQUIRE_FALSE(n->send_forward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
REQUIRE(n->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("last_child/first_child") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(p->last_child() == n3);
|
||||
REQUIRE(p->first_child() == n1);
|
||||
|
||||
{
|
||||
const_node_iptr cp = p;
|
||||
|
||||
REQUIRE(cp->last_child() == n3);
|
||||
REQUIRE(cp->first_child() == n1);
|
||||
}
|
||||
}
|
||||
SECTION("prev_sibling/next_sibling") {
|
||||
auto p = node::create();
|
||||
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
|
||||
REQUIRE(n2->prev_sibling() == n1);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n3->prev_sibling() == n2);
|
||||
REQUIRE_FALSE(n3->next_sibling());
|
||||
|
||||
auto n4 = node::create();
|
||||
REQUIRE_FALSE(n4->prev_sibling());
|
||||
REQUIRE_FALSE(n4->next_sibling());
|
||||
|
||||
{
|
||||
const_node_iptr cn1 = n1;
|
||||
const_node_iptr cn2 = n2;
|
||||
const_node_iptr cn3 = n3;
|
||||
|
||||
REQUIRE_FALSE(cn1->prev_sibling());
|
||||
REQUIRE(cn1->next_sibling() == cn2);
|
||||
|
||||
REQUIRE(cn2->prev_sibling() == cn1);
|
||||
REQUIRE(cn2->next_sibling() == cn3);
|
||||
|
||||
REQUIRE(cn3->prev_sibling() == cn2);
|
||||
REQUIRE_FALSE(cn3->next_sibling());
|
||||
|
||||
const_node_iptr cn4 = n4;
|
||||
REQUIRE_FALSE(cn4->prev_sibling());
|
||||
REQUIRE_FALSE(cn4->next_sibling());
|
||||
}
|
||||
}
|
||||
SECTION("add_child_to_back/add_child_to_front") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create();
|
||||
auto n2 = node::create();
|
||||
auto n3 = node::create();
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child_to_back(n1));
|
||||
REQUIRE(p->add_child_to_back(n2));
|
||||
REQUIRE(p->add_child_to_back(n3)); // n3 n2 n1
|
||||
REQUIRE_FALSE(p->add_child_to_back(nullptr));
|
||||
|
||||
REQUIRE(n1->prev_sibling() == n2);
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE_FALSE(n3->prev_sibling());
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE(n3->prev_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE(n3->prev_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_back(n1));
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE(n2->parent() == p);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child_to_front(n1));
|
||||
REQUIRE(p->add_child_to_front(n2));
|
||||
REQUIRE(p->add_child_to_front(n3)); // n1 n2 n3
|
||||
REQUIRE_FALSE(p->add_child_to_front(nullptr));
|
||||
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE_FALSE(n3->next_sibling());
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_front(n1));
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE(n2->parent() == p);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_to_back/add_child_to_front/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child_to_back(n1));
|
||||
REQUIRE(p->add_child_to_back(n2));
|
||||
REQUIRE(p->add_child_to_back(n3)); // n3 n2 n1
|
||||
REQUIRE_FALSE(p->add_child_to_back(nullptr));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_back(n1));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
REQUIRE(n1->parent_changes == 2);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
REQUIRE(n2->parent_changes == 1);
|
||||
REQUIRE(n2->children_changes == 0);
|
||||
}
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child_to_front(n1));
|
||||
REQUIRE(p->add_child_to_front(n2));
|
||||
REQUIRE(p->add_child_to_front(n3)); // n1 n2 n3
|
||||
REQUIRE_FALSE(p->add_child_to_front(nullptr));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_front(n1));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
REQUIRE(n1->parent_changes == 2);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
REQUIRE(n2->parent_changes == 1);
|
||||
REQUIRE(n2->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_after/add_child_before") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create();
|
||||
auto n2 = node::create();
|
||||
auto n3 = node::create();
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n2)); // n2 n1
|
||||
REQUIRE(p->add_child_before(n1, n3)); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n1)); // n2 n3 n1
|
||||
REQUIRE(p->add_child_before(n3, n2)); // n2 n3 n1
|
||||
|
||||
REQUIRE_FALSE(p->add_child_before(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(p, n3));
|
||||
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(p->add_child_before(n3, n1)); // n2 n1 n3
|
||||
REQUIRE(p->add_child_before(n2, n3)); // n3 n2 n1
|
||||
|
||||
REQUIRE(n3->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n1);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_before(n4, n2)); // n2 n4
|
||||
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE_FALSE(n2->prev_sibling());
|
||||
REQUIRE(n2->next_sibling() == n4);
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n2)); // n1 n2
|
||||
REQUIRE(p->add_child_after(n1, n3)); // n1 n3 n2
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n1)); // n1 n3 n2
|
||||
REQUIRE(p->add_child_after(n3, n2)); // n1 n3 n2
|
||||
|
||||
REQUIRE_FALSE(p->add_child_after(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(p, n3));
|
||||
|
||||
REQUIRE(n1->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n2);
|
||||
|
||||
REQUIRE(p->add_child_after(n3, n1)); // n3 n1 n2
|
||||
REQUIRE(p->add_child_after(n2, n3)); // n1 n2 n3
|
||||
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_after(n4, n2)); // n4 n2
|
||||
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n2->prev_sibling() == n4);
|
||||
REQUIRE_FALSE(n2->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_after/add_child_before/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
REQUIRE(p->add_child_before(n1, n2)); // n2 n1
|
||||
REQUIRE(p->add_child_before(n1, n3)); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n1)); // n2 n3 n1
|
||||
REQUIRE(p->add_child_before(n3, n2)); // n2 n3 n1
|
||||
|
||||
REQUIRE_FALSE(p->add_child_before(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(p, n3));
|
||||
|
||||
REQUIRE(p->add_child_before(n3, n1)); // n2 n1 n3
|
||||
REQUIRE(p->add_child_before(n2, n3)); // n3 n2 n1
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_before(n4, n2)); // n2 n4
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 6);
|
||||
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n2->parent_changes == 2);
|
||||
}
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
REQUIRE(p->add_child_after(n1, n2)); // n1 n2
|
||||
REQUIRE(p->add_child_after(n1, n3)); // n1 n3 n2
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n1)); // n1 n3 n2
|
||||
REQUIRE(p->add_child_after(n3, n2)); // n1 n3 n2
|
||||
|
||||
REQUIRE_FALSE(p->add_child_after(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(p, n3));
|
||||
|
||||
REQUIRE(p->add_child_after(n3, n1)); // n3 n1 n2
|
||||
REQUIRE(p->add_child_after(n2, n3)); // n1 n2 n3
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_after(n4, n2)); // n4 n2
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 6);
|
||||
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n2->parent_changes == 2);
|
||||
}
|
||||
}
|
||||
SECTION("for_each_child") {
|
||||
auto p = node::create();
|
||||
array<node_iptr, 3> ns{
|
||||
node::create(p),
|
||||
node::create(p),
|
||||
node::create(p)};
|
||||
{
|
||||
std::size_t count = 0;
|
||||
p->for_each_child([&ns, &count](const node_iptr& n){
|
||||
REQUIRE(ns[count++] == n);
|
||||
});
|
||||
REQUIRE(count == 3);
|
||||
}
|
||||
{
|
||||
const_node_iptr cp = p;
|
||||
std::size_t count = 0;
|
||||
cp->for_each_child([&ns, &count](const const_node_iptr& n){
|
||||
REQUIRE(ns[count++] == n);
|
||||
});
|
||||
REQUIRE(count == 3);
|
||||
}
|
||||
}
|
||||
SECTION("destroy_node") {
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create(p1);
|
||||
auto n1 = node::create(p2);
|
||||
auto n2 = node::create(p2);
|
||||
|
||||
p2.reset();
|
||||
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p1->child_count_recursive() == 0);
|
||||
|
||||
REQUIRE(n1->root() == n1);
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
REQUIRE(n2->root() == n2);
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE_FALSE(n2->prev_sibling());
|
||||
REQUIRE_FALSE(n2->next_sibling());
|
||||
}
|
||||
SECTION("destroy_node/events") {
|
||||
fake_node::reset_counters();
|
||||
|
||||
auto p1 = fake_node::create();
|
||||
auto p2 = fake_node::create(p1);
|
||||
auto n1 = fake_node::create(p2);
|
||||
auto n2 = fake_node::create(p2);
|
||||
|
||||
REQUIRE(fake_node::s_parent_changes == 3);
|
||||
REQUIRE(fake_node::s_children_changes == 3);
|
||||
|
||||
p2.reset();
|
||||
|
||||
REQUIRE(fake_node::s_parent_changes == 5);
|
||||
REQUIRE(fake_node::s_children_changes == 4);
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,798 @@ using namespace e2d;
|
||||
|
||||
namespace
|
||||
{
|
||||
class fake_node : public node {
|
||||
public:
|
||||
void on_change_parent_() noexcept override {
|
||||
++parent_changes;
|
||||
++s_parent_changes;
|
||||
}
|
||||
|
||||
void on_change_children_() noexcept override {
|
||||
++children_changes;
|
||||
++s_children_changes;
|
||||
}
|
||||
public:
|
||||
static void reset_counters() noexcept {
|
||||
s_parent_changes = 0;
|
||||
s_children_changes = 0;
|
||||
}
|
||||
std::size_t parent_changes{0};
|
||||
std::size_t children_changes{0};
|
||||
static std::size_t s_parent_changes;
|
||||
static std::size_t s_children_changes;
|
||||
public:
|
||||
static intrusive_ptr<fake_node> create() {
|
||||
return intrusive_ptr<fake_node>(new fake_node());
|
||||
}
|
||||
|
||||
static intrusive_ptr<fake_node> create(const node_iptr& parent) {
|
||||
auto child = create();
|
||||
if ( parent ) {
|
||||
parent->add_child(child);
|
||||
}
|
||||
return child;
|
||||
}
|
||||
};
|
||||
|
||||
std::size_t fake_node::s_parent_changes{0};
|
||||
std::size_t fake_node::s_children_changes{0};
|
||||
}
|
||||
|
||||
TEST_CASE("scene") {
|
||||
SECTION("ctor") {
|
||||
scene_iptr s = scene::create();
|
||||
REQUIRE(s);
|
||||
REQUIRE(s->root());
|
||||
auto s = scene::create();
|
||||
REQUIRE(s);
|
||||
REQUIRE(s->root());
|
||||
}
|
||||
|
||||
TEST_CASE("node") {
|
||||
SECTION("empty_node") {
|
||||
auto n = node::create();
|
||||
REQUIRE(n);
|
||||
REQUIRE(n->root() == n);
|
||||
REQUIRE_FALSE(n->parent());
|
||||
REQUIRE(n->child_count() == 0);
|
||||
REQUIRE_FALSE(n->prev_sibling());
|
||||
REQUIRE_FALSE(n->next_sibling());
|
||||
{
|
||||
const_node_iptr cn = n;
|
||||
REQUIRE(cn);
|
||||
REQUIRE(cn->root() == cn);
|
||||
REQUIRE_FALSE(cn->parent());
|
||||
REQUIRE(cn->child_count() == 0);
|
||||
REQUIRE_FALSE(cn->prev_sibling());
|
||||
REQUIRE_FALSE(cn->next_sibling());
|
||||
}
|
||||
}
|
||||
SECTION("parent/root") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create();
|
||||
|
||||
REQUIRE(p->add_child(n));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE(p->add_child(n));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE_FALSE(p->add_child(nullptr));
|
||||
REQUIRE(n->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
|
||||
auto n1 = node::create(p);
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
auto n2 = node::create(nullptr);
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create();
|
||||
|
||||
auto n = node::create(p1);
|
||||
REQUIRE(n->parent() == p1);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p2->child_count() == 0);
|
||||
|
||||
REQUIRE(p2->add_child(n));
|
||||
REQUIRE(n->parent() == p2);
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p2->child_count() == 1);
|
||||
}
|
||||
{
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create(p1);
|
||||
|
||||
auto n1 = node::create(p1);
|
||||
auto n2 = node::create(p2);
|
||||
|
||||
REQUIRE(n1->parent() == p1);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
|
||||
REQUIRE(n1->root() == p1);
|
||||
REQUIRE(n2->root() == p1);
|
||||
|
||||
auto n3 = node::create();
|
||||
REQUIRE_FALSE(n3->parent());
|
||||
REQUIRE(n3->root() == n3);
|
||||
|
||||
{
|
||||
const_node_iptr cn1 = n1;
|
||||
const_node_iptr cn2 = n2;
|
||||
|
||||
REQUIRE(cn1->parent() == p1);
|
||||
REQUIRE(cn2->parent() == p2);
|
||||
|
||||
REQUIRE(cn1->root() == p1);
|
||||
REQUIRE(cn2->root() == p1);
|
||||
|
||||
const_node_iptr cn3 = node::create();
|
||||
REQUIRE_FALSE(cn3->parent());
|
||||
REQUIRE(cn3->root() == cn3);
|
||||
}
|
||||
}
|
||||
}
|
||||
SECTION("has_parent") {
|
||||
auto p = node::create();
|
||||
REQUIRE_FALSE(p->has_parent());
|
||||
REQUIRE_FALSE(p->has_parent(nullptr));
|
||||
|
||||
auto n = node::create(p);
|
||||
REQUIRE(n->has_parent());
|
||||
REQUIRE(n->has_parent(p));
|
||||
REQUIRE(n->has_parent(nullptr));
|
||||
|
||||
auto pp = node::create();
|
||||
REQUIRE_FALSE(n->has_parent(pp));
|
||||
|
||||
pp->add_child(p);
|
||||
REQUIRE(n->has_parent(p));
|
||||
REQUIRE(n->has_parent(pp));
|
||||
}
|
||||
SECTION("auto_remove/remove_all_children") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create(p);
|
||||
n.reset();
|
||||
REQUIRE(p->child_count() == 0);
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n = node::create(p);
|
||||
p.reset();
|
||||
REQUIRE_FALSE(n->parent());
|
||||
}
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
REQUIRE(p->child_count() == 2);
|
||||
REQUIRE(p->remove_all_children() == 2);
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 0);
|
||||
REQUIRE(p->remove_all_children() == 0);
|
||||
}
|
||||
}
|
||||
SECTION("auto_remove/remove_all_children/events") {
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n = fake_node::create(p);
|
||||
n.reset();
|
||||
REQUIRE(p->children_changes == 2);
|
||||
REQUIRE(fake_node::s_parent_changes == 1);
|
||||
}
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n = fake_node::create(p);
|
||||
p.reset();
|
||||
REQUIRE(fake_node::s_children_changes == 1);
|
||||
REQUIRE(n->parent_changes == 2);
|
||||
}
|
||||
{
|
||||
fake_node::reset_counters();
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
REQUIRE(p->remove_all_children() == 2);
|
||||
REQUIRE(p->remove_all_children() == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(fake_node::s_parent_changes == 4);
|
||||
}
|
||||
}
|
||||
SECTION("remove_from_parent") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
|
||||
auto np = node::create();
|
||||
np->remove_from_parent();
|
||||
REQUIRE(np->root() == np);
|
||||
REQUIRE_FALSE(np->parent());
|
||||
|
||||
REQUIRE(p->child_count() == 2);
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p);
|
||||
|
||||
REQUIRE(n1->remove_from_parent());
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE(p->child_count() == 1);
|
||||
|
||||
REQUIRE(n2->remove_from_parent());
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE(p->child_count() == 0);
|
||||
}
|
||||
SECTION("remove_from_parent/events") {
|
||||
fake_node::reset_counters();
|
||||
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
|
||||
auto np = fake_node::create();
|
||||
np->remove_from_parent();
|
||||
REQUIRE(fake_node::s_parent_changes == 2);
|
||||
REQUIRE(fake_node::s_children_changes == 2);
|
||||
|
||||
REQUIRE(n1->remove_from_parent());
|
||||
REQUIRE(fake_node::s_parent_changes == 3);
|
||||
REQUIRE(fake_node::s_children_changes == 3);
|
||||
|
||||
REQUIRE(n2->remove_from_parent());
|
||||
REQUIRE(fake_node::s_parent_changes == 4);
|
||||
REQUIRE(fake_node::s_children_changes == 4);
|
||||
}
|
||||
SECTION("child_count/child_count_recursive") {
|
||||
auto p1 = node::create();
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p1->child_count_recursive() == 0);
|
||||
|
||||
auto p2 = node::create(p1);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p1->child_count_recursive() == 1);
|
||||
REQUIRE(p2->child_count() == 0);
|
||||
REQUIRE(p2->child_count_recursive() == 0);
|
||||
|
||||
auto n1 = node::create(p2);
|
||||
auto n2 = node::create(p2);
|
||||
REQUIRE(p1->child_count() == 1);
|
||||
REQUIRE(p1->child_count_recursive() == 3);
|
||||
REQUIRE(p2->child_count() == 2);
|
||||
REQUIRE(p2->child_count_recursive() == 2);
|
||||
}
|
||||
SECTION("send_backward/bring_to_back") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n1 n3 n2
|
||||
REQUIRE(n1->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE_FALSE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
}
|
||||
{
|
||||
auto n = node::create();
|
||||
REQUIRE_FALSE(n->send_backward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
}
|
||||
}
|
||||
SECTION("send_backward/bring_to_back/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
auto n3 = fake_node::create(p);
|
||||
|
||||
REQUIRE(n3->send_backward()); // n1 n3 n2
|
||||
REQUIRE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE_FALSE(n3->send_backward()); // n3 n1 n2
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
REQUIRE(n2->bring_to_back()); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->children_changes == 6);
|
||||
}
|
||||
{
|
||||
auto n = fake_node::create();
|
||||
REQUIRE_FALSE(n->send_backward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
REQUIRE(n->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("send_forward/bring_to_front") {
|
||||
{
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n1 n3
|
||||
REQUIRE(n2->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE_FALSE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
}
|
||||
{
|
||||
auto n = node::create();
|
||||
REQUIRE_FALSE(n->send_forward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
}
|
||||
}
|
||||
SECTION("send_forward/bring_to_front/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create(p);
|
||||
auto n2 = fake_node::create(p);
|
||||
auto n3 = fake_node::create(p);
|
||||
|
||||
REQUIRE(n1->send_forward()); // n2 n1 n3
|
||||
REQUIRE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE_FALSE(n1->send_forward()); // n2 n3 n1
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
REQUIRE(n2->bring_to_front()); // n3 n1 n2
|
||||
|
||||
REQUIRE(p->children_changes == 6);
|
||||
}
|
||||
{
|
||||
auto n = fake_node::create();
|
||||
REQUIRE_FALSE(n->send_forward());
|
||||
REQUIRE_FALSE(n->bring_to_back());
|
||||
REQUIRE(n->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("last_child/first_child") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE(p->last_child() == n3);
|
||||
REQUIRE(p->first_child() == n1);
|
||||
|
||||
{
|
||||
const_node_iptr cp = p;
|
||||
|
||||
REQUIRE(cp->last_child() == n3);
|
||||
REQUIRE(cp->first_child() == n1);
|
||||
}
|
||||
}
|
||||
SECTION("prev_sibling/next_sibling") {
|
||||
auto p = node::create();
|
||||
|
||||
auto n1 = node::create(p);
|
||||
auto n2 = node::create(p);
|
||||
auto n3 = node::create(p);
|
||||
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
|
||||
REQUIRE(n2->prev_sibling() == n1);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
REQUIRE(n3->prev_sibling() == n2);
|
||||
REQUIRE_FALSE(n3->next_sibling());
|
||||
|
||||
auto n4 = node::create();
|
||||
REQUIRE_FALSE(n4->prev_sibling());
|
||||
REQUIRE_FALSE(n4->next_sibling());
|
||||
|
||||
{
|
||||
const_node_iptr cn1 = n1;
|
||||
const_node_iptr cn2 = n2;
|
||||
const_node_iptr cn3 = n3;
|
||||
|
||||
REQUIRE_FALSE(cn1->prev_sibling());
|
||||
REQUIRE(cn1->next_sibling() == cn2);
|
||||
|
||||
REQUIRE(cn2->prev_sibling() == cn1);
|
||||
REQUIRE(cn2->next_sibling() == cn3);
|
||||
|
||||
REQUIRE(cn3->prev_sibling() == cn2);
|
||||
REQUIRE_FALSE(cn3->next_sibling());
|
||||
|
||||
const_node_iptr cn4 = n4;
|
||||
REQUIRE_FALSE(cn4->prev_sibling());
|
||||
REQUIRE_FALSE(cn4->next_sibling());
|
||||
}
|
||||
}
|
||||
SECTION("add_child_to_back/add_child_to_front") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create();
|
||||
auto n2 = node::create();
|
||||
auto n3 = node::create();
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child_to_back(n1));
|
||||
REQUIRE(p->add_child_to_back(n2));
|
||||
REQUIRE(p->add_child_to_back(n3)); // n3 n2 n1
|
||||
REQUIRE_FALSE(p->add_child_to_back(nullptr));
|
||||
|
||||
REQUIRE(n1->prev_sibling() == n2);
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE_FALSE(n3->prev_sibling());
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE(n3->prev_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(n2->prev_sibling() == n3);
|
||||
REQUIRE(n3->prev_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_back(n1));
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE(n2->parent() == p);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child_to_front(n1));
|
||||
REQUIRE(p->add_child_to_front(n2));
|
||||
REQUIRE(p->add_child_to_front(n3)); // n1 n2 n3
|
||||
REQUIRE_FALSE(p->add_child_to_front(nullptr));
|
||||
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE_FALSE(n3->next_sibling());
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_front(n1));
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p2);
|
||||
REQUIRE(n2->parent() == p);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_to_back/add_child_to_front/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child_to_back(n1));
|
||||
REQUIRE(p->add_child_to_back(n2));
|
||||
REQUIRE(p->add_child_to_back(n3)); // n3 n2 n1
|
||||
REQUIRE_FALSE(p->add_child_to_back(nullptr));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_back(n1)); // n1 n3 n2
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_back(n1));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
REQUIRE(n1->parent_changes == 2);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
REQUIRE(n2->parent_changes == 1);
|
||||
REQUIRE(n2->children_changes == 0);
|
||||
}
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child_to_front(n1));
|
||||
REQUIRE(p->add_child_to_front(n2));
|
||||
REQUIRE(p->add_child_to_front(n3)); // n1 n2 n3
|
||||
REQUIRE_FALSE(p->add_child_to_front(nullptr));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 3);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to self parent (no change order)
|
||||
REQUIRE(p->add_child_to_front(n1)); // n2 n3 n1
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 4);
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
// add to another parent
|
||||
auto p2 = node::create();
|
||||
REQUIRE(p2->add_child_to_front(n1));
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
REQUIRE(n1->parent_changes == 2);
|
||||
REQUIRE(n1->children_changes == 0);
|
||||
|
||||
REQUIRE(n2->parent_changes == 1);
|
||||
REQUIRE(n2->children_changes == 0);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_after/add_child_before") {
|
||||
auto p = node::create();
|
||||
auto n1 = node::create();
|
||||
auto n2 = node::create();
|
||||
auto n3 = node::create();
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n2)); // n2 n1
|
||||
REQUIRE(p->add_child_before(n1, n3)); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n1)); // n2 n3 n1
|
||||
REQUIRE(p->add_child_before(n3, n2)); // n2 n3 n1
|
||||
|
||||
REQUIRE_FALSE(p->add_child_before(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(p, n3));
|
||||
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n1);
|
||||
|
||||
REQUIRE(p->add_child_before(n3, n1)); // n2 n1 n3
|
||||
REQUIRE(p->add_child_before(n2, n3)); // n3 n2 n1
|
||||
|
||||
REQUIRE(n3->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n1);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_before(n4, n2)); // n2 n4
|
||||
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE_FALSE(n2->prev_sibling());
|
||||
REQUIRE(n2->next_sibling() == n4);
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
{
|
||||
p->remove_all_children();
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n2)); // n1 n2
|
||||
REQUIRE(p->add_child_after(n1, n3)); // n1 n3 n2
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n1)); // n1 n3 n2
|
||||
REQUIRE(p->add_child_after(n3, n2)); // n1 n3 n2
|
||||
|
||||
REQUIRE_FALSE(p->add_child_after(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(p, n3));
|
||||
|
||||
REQUIRE(n1->next_sibling() == n3);
|
||||
REQUIRE(n3->next_sibling() == n2);
|
||||
|
||||
REQUIRE(p->add_child_after(n3, n1)); // n3 n1 n2
|
||||
REQUIRE(p->add_child_after(n2, n3)); // n1 n2 n3
|
||||
|
||||
REQUIRE(n1->next_sibling() == n2);
|
||||
REQUIRE(n2->next_sibling() == n3);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_after(n4, n2)); // n4 n2
|
||||
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n2->prev_sibling() == n4);
|
||||
REQUIRE_FALSE(n2->next_sibling());
|
||||
REQUIRE(p->child_count() == 2);
|
||||
|
||||
REQUIRE(n1->parent() == p);
|
||||
REQUIRE(n2->parent() == p2);
|
||||
REQUIRE(n3->parent() == p);
|
||||
}
|
||||
}
|
||||
SECTION("add_child_after/add_child_before/events") {
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
REQUIRE(p->add_child_before(n1, n2)); // n2 n1
|
||||
REQUIRE(p->add_child_before(n1, n3)); // n2 n3 n1
|
||||
|
||||
REQUIRE(p->add_child_before(n1, n1)); // n2 n3 n1
|
||||
REQUIRE(p->add_child_before(n3, n2)); // n2 n3 n1
|
||||
|
||||
REQUIRE_FALSE(p->add_child_before(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_before(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_before(p, n3));
|
||||
|
||||
REQUIRE(p->add_child_before(n3, n1)); // n2 n1 n3
|
||||
REQUIRE(p->add_child_before(n2, n3)); // n3 n2 n1
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_before(n4, n2)); // n2 n4
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 6);
|
||||
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n2->parent_changes == 2);
|
||||
}
|
||||
{
|
||||
auto p = fake_node::create();
|
||||
auto n1 = fake_node::create();
|
||||
auto n2 = fake_node::create();
|
||||
auto n3 = fake_node::create();
|
||||
|
||||
REQUIRE(p->add_child(n1)); // n1
|
||||
REQUIRE(p->add_child_after(n1, n2)); // n1 n2
|
||||
REQUIRE(p->add_child_after(n1, n3)); // n1 n3 n2
|
||||
|
||||
REQUIRE(p->add_child_after(n1, n1)); // n1 n3 n2
|
||||
REQUIRE(p->add_child_after(n3, n2)); // n1 n3 n2
|
||||
|
||||
REQUIRE_FALSE(p->add_child_after(n1, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, n1));
|
||||
REQUIRE_FALSE(p->add_child_after(nullptr, nullptr));
|
||||
REQUIRE_FALSE(p->add_child_after(p, n3));
|
||||
|
||||
REQUIRE(p->add_child_after(n3, n1)); // n3 n1 n2
|
||||
REQUIRE(p->add_child_after(n2, n3)); // n1 n2 n3
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 5);
|
||||
|
||||
// to another parent
|
||||
auto p2 = node::create();
|
||||
auto n4 = node::create(p2); // n4
|
||||
REQUIRE(p2->add_child_after(n4, n2)); // n4 n2
|
||||
|
||||
REQUIRE(p->parent_changes == 0);
|
||||
REQUIRE(p->children_changes == 6);
|
||||
|
||||
REQUIRE(n1->parent_changes == 1);
|
||||
REQUIRE(n2->parent_changes == 2);
|
||||
}
|
||||
}
|
||||
SECTION("for_each_child") {
|
||||
auto p = node::create();
|
||||
array<node_iptr, 3> ns{
|
||||
node::create(p),
|
||||
node::create(p),
|
||||
node::create(p)};
|
||||
{
|
||||
std::size_t count = 0;
|
||||
p->for_each_child([&ns, &count](const node_iptr& n){
|
||||
REQUIRE(ns[count++] == n);
|
||||
});
|
||||
REQUIRE(count == 3);
|
||||
}
|
||||
{
|
||||
const_node_iptr cp = p;
|
||||
std::size_t count = 0;
|
||||
cp->for_each_child([&ns, &count](const const_node_iptr& n){
|
||||
REQUIRE(ns[count++] == n);
|
||||
});
|
||||
REQUIRE(count == 3);
|
||||
}
|
||||
}
|
||||
SECTION("destroy_node") {
|
||||
auto p1 = node::create();
|
||||
auto p2 = node::create(p1);
|
||||
auto n1 = node::create(p2);
|
||||
auto n2 = node::create(p2);
|
||||
|
||||
p2.reset();
|
||||
|
||||
REQUIRE(p1->child_count() == 0);
|
||||
REQUIRE(p1->child_count_recursive() == 0);
|
||||
|
||||
REQUIRE(n1->root() == n1);
|
||||
REQUIRE_FALSE(n1->parent());
|
||||
REQUIRE_FALSE(n1->prev_sibling());
|
||||
REQUIRE_FALSE(n1->next_sibling());
|
||||
|
||||
REQUIRE(n2->root() == n2);
|
||||
REQUIRE_FALSE(n2->parent());
|
||||
REQUIRE_FALSE(n2->prev_sibling());
|
||||
REQUIRE_FALSE(n2->next_sibling());
|
||||
}
|
||||
SECTION("destroy_node/events") {
|
||||
fake_node::reset_counters();
|
||||
|
||||
auto p1 = fake_node::create();
|
||||
auto p2 = fake_node::create(p1);
|
||||
auto n1 = fake_node::create(p2);
|
||||
auto n2 = fake_node::create(p2);
|
||||
|
||||
REQUIRE(fake_node::s_parent_changes == 3);
|
||||
REQUIRE(fake_node::s_children_changes == 3);
|
||||
|
||||
p2.reset();
|
||||
|
||||
REQUIRE(fake_node::s_parent_changes == 5);
|
||||
REQUIRE(fake_node::s_children_changes == 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,8 +27,24 @@ namespace
|
||||
TEST_CASE("world"){
|
||||
safe_starter_initializer initializer;
|
||||
world& w = the<world>();
|
||||
{
|
||||
auto e = w.registry().create_entity();
|
||||
w.registry().destroy_entity(e);
|
||||
REQUIRE(w.scene());
|
||||
|
||||
SECTION("actor/drawable"){
|
||||
auto parent_e = w.registry().create_entity();
|
||||
auto actor_e = w.registry().create_entity();
|
||||
{
|
||||
REQUIRE(parent_e.assign_component<drawable>());
|
||||
node_iptr parent_n = parent_e.get_component<drawable>().node();
|
||||
w.scene()->root()->add_child(parent_n);
|
||||
|
||||
actor_iptr actor_n = actor::create(actor_e);
|
||||
REQUIRE(actor_e.assign_component<drawable>(actor_n));
|
||||
parent_n->add_child(actor_n);
|
||||
}
|
||||
REQUIRE(w.scene()->root()->child_count_recursive() == 2);
|
||||
w.registry().destroy_entity(parent_e);
|
||||
REQUIRE(w.scene()->root()->child_count_recursive() == 0);
|
||||
REQUIRE(actor_e.get_component<drawable>().node());
|
||||
REQUIRE_FALSE(actor_e.get_component<drawable>().node()->parent());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user