FTXUI/src/ftxui/component/component_test.cpp

180 lines
4.6 KiB
C++
Raw Normal View History

#include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-test-part.h> // for TestPartResult
#include <memory> // for shared_ptr, __shared_ptr_access, allocator, make_shared
2021-06-22 05:08:39 +08:00
#include "ftxui/component/captured_mouse.hpp" // for ftxui
#include "ftxui/component/component.hpp" // for Make
2021-06-22 05:08:39 +08:00
#include "ftxui/component/component_base.hpp" // for ComponentBase, Component
#include "gtest/gtest_pred_impl.h" // for EXPECT_EQ, Test, SuiteApiResolver, TEST, TestFactoryImpl
2022-04-17 21:47:20 +08:00
namespace ftxui {
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();
}
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) {
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();
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);
}
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
// 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.