// ===================================================================================================================== // fennec, a free and open source game engine // Copyright © 2025 Medusa Slockbower // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ===================================================================================================================== #ifndef FENNEC_TEST_CONTAINERS_RDTREE_H #define FENNEC_TEST_CONTAINERS_RDTREE_H #include "../../test.h" #include namespace fennec { namespace test { inline void fennec_test_containers_rdtree() { using tree_t = rdtree; tree_t test; constexpr size_t npos = rdtree::npos; constexpr size_t pre_order [] = { 1, 2, 4, 5, 3, 6 }; constexpr size_t in_order [] = { 4, 2, 5, 1, 6, 3 }; constexpr size_t post_order[] = { 4, 5, 2, 6, 3, 1 }; const size_t n = 50; for (size_t i = 0; i < n; ++i) { const size_t parent = rand() % (i + 1); const size_t child = rdtree::npos; const size_t prev = rdtree::npos; const size_t next = test.child(parent); size_t l; assertf((l = test.insert(parent, 0, i)) == i + 1, "Tree Construct Test Failed."); assertf(test.parent(l) == parent, "Tree Construct Test Failed."); assertf(test.child(l) == child, "Tree Construct Test Failed."); assertf(test.prev(l) == prev, "Tree Construct Test Failed."); assertf(test.next(l) == next, "Tree Construct Test Failed."); assertf(next == rdtree::npos || test.prev(next) == l, "Tree Construct Test Failed"); } tree_t insert; insert.insert(npos, 0, test); assertf(insert.size() == test.size(), "Tree Insert Tree Test Failed"); fennec_test_spacer(1); test.erase(0); fennec_test_run(test.is_empty(), true); fennec_test_spacer(1); size_t n1 = test.insert(npos, 0, 1); size_t n2 = test.insert(n1, 0, 2); size_t n3 = test.insert(n1, npos, 3); size_t n4 = test.insert(n2, 0, 4); size_t n5 = test.insert(n2, npos, 5); size_t n6 = test.insert(n3, 0, 6); fennec_test_run(n1 != npos, true); fennec_test_run(n2 != npos, true); fennec_test_run(n3 != npos, true); fennec_test_run(n4 != npos, true); fennec_test_run(n5 != npos, true); fennec_test_run(n6 != npos, true); fennec_test_spacer(1); size_t i; i = 0; test.traverse([&](size_t x, size_t) -> uint8_t { fennec_test_run(x, pre_order[i++]); return traversal_control_continue; }); fennec_test_spacer(1); i = 0; test.traverse([&](size_t x, size_t) -> uint8_t { fennec_test_run(x, in_order[i++]); return traversal_control_continue; }); fennec_test_spacer(1); i = 0; test.traverse([&](size_t x, size_t) -> uint8_t { fennec_test_run(x, post_order[i++]); return traversal_control_continue; }); fennec_test_spacer(1); test.erase(0); fennec_test_run(test.is_empty(), true); } } } #endif // FENNEC_TEST_CONTAINERS_RDTREE_H