mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-09-28 16:29:34 +08:00
Implement flexbox (#277)
This implement the flexbox elements, following the HTML one. Built from them, there is also the following elements: - `paragraph` - `paragraphAlignLeft` - `paragraphAlignRight` - `paragraphAlignCenter` - `paragraphAlignJustify` This is a breaking change.
This commit is contained in:
233
src/ftxui/dom/flexbox_helper_test.cpp
Normal file
233
src/ftxui/dom/flexbox_helper_test.cpp
Normal file
@@ -0,0 +1,233 @@
|
||||
#include <gtest/gtest-message.h> // for Message
|
||||
#include <gtest/gtest-test-part.h> // for TestPartResult, SuiteApiResolver, TestFactoryImpl
|
||||
#include <memory> // for allocator_traits<>::value_type
|
||||
|
||||
#include "ftxui/dom/flexbox_helper.hpp"
|
||||
#include "gtest/gtest_pred_impl.h" // for EXPECT_EQ, Test, TEST
|
||||
|
||||
using namespace ftxui;
|
||||
using namespace ftxui;
|
||||
|
||||
TEST(FlexboxHelperTest, BasicRow) {
|
||||
flexbox_helper::Block block_10_5;
|
||||
block_10_5.min_size_x = 10;
|
||||
block_10_5.min_size_y = 5;
|
||||
|
||||
flexbox_helper::Global g;
|
||||
g.blocks = {
|
||||
block_10_5, block_10_5, block_10_5, block_10_5, block_10_5,
|
||||
};
|
||||
|
||||
g.size_x = 32;
|
||||
g.size_y = 16;
|
||||
g.config = FlexboxConfig().Set(FlexboxConfig::Direction::Row);
|
||||
flexbox_helper::Compute(g);
|
||||
|
||||
EXPECT_EQ(g.blocks.size(), 5u);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line, 0);
|
||||
EXPECT_EQ(g.blocks[1].line, 0);
|
||||
EXPECT_EQ(g.blocks[2].line, 0);
|
||||
EXPECT_EQ(g.blocks[3].line, 1);
|
||||
EXPECT_EQ(g.blocks[4].line, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[1].line_position, 1);
|
||||
EXPECT_EQ(g.blocks[2].line_position, 2);
|
||||
EXPECT_EQ(g.blocks[3].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[4].line_position, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].x, 0);
|
||||
EXPECT_EQ(g.blocks[0].y, 0);
|
||||
EXPECT_EQ(g.blocks[0].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[0].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[1].x, 10);
|
||||
EXPECT_EQ(g.blocks[1].y, 0);
|
||||
EXPECT_EQ(g.blocks[1].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[1].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[2].x, 20);
|
||||
EXPECT_EQ(g.blocks[2].y, 0);
|
||||
EXPECT_EQ(g.blocks[2].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[2].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[3].x, 0);
|
||||
EXPECT_EQ(g.blocks[3].y, 5);
|
||||
EXPECT_EQ(g.blocks[3].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[3].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[4].x, 10);
|
||||
EXPECT_EQ(g.blocks[4].y, 5);
|
||||
EXPECT_EQ(g.blocks[4].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[4].dim_y, 5);
|
||||
}
|
||||
|
||||
TEST(FlexboxHelperTest, BasicColumn) {
|
||||
flexbox_helper::Block block_10_5;
|
||||
block_10_5.min_size_x = 10;
|
||||
block_10_5.min_size_y = 5;
|
||||
|
||||
flexbox_helper::Global g;
|
||||
g.blocks = {
|
||||
block_10_5, block_10_5, block_10_5, block_10_5, block_10_5,
|
||||
};
|
||||
|
||||
g.size_x = 32;
|
||||
g.size_y = 16;
|
||||
g.config = FlexboxConfig().Set(FlexboxConfig::Direction::Column);
|
||||
flexbox_helper::Compute(g);
|
||||
|
||||
EXPECT_EQ(g.blocks.size(), 5u);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line, 0);
|
||||
EXPECT_EQ(g.blocks[1].line, 0);
|
||||
EXPECT_EQ(g.blocks[2].line, 0);
|
||||
EXPECT_EQ(g.blocks[3].line, 1);
|
||||
EXPECT_EQ(g.blocks[4].line, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[1].line_position, 1);
|
||||
EXPECT_EQ(g.blocks[2].line_position, 2);
|
||||
EXPECT_EQ(g.blocks[3].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[4].line_position, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].x, 0);
|
||||
EXPECT_EQ(g.blocks[0].y, 0);
|
||||
EXPECT_EQ(g.blocks[0].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[0].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[1].x, 0);
|
||||
EXPECT_EQ(g.blocks[1].y, 5);
|
||||
EXPECT_EQ(g.blocks[1].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[1].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[2].x, 0);
|
||||
EXPECT_EQ(g.blocks[2].y, 10);
|
||||
EXPECT_EQ(g.blocks[2].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[2].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[3].x, 10);
|
||||
EXPECT_EQ(g.blocks[3].y, 0);
|
||||
EXPECT_EQ(g.blocks[3].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[3].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[4].x, 10);
|
||||
EXPECT_EQ(g.blocks[4].y, 5);
|
||||
EXPECT_EQ(g.blocks[4].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[4].dim_y, 5);
|
||||
}
|
||||
|
||||
TEST(FlexboxHelperTest, BasicRowInversed) {
|
||||
flexbox_helper::Block block_10_5;
|
||||
block_10_5.min_size_x = 10;
|
||||
block_10_5.min_size_y = 5;
|
||||
|
||||
flexbox_helper::Global g;
|
||||
g.blocks = {
|
||||
block_10_5, block_10_5, block_10_5, block_10_5, block_10_5,
|
||||
};
|
||||
|
||||
g.size_x = 32;
|
||||
g.size_y = 16;
|
||||
g.config = FlexboxConfig().Set(FlexboxConfig::Direction::RowInversed);
|
||||
flexbox_helper::Compute(g);
|
||||
|
||||
EXPECT_EQ(g.blocks.size(), 5u);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line, 0);
|
||||
EXPECT_EQ(g.blocks[1].line, 0);
|
||||
EXPECT_EQ(g.blocks[2].line, 0);
|
||||
EXPECT_EQ(g.blocks[3].line, 1);
|
||||
EXPECT_EQ(g.blocks[4].line, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[1].line_position, 1);
|
||||
EXPECT_EQ(g.blocks[2].line_position, 2);
|
||||
EXPECT_EQ(g.blocks[3].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[4].line_position, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].x, 22);
|
||||
EXPECT_EQ(g.blocks[0].y, 0);
|
||||
EXPECT_EQ(g.blocks[0].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[0].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[1].x, 12);
|
||||
EXPECT_EQ(g.blocks[1].y, 0);
|
||||
EXPECT_EQ(g.blocks[1].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[1].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[2].x, 2);
|
||||
EXPECT_EQ(g.blocks[2].y, 0);
|
||||
EXPECT_EQ(g.blocks[2].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[2].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[3].x, 22);
|
||||
EXPECT_EQ(g.blocks[3].y, 5);
|
||||
EXPECT_EQ(g.blocks[3].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[3].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[4].x, 12);
|
||||
EXPECT_EQ(g.blocks[4].y, 5);
|
||||
EXPECT_EQ(g.blocks[4].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[4].dim_y, 5);
|
||||
}
|
||||
|
||||
TEST(FlexboxHelperTest, BasicColumnInversed) {
|
||||
flexbox_helper::Block block_10_5;
|
||||
block_10_5.min_size_x = 10;
|
||||
block_10_5.min_size_y = 5;
|
||||
|
||||
flexbox_helper::Global g;
|
||||
g.blocks = {
|
||||
block_10_5, block_10_5, block_10_5, block_10_5, block_10_5,
|
||||
};
|
||||
|
||||
g.size_x = 32;
|
||||
g.size_y = 16;
|
||||
g.config = FlexboxConfig().Set(FlexboxConfig::Direction::ColumnInversed);
|
||||
flexbox_helper::Compute(g);
|
||||
|
||||
EXPECT_EQ(g.blocks.size(), 5u);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line, 0);
|
||||
EXPECT_EQ(g.blocks[1].line, 0);
|
||||
EXPECT_EQ(g.blocks[2].line, 0);
|
||||
EXPECT_EQ(g.blocks[3].line, 1);
|
||||
EXPECT_EQ(g.blocks[4].line, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[1].line_position, 1);
|
||||
EXPECT_EQ(g.blocks[2].line_position, 2);
|
||||
EXPECT_EQ(g.blocks[3].line_position, 0);
|
||||
EXPECT_EQ(g.blocks[4].line_position, 1);
|
||||
|
||||
EXPECT_EQ(g.blocks[0].x, 0);
|
||||
EXPECT_EQ(g.blocks[0].y, 11);
|
||||
EXPECT_EQ(g.blocks[0].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[0].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[1].x, 0);
|
||||
EXPECT_EQ(g.blocks[1].y, 6);
|
||||
EXPECT_EQ(g.blocks[1].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[1].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[2].x, 0);
|
||||
EXPECT_EQ(g.blocks[2].y, 1);
|
||||
EXPECT_EQ(g.blocks[2].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[2].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[3].x, 10);
|
||||
EXPECT_EQ(g.blocks[3].y, 11);
|
||||
EXPECT_EQ(g.blocks[3].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[3].dim_y, 5);
|
||||
|
||||
EXPECT_EQ(g.blocks[4].x, 10);
|
||||
EXPECT_EQ(g.blocks[4].y, 6);
|
||||
EXPECT_EQ(g.blocks[4].dim_x, 10);
|
||||
EXPECT_EQ(g.blocks[4].dim_y, 5);
|
||||
}
|
||||
|
||||
// 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.
|
Reference in New Issue
Block a user