mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-09-28 16:29:34 +08:00
Remove Ref<XxxOption> and add new interfaces. (#686)
1. Stop taking Ref<XxxOption> in Component constructors. Instead, use the XxxOption directly. Passing by copy avoid problems developers had where one was shared in between multiple component, causing issues. 2. Add variants of most component constructors taking a struct only. This replaces: https://github.com/ArthurSonzogni/FTXUI/pull/670 This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/426
This commit is contained in:
@@ -16,32 +16,36 @@ namespace ftxui {
|
||||
|
||||
TEST(InputTest, Init) {
|
||||
std::string content;
|
||||
int cursor_position = 0;
|
||||
auto option = InputOption();
|
||||
Component input = Input(&content, &option);
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
}
|
||||
|
||||
TEST(InputTest, Type) {
|
||||
std::string content;
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
Component input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
input->OnEvent(Event::Character("a"));
|
||||
EXPECT_EQ(content, "a");
|
||||
EXPECT_EQ(option.cursor_position(), 1);
|
||||
EXPECT_EQ(cursor_position, 1);
|
||||
|
||||
input->OnEvent(Event::Character('b'));
|
||||
EXPECT_EQ(content, "ab");
|
||||
EXPECT_EQ(option.cursor_position(), 2);
|
||||
EXPECT_EQ(cursor_position, 2);
|
||||
|
||||
input->OnEvent(Event::Return);
|
||||
EXPECT_EQ(content, "ab\n");
|
||||
EXPECT_EQ(option.cursor_position(), 3);
|
||||
EXPECT_EQ(cursor_position, 3);
|
||||
|
||||
input->OnEvent(Event::Character('c'));
|
||||
EXPECT_EQ(content, "ab\nc");
|
||||
EXPECT_EQ(option.cursor_position(), 4);
|
||||
EXPECT_EQ(cursor_position, 4);
|
||||
|
||||
auto document = input->Render();
|
||||
|
||||
@@ -55,57 +59,59 @@ TEST(InputTest, Type) {
|
||||
|
||||
TEST(InputTest, ArrowLeftRight) {
|
||||
std::string content = "abc测测a测\na测\n";
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 1);
|
||||
EXPECT_EQ(cursor_position, 1);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 1);
|
||||
EXPECT_EQ(cursor_position, 1);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 2);
|
||||
EXPECT_EQ(cursor_position, 2);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 3);
|
||||
EXPECT_EQ(cursor_position, 3);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 6);
|
||||
EXPECT_EQ(cursor_position, 6);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 9);
|
||||
EXPECT_EQ(cursor_position, 9);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 10);
|
||||
EXPECT_EQ(cursor_position, 10);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 13);
|
||||
EXPECT_EQ(cursor_position, 13);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 14);
|
||||
EXPECT_EQ(cursor_position, 14);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 15);
|
||||
EXPECT_EQ(cursor_position, 15);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 18);
|
||||
EXPECT_EQ(cursor_position, 18);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 19);
|
||||
EXPECT_EQ(cursor_position, 19);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 19);
|
||||
EXPECT_EQ(cursor_position, 19);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_EQ(option.cursor_position(), 18);
|
||||
EXPECT_EQ(cursor_position, 18);
|
||||
}
|
||||
|
||||
TEST(InputTest, ArrowUpDown) {
|
||||
@@ -117,70 +123,75 @@ TEST(InputTest, ArrowUpDown) {
|
||||
"00\n"
|
||||
"0\n"
|
||||
"";
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 4);
|
||||
EXPECT_EQ(cursor_position, 4);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 11);
|
||||
EXPECT_EQ(cursor_position, 11);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 21);
|
||||
EXPECT_EQ(cursor_position, 21);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 29);
|
||||
EXPECT_EQ(cursor_position, 29);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 36);
|
||||
EXPECT_EQ(cursor_position, 36);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 40);
|
||||
EXPECT_EQ(cursor_position, 40);
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 40);
|
||||
EXPECT_EQ(cursor_position, 40);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 36);
|
||||
EXPECT_EQ(cursor_position, 36);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 29);
|
||||
EXPECT_EQ(cursor_position, 29);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 21);
|
||||
EXPECT_EQ(cursor_position, 21);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 11);
|
||||
EXPECT_EQ(cursor_position, 11);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 4);
|
||||
EXPECT_EQ(cursor_position, 4);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_EQ(option.cursor_position(), 3);
|
||||
EXPECT_EQ(cursor_position, 3);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 7);
|
||||
EXPECT_EQ(cursor_position, 7);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 14);
|
||||
EXPECT_EQ(cursor_position, 14);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 24);
|
||||
EXPECT_EQ(cursor_position, 24);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 32);
|
||||
EXPECT_EQ(cursor_position, 32);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 39);
|
||||
EXPECT_EQ(cursor_position, 39);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 40);
|
||||
EXPECT_EQ(cursor_position, 40);
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowDown));
|
||||
EXPECT_EQ(option.cursor_position(), 40);
|
||||
EXPECT_EQ(cursor_position, 40);
|
||||
|
||||
option.cursor_position() = 39;
|
||||
cursor_position = 39;
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 32);
|
||||
EXPECT_EQ(cursor_position, 32);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 24);
|
||||
EXPECT_EQ(cursor_position, 24);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 14);
|
||||
EXPECT_EQ(cursor_position, 14);
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_EQ(option.cursor_position(), 7);
|
||||
EXPECT_EQ(cursor_position, 7);
|
||||
}
|
||||
|
||||
TEST(InputTest, Insert) {
|
||||
std::string content;
|
||||
Component input = Input(&content);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('a')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
@@ -213,8 +224,10 @@ TEST(InputTest, Insert) {
|
||||
|
||||
TEST(InputTest, Home) {
|
||||
std::string content;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('a')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
@@ -224,21 +237,22 @@ TEST(InputTest, Home) {
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('c')));
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Home));
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('-')));
|
||||
EXPECT_EQ(option.cursor_position(), 1u);
|
||||
EXPECT_EQ(cursor_position, 1u);
|
||||
EXPECT_EQ(content, "-abc\n测bc");
|
||||
}
|
||||
|
||||
TEST(InputTest, End) {
|
||||
std::string content;
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('a')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
@@ -250,17 +264,18 @@ TEST(InputTest, End) {
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowUp));
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 2u);
|
||||
EXPECT_EQ(cursor_position, 2u);
|
||||
|
||||
input->OnEvent(Event::End);
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
}
|
||||
|
||||
TEST(InputTest, Delete) {
|
||||
std::string content;
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
auto input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('a')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
@@ -271,38 +286,38 @@ TEST(InputTest, Delete) {
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('c')));
|
||||
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 8u);
|
||||
EXPECT_EQ(cursor_position, 8u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abc\n测b");
|
||||
EXPECT_EQ(option.cursor_position(), 8u);
|
||||
EXPECT_EQ(cursor_position, 8u);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abc\n测b");
|
||||
EXPECT_EQ(option.cursor_position(), 8u);
|
||||
EXPECT_EQ(cursor_position, 8u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abc\nb");
|
||||
EXPECT_EQ(option.cursor_position(), 4u);
|
||||
EXPECT_EQ(cursor_position, 4u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abcb");
|
||||
EXPECT_EQ(option.cursor_position(), 3u);
|
||||
EXPECT_EQ(cursor_position, 3u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Delete));
|
||||
EXPECT_EQ(content, "abc");
|
||||
EXPECT_EQ(option.cursor_position(), 3u);
|
||||
EXPECT_EQ(cursor_position, 3u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
@@ -318,9 +333,10 @@ TEST(InputTest, Delete) {
|
||||
|
||||
TEST(InputTest, Backspace) {
|
||||
std::string content;
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
auto input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('a')));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('b')));
|
||||
@@ -331,45 +347,45 @@ TEST(InputTest, Backspace) {
|
||||
EXPECT_TRUE(input->OnEvent(Event::Character('c')));
|
||||
|
||||
EXPECT_EQ(content, "abc\n测bc");
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "abc\n测b");
|
||||
EXPECT_EQ(option.cursor_position(), 8u);
|
||||
EXPECT_EQ(cursor_position, 8u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeft));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "abc\nb");
|
||||
EXPECT_EQ(option.cursor_position(), 4u);
|
||||
EXPECT_EQ(cursor_position, 4u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "abcb");
|
||||
EXPECT_EQ(option.cursor_position(), 3u);
|
||||
EXPECT_EQ(cursor_position, 3u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "abb");
|
||||
EXPECT_EQ(option.cursor_position(), 2u);
|
||||
EXPECT_EQ(cursor_position, 2u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "ab");
|
||||
EXPECT_EQ(option.cursor_position(), 1u);
|
||||
EXPECT_EQ(cursor_position, 1u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "b");
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "b");
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRight));
|
||||
EXPECT_TRUE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "");
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::Backspace));
|
||||
EXPECT_EQ(content, "");
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
}
|
||||
|
||||
TEST(InputTest, CtrlArrow) {
|
||||
@@ -377,192 +393,193 @@ TEST(InputTest, CtrlArrow) {
|
||||
"word word 测ord wo测d word\n"
|
||||
"coucou coucou coucou\n"
|
||||
"coucou coucou coucou\n";
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
option.cursor_position = 1000;
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 1000;
|
||||
auto input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
// Use CTRL+Left several time
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 67);
|
||||
EXPECT_EQ(cursor_position, 67);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 60);
|
||||
EXPECT_EQ(cursor_position, 60);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 53);
|
||||
EXPECT_EQ(cursor_position, 53);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 46);
|
||||
EXPECT_EQ(cursor_position, 46);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 39);
|
||||
EXPECT_EQ(cursor_position, 39);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 29);
|
||||
EXPECT_EQ(cursor_position, 29);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 24);
|
||||
EXPECT_EQ(cursor_position, 24);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 17);
|
||||
EXPECT_EQ(cursor_position, 17);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 10);
|
||||
EXPECT_EQ(cursor_position, 10);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 5);
|
||||
EXPECT_EQ(cursor_position, 5);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 4);
|
||||
EXPECT_EQ(cursor_position, 4);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 9);
|
||||
EXPECT_EQ(cursor_position, 9);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 16);
|
||||
EXPECT_EQ(cursor_position, 16);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 23);
|
||||
EXPECT_EQ(cursor_position, 23);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 28);
|
||||
EXPECT_EQ(cursor_position, 28);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 35);
|
||||
EXPECT_EQ(cursor_position, 35);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 45);
|
||||
EXPECT_EQ(cursor_position, 45);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 52);
|
||||
EXPECT_EQ(cursor_position, 52);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 59);
|
||||
EXPECT_EQ(cursor_position, 59);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 66);
|
||||
EXPECT_EQ(cursor_position, 66);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 73);
|
||||
EXPECT_EQ(cursor_position, 73);
|
||||
}
|
||||
|
||||
TEST(InputTest, CtrlArrowLeft2) {
|
||||
std::string content = " word word 测ord wo测d word ";
|
||||
auto option = InputOption();
|
||||
option.cursor_position = 33;
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 33;
|
||||
auto input = Input(&content, {
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
// Use CTRL+Left several time
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 31);
|
||||
EXPECT_EQ(cursor_position, 31);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 23);
|
||||
EXPECT_EQ(cursor_position, 23);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 15);
|
||||
EXPECT_EQ(cursor_position, 15);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 9);
|
||||
EXPECT_EQ(cursor_position, 9);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 3);
|
||||
EXPECT_EQ(cursor_position, 3);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowLeftCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
}
|
||||
|
||||
TEST(InputTest, CtrlArrowRight) {
|
||||
std::string content =
|
||||
"word word 测ord wo测d word\n"
|
||||
"coucou dfqdsf jmlkjm";
|
||||
|
||||
auto option = InputOption();
|
||||
option.cursor_position = 2;
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 2;
|
||||
auto input = Input(&content, {.cursor_position = &cursor_position});
|
||||
|
||||
// Use CTRL+Left several time
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 4);
|
||||
EXPECT_EQ(cursor_position, 4);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 9);
|
||||
EXPECT_EQ(cursor_position, 9);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 16);
|
||||
EXPECT_EQ(cursor_position, 16);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 23);
|
||||
EXPECT_EQ(cursor_position, 23);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 28);
|
||||
EXPECT_EQ(cursor_position, 28);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 35);
|
||||
EXPECT_EQ(cursor_position, 35);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 42);
|
||||
EXPECT_EQ(cursor_position, 42);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 49);
|
||||
EXPECT_EQ(cursor_position, 49);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 49);
|
||||
EXPECT_EQ(cursor_position, 49);
|
||||
}
|
||||
|
||||
TEST(InputTest, CtrlArrowRight2) {
|
||||
std::string content = " word word 测ord wo测d word ";
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
auto input = Input(&content, {.cursor_position = &cursor_position});
|
||||
|
||||
// Use CTRL+Left several time
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 7);
|
||||
EXPECT_EQ(cursor_position, 7);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 13);
|
||||
EXPECT_EQ(cursor_position, 13);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 21);
|
||||
EXPECT_EQ(cursor_position, 21);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 29);
|
||||
EXPECT_EQ(cursor_position, 29);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 35);
|
||||
EXPECT_EQ(cursor_position, 35);
|
||||
|
||||
EXPECT_TRUE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 38);
|
||||
EXPECT_EQ(cursor_position, 38);
|
||||
|
||||
EXPECT_FALSE(input->OnEvent(Event::ArrowRightCtrl));
|
||||
EXPECT_EQ(option.cursor_position(), 38);
|
||||
EXPECT_EQ(cursor_position, 38);
|
||||
}
|
||||
|
||||
TEST(InputTest, TypePassword) {
|
||||
std::string content;
|
||||
std::string placeholder;
|
||||
auto option = InputOption();
|
||||
option.cursor_position = 0;
|
||||
option.password = true;
|
||||
Component input = Input(&content, &placeholder, &option);
|
||||
int cursor_position = 0;
|
||||
Component input = Input(&content, &placeholder,
|
||||
{
|
||||
.password = true,
|
||||
.cursor_position = &cursor_position,
|
||||
});
|
||||
|
||||
input->OnEvent(Event::Character('a'));
|
||||
EXPECT_EQ(content, "a");
|
||||
EXPECT_EQ(option.cursor_position(), 1u);
|
||||
EXPECT_EQ(cursor_position, 1u);
|
||||
|
||||
input->OnEvent(Event::Character('b'));
|
||||
EXPECT_EQ(content, "ab");
|
||||
EXPECT_EQ(option.cursor_position(), 2u);
|
||||
EXPECT_EQ(cursor_position, 2u);
|
||||
|
||||
auto document = input->Render();
|
||||
auto screen = Screen::Create(Dimension::Fit(document));
|
||||
@@ -573,8 +590,8 @@ TEST(InputTest, TypePassword) {
|
||||
|
||||
TEST(InputTest, MouseClick) {
|
||||
std::string content;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
auto input = Input(&content, {.cursor_position = &cursor_position});
|
||||
|
||||
input->OnEvent(Event::Character("a"));
|
||||
input->OnEvent(Event::Character("b"));
|
||||
@@ -588,7 +605,7 @@ TEST(InputTest, MouseClick) {
|
||||
input->OnEvent(Event::Return);
|
||||
|
||||
EXPECT_EQ(content, "abcd\nabcd\n");
|
||||
EXPECT_EQ(option.cursor_position(), 10u);
|
||||
EXPECT_EQ(cursor_position, 10u);
|
||||
|
||||
auto render = [&] {
|
||||
auto document = input->Render();
|
||||
@@ -596,7 +613,7 @@ TEST(InputTest, MouseClick) {
|
||||
Render(screen, document);
|
||||
};
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 10u);
|
||||
EXPECT_EQ(cursor_position, 10u);
|
||||
|
||||
Mouse mouse;
|
||||
mouse.button = Mouse::Button::Left;
|
||||
@@ -609,67 +626,67 @@ TEST(InputTest, MouseClick) {
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 0u);
|
||||
EXPECT_EQ(cursor_position, 0u);
|
||||
|
||||
mouse.x = 2;
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 2u);
|
||||
EXPECT_EQ(cursor_position, 2u);
|
||||
|
||||
mouse.x = 2;
|
||||
mouse.y = 0;
|
||||
EXPECT_FALSE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 2u);
|
||||
EXPECT_EQ(cursor_position, 2u);
|
||||
|
||||
mouse.x = 1;
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 1u);
|
||||
EXPECT_EQ(cursor_position, 1u);
|
||||
|
||||
mouse.x = 3;
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 3u);
|
||||
EXPECT_EQ(cursor_position, 3u);
|
||||
|
||||
mouse.x = 4;
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 4u);
|
||||
EXPECT_EQ(cursor_position, 4u);
|
||||
|
||||
mouse.x = 5;
|
||||
mouse.y = 0;
|
||||
EXPECT_FALSE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 4u);
|
||||
EXPECT_EQ(cursor_position, 4u);
|
||||
|
||||
mouse.x = 5;
|
||||
mouse.y = 1;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 9u);
|
||||
EXPECT_EQ(cursor_position, 9u);
|
||||
|
||||
mouse.x = 1;
|
||||
mouse.y = 1;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 6u);
|
||||
EXPECT_EQ(cursor_position, 6u);
|
||||
|
||||
mouse.x = 4;
|
||||
mouse.y = 2;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 10u);
|
||||
EXPECT_EQ(cursor_position, 10u);
|
||||
}
|
||||
|
||||
TEST(InputTest, MouseClickComplex) {
|
||||
std::string content;
|
||||
auto option = InputOption();
|
||||
auto input = Input(&content, &option);
|
||||
int cursor_position = 0;
|
||||
auto input = Input(&content, {.cursor_position = &cursor_position});
|
||||
|
||||
input->OnEvent(Event::Character("测"));
|
||||
input->OnEvent(Event::Character("试"));
|
||||
@@ -681,7 +698,7 @@ TEST(InputTest, MouseClickComplex) {
|
||||
input->OnEvent(Event::Character("a⃒"));
|
||||
input->OnEvent(Event::Character("ā"));
|
||||
|
||||
EXPECT_EQ(option.cursor_position(), 27u);
|
||||
EXPECT_EQ(cursor_position, 27u);
|
||||
|
||||
auto render = [&] {
|
||||
auto document = input->Render();
|
||||
@@ -701,25 +718,25 @@ TEST(InputTest, MouseClickComplex) {
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 0);
|
||||
EXPECT_EQ(cursor_position, 0);
|
||||
|
||||
mouse.x = 0;
|
||||
mouse.y = 1;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 14);
|
||||
EXPECT_EQ(cursor_position, 14);
|
||||
|
||||
mouse.x = 1;
|
||||
mouse.y = 0;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 3);
|
||||
EXPECT_EQ(cursor_position, 3);
|
||||
|
||||
mouse.x = 1;
|
||||
mouse.y = 1;
|
||||
EXPECT_TRUE(input->OnEvent(Event::Mouse("", mouse)));
|
||||
render();
|
||||
EXPECT_EQ(option.cursor_position(), 17);
|
||||
EXPECT_EQ(cursor_position, 17);
|
||||
}
|
||||
|
||||
TEST(InputTest, OnEnter) {
|
||||
@@ -727,7 +744,7 @@ TEST(InputTest, OnEnter) {
|
||||
auto option = InputOption();
|
||||
bool on_enter_called = false;
|
||||
option.on_enter = [&] { on_enter_called = true; };
|
||||
Component input = Input(&content, &option);
|
||||
Component input = Input(&content, option);
|
||||
|
||||
EXPECT_FALSE(on_enter_called);
|
||||
EXPECT_TRUE(input->OnEvent(Event::Return));
|
||||
|
Reference in New Issue
Block a user