2022-08-07 20:44:33 +08:00
|
|
|
#include <gtest/gtest.h>
|
2022-04-28 16:43:31 +08:00
|
|
|
#include <memory> // for shared_ptr, __shared_ptr_access, allocator, __shared_ptr_access<>::element_type, make_shared
|
2021-06-22 04:49:42 +08:00
|
|
|
|
2022-02-19 18:49:12 +08:00
|
|
|
#include "ftxui/component/component.hpp" // for Make
|
2021-06-22 05:08:39 +08:00
|
|
|
#include "ftxui/component/component_base.hpp" // for ComponentBase, Component
|
2021-06-22 04:49:42 +08:00
|
|
|
|
2022-04-17 21:47:20 +08:00
|
|
|
namespace ftxui {
|
2021-06-22 04:49:42 +08:00
|
|
|
|
|
|
|
namespace {
|
|
|
|
Component Make() {
|
|
|
|
return std::make_shared<ComponentBase>();
|
|
|
|
}
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
// Regression test for:
|
|
|
|
// https://github.com/ArthurSonzogni/FTXUI/issues/115
|
|
|
|
TEST(ContainerTest, DeleteParentFirst) {
|
|
|
|
auto parent = Make();
|
|
|
|
auto child = Make();
|
|
|
|
parent->Add(child);
|
|
|
|
parent.reset();
|
|
|
|
child.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(ContainerTest, DeleteChildFirst) {
|
|
|
|
auto parent = Make();
|
|
|
|
auto child = Make();
|
|
|
|
parent->Add(child);
|
|
|
|
child.reset();
|
|
|
|
parent.reset();
|
|
|
|
}
|
|
|
|
|
2021-07-15 21:29:33 +08:00
|
|
|
TEST(ContainerTest, Detach) {
|
|
|
|
auto parent = Make();
|
|
|
|
auto child_1 = Make();
|
|
|
|
auto child_2 = Make();
|
|
|
|
auto child_3 = Make();
|
|
|
|
parent->Add(child_1);
|
|
|
|
parent->Add(child_2);
|
|
|
|
parent->Add(child_3);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 3u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_3->Parent(), parent.get());
|
|
|
|
|
|
|
|
child_2->Detach();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 2u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_3->Parent(), parent.get());
|
|
|
|
|
|
|
|
child_2->Detach();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 2u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_3->Parent(), parent.get());
|
|
|
|
|
|
|
|
child_1->Detach();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 1u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_3->Parent(), parent.get());
|
|
|
|
|
|
|
|
child_3->Detach();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 0u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_3->Parent(), nullptr);
|
|
|
|
}
|
|
|
|
|
2021-07-16 04:45:10 +08:00
|
|
|
TEST(ContainerTest, DetachAllChildren) {
|
2021-07-15 21:29:33 +08:00
|
|
|
auto parent = Make();
|
|
|
|
auto child_1 = Make();
|
|
|
|
auto child_2 = Make();
|
|
|
|
auto child_3 = Make();
|
|
|
|
parent->Add(child_1);
|
|
|
|
parent->Add(child_2);
|
|
|
|
parent->Add(child_3);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 3u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_3->Parent(), parent.get());
|
|
|
|
|
2021-07-16 04:45:10 +08:00
|
|
|
parent->DetachAllChildren();
|
2021-07-15 21:29:33 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 0u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_3->Parent(), nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(ContainerTest, Add) {
|
|
|
|
auto parent = Make();
|
|
|
|
auto child_1 = Make();
|
|
|
|
auto child_2 = Make();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 0u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), nullptr);
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
|
|
|
|
parent->Add(child_1);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 1u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
|
|
|
|
parent->Add(child_1);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 1u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), nullptr);
|
|
|
|
|
|
|
|
parent->Add(child_2);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 2u);
|
|
|
|
EXPECT_EQ(child_1->Parent(), parent.get());
|
|
|
|
EXPECT_EQ(child_2->Parent(), parent.get());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(ContainerTest, ChildAt) {
|
|
|
|
auto parent = Make();
|
|
|
|
auto child_1 = Make();
|
|
|
|
auto child_2 = Make();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 0u);
|
|
|
|
|
|
|
|
parent->Add(child_1);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 1u);
|
|
|
|
EXPECT_EQ(parent->ChildAt(0u), child_1);
|
|
|
|
|
|
|
|
parent->Add(child_2);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 2u);
|
|
|
|
EXPECT_EQ(parent->ChildAt(0u), child_1);
|
|
|
|
EXPECT_EQ(parent->ChildAt(1u), child_2);
|
|
|
|
|
|
|
|
parent->Add(child_1);
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 2u);
|
|
|
|
EXPECT_EQ(parent->ChildAt(0u), child_2);
|
|
|
|
EXPECT_EQ(parent->ChildAt(1u), child_1);
|
|
|
|
|
|
|
|
child_1->Detach();
|
|
|
|
|
|
|
|
EXPECT_EQ(parent->ChildCount(), 1u);
|
|
|
|
EXPECT_EQ(parent->ChildAt(0u), child_2);
|
|
|
|
}
|
|
|
|
|
2022-02-19 18:49:12 +08:00
|
|
|
TEST(ComponentTest, NonFocusableAreNotFocused) {
|
|
|
|
class NonFocusable : public ComponentBase {
|
|
|
|
bool Focusable() const override { return false; }
|
|
|
|
};
|
|
|
|
auto root = Make<NonFocusable>();
|
|
|
|
EXPECT_FALSE(root->Focused());
|
|
|
|
EXPECT_EQ(root->ActiveChild(), nullptr);
|
|
|
|
|
|
|
|
auto child = Make<NonFocusable>();
|
|
|
|
root->Add(child);
|
|
|
|
EXPECT_FALSE(root->Focused());
|
|
|
|
EXPECT_FALSE(child->Focused());
|
|
|
|
EXPECT_EQ(root->ActiveChild(), nullptr);
|
|
|
|
EXPECT_EQ(child->ActiveChild(), nullptr);
|
|
|
|
}
|
|
|
|
|
2022-04-17 21:47:20 +08:00
|
|
|
} // namespace ftxui
|
|
|
|
|
2021-06-22 04:49:42 +08:00
|
|
|
// Copyright 2020 Arthur Sonzogni. All rights reserved.
|
|
|
|
// Use of this source code is governed by the MIT license that can be found in
|
|
|
|
// the LICENSE file.
|