#pragma once
#include "scene/gui/code_edit.h"
#include "tests/test_macros.h"
namespace TestCodeEdit {
TEST_CASE("[SceneTree][CodeEdit] line gutters") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
SUBCASE("[CodeEdit] breakpoints") {
SIGNAL_WATCH(code_edit, "breakpoint_toggled");
SUBCASE("[CodeEdit] draw breakpoints gutter") {
code_edit->set_draw_breakpoints_gutter(false);
CHECK_FALSE(code_edit->is_drawing_breakpoints_gutter());
code_edit->set_draw_breakpoints_gutter(true);
CHECK(code_edit->is_drawing_breakpoints_gutter());
}
SUBCASE("[CodeEdit] set line as breakpoint") {
ERR_PRINT_OFF;
code_edit->set_line_as_breakpoint(-1, true);
CHECK_FALSE(code_edit->is_line_breakpointed(-1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
code_edit->set_line_as_breakpoint(1, true);
CHECK_FALSE(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
ERR_PRINT_ON;
Array args = { { 0 } };
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
CHECK(code_edit->get_breakpointed_lines()[0] == 0);
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_line_as_breakpoint(0, false);
CHECK_FALSE(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] clear breakpointed lines") {
code_edit->clear_breakpointed_lines();
SIGNAL_CHECK_FALSE("breakpoint_toggled");
Array args = { { 0 } };
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->clear_breakpointed_lines();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and set text") {
Array args = { { 0 } };
code_edit->set_text("test\nline");
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
code_edit->clear_breakpointed_lines();
SIGNAL_DISCARD("breakpoint_toggled")
args = { { 1 } };
code_edit->set_text("test\nline");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(1));
ERR_PRINT_ON;
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and clear") {
Array args = { { 0 } };
code_edit->set_text("test\nline");
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->clear_breakpointed_lines();
SIGNAL_DISCARD("breakpoint_toggled")
args = { { 1 } };
code_edit->set_text("test\nline");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(1));
ERR_PRINT_ON;
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and new lines no text") {
Array args = { { 0 } };
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 0 }, { 1 } };
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK_FALSE(code_edit->is_line_breakpointed(0));
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 1 }, { 2 } };
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK_FALSE(code_edit->is_line_breakpointed(1));
CHECK(code_edit->is_line_breakpointed(2));
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 2 }, { 3 } };
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_breakpointed(2));
CHECK(code_edit->is_line_breakpointed(3));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and new lines with text") {
Array args = { { 0 } };
code_edit->insert_text_at_caret("text");
code_edit->set_line_as_breakpoint(0, true);
CHECK(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_breakpointed(0));
CHECK_FALSE(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK(code_edit->is_line_breakpointed(0));
CHECK_FALSE(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
args = { { 0 }, { 1 } };
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_breakpointed(0));
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and backspace") {
Array args = { { 1 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_caret_line(2);
SEND_GUI_ACTION("ui_text_backspace");
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
SEND_GUI_ACTION("ui_text_backspace");
CHECK_FALSE(code_edit->is_line_breakpointed(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(1));
ERR_PRINT_ON;
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 2 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(2, true);
CHECK(code_edit->is_line_breakpointed(2));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_caret_line(1);
args = { { 2 }, { 1 } };
SEND_GUI_ACTION("ui_text_backspace");
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(2));
ERR_PRINT_ON;
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and delete") {
Array args = { { 1 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_caret_line(1);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 1);
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(1));
ERR_PRINT_ON;
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 2 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(2, true);
CHECK(code_edit->is_line_breakpointed(2));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->set_caret_line(0);
args = { { 2 }, { 1 } };
SEND_GUI_ACTION("ui_text_delete");
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(2));
ERR_PRINT_ON;
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and delete selection") {
Array args = { { 1 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 9 } };
code_edit->set_text("\n\n\n\n\n\n\n\n\n");
code_edit->set_line_as_breakpoint(9, true);
CHECK(code_edit->is_line_breakpointed(9));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->select(0, 0, 6, 0);
args = { { 9 }, { 4 } };
SEND_GUI_ACTION("ui_text_newline");
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_breakpointed(9));
ERR_PRINT_ON;
CHECK(code_edit->is_line_breakpointed(4));
SIGNAL_CHECK("breakpoint_toggled", args);
args = { { 9 }, { 14 } };
code_edit->insert_text_at_caret("\n\n\n\n\n");
MessageQueue::get_singleton()->flush();
SIGNAL_DISCARD("breakpoint_toggled")
CHECK(code_edit->is_line_breakpointed(9));
code_edit->select(0, 0, 6, 0);
code_edit->insert_text_at_caret("\n\n\n\n\n\n\n\n\n\n\n");
MessageQueue::get_singleton()->flush();
CHECK(code_edit->is_line_breakpointed(14));
SIGNAL_CHECK("breakpoint_toggled", args);
}
SUBCASE("[CodeEdit] breakpoints and undo") {
Array args = { { 1 } };
code_edit->set_text("\n\n");
code_edit->set_line_as_breakpoint(1, true);
CHECK(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_breakpointed(0));
SIGNAL_CHECK("breakpoint_toggled", args);
code_edit->undo();
CHECK_FALSE(code_edit->is_line_breakpointed(1));
SIGNAL_CHECK_FALSE("breakpoint_toggled");
}
SIGNAL_UNWATCH(code_edit, "breakpoint_toggled");
}
SUBCASE("[CodeEdit] bookmarks") {
SUBCASE("[CodeEdit] draw bookmarks gutter") {
code_edit->set_draw_bookmarks_gutter(false);
CHECK_FALSE(code_edit->is_drawing_bookmarks_gutter());
code_edit->set_draw_bookmarks_gutter(true);
CHECK(code_edit->is_drawing_bookmarks_gutter());
}
SUBCASE("[CodeEdit] set line as bookmarks") {
ERR_PRINT_OFF;
code_edit->set_line_as_bookmarked(-1, true);
CHECK_FALSE(code_edit->is_line_bookmarked(-1));
code_edit->set_line_as_bookmarked(1, true);
CHECK_FALSE(code_edit->is_line_bookmarked(1));
ERR_PRINT_ON;
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->get_bookmarked_lines()[0] == 0);
CHECK(code_edit->is_line_bookmarked(0));
code_edit->set_line_as_bookmarked(0, false);
CHECK_FALSE(code_edit->is_line_bookmarked(0));
}
SUBCASE("[CodeEdit] clear bookmarked lines") {
code_edit->clear_bookmarked_lines();
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->is_line_bookmarked(0));
code_edit->clear_bookmarked_lines();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
}
SUBCASE("[CodeEdit] bookmarks and set text") {
code_edit->set_text("test\nline");
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->is_line_bookmarked(0));
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK(code_edit->is_line_bookmarked(0));
code_edit->clear_bookmarked_lines();
code_edit->set_text("test\nline");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_bookmarked(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] bookmarks and clear") {
code_edit->set_text("test\nline");
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->is_line_bookmarked(0));
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
code_edit->clear_bookmarked_lines();
code_edit->set_text("test\nline");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_bookmarked(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] bookmarks and new lines no text") {
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->is_line_bookmarked(0));
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK_FALSE(code_edit->is_line_bookmarked(0));
CHECK(code_edit->is_line_bookmarked(1));
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK_FALSE(code_edit->is_line_bookmarked(1));
CHECK(code_edit->is_line_bookmarked(2));
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_bookmarked(2));
CHECK(code_edit->is_line_bookmarked(3));
}
SUBCASE("[CodeEdit] bookmarks and new lines with text") {
code_edit->insert_text_at_caret("text");
code_edit->set_line_as_bookmarked(0, true);
CHECK(code_edit->is_line_bookmarked(0));
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_bookmarked(0));
CHECK_FALSE(code_edit->is_line_bookmarked(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK(code_edit->is_line_bookmarked(0));
CHECK_FALSE(code_edit->is_line_bookmarked(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_bookmarked(0));
CHECK(code_edit->is_line_bookmarked(1));
}
SUBCASE("[CodeEdit] bookmarks and backspace") {
code_edit->set_text("\n\n");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->set_caret_line(2);
SEND_GUI_ACTION("ui_text_backspace");
CHECK(code_edit->is_line_bookmarked(1));
SEND_GUI_ACTION("ui_text_backspace");
CHECK_FALSE(code_edit->is_line_bookmarked(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_bookmarked(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] bookmarks and delete") {
code_edit->set_text("\n\n");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->set_caret_line(1);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 1);
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_bookmarked(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] bookmarks and delete selection") {
code_edit->set_text("\n\n");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
}
SUBCASE("[CodeEdit] bookmarks and undo") {
code_edit->set_text("\n\n");
code_edit->set_line_as_bookmarked(1, true);
CHECK(code_edit->is_line_bookmarked(1));
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_bookmarked(0));
code_edit->undo();
CHECK_FALSE(code_edit->is_line_bookmarked(1));
}
}
SUBCASE("[CodeEdit] executing lines") {
SUBCASE("[CodeEdit] draw executing lines gutter") {
code_edit->set_draw_executing_lines_gutter(false);
CHECK_FALSE(code_edit->is_drawing_executing_lines_gutter());
code_edit->set_draw_executing_lines_gutter(true);
CHECK(code_edit->is_drawing_executing_lines_gutter());
}
SUBCASE("[CodeEdit] set line as executing lines") {
ERR_PRINT_OFF;
code_edit->set_line_as_executing(-1, true);
CHECK_FALSE(code_edit->is_line_executing(-1));
code_edit->set_line_as_executing(1, true);
CHECK_FALSE(code_edit->is_line_executing(1));
ERR_PRINT_ON;
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->get_executing_lines()[0] == 0);
CHECK(code_edit->is_line_executing(0));
code_edit->set_line_as_executing(0, false);
CHECK_FALSE(code_edit->is_line_executing(0));
}
SUBCASE("[CodeEdit] clear executing lines lines") {
code_edit->clear_executing_lines();
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->is_line_executing(0));
code_edit->clear_executing_lines();
CHECK_FALSE(code_edit->is_line_executing(0));
}
SUBCASE("[CodeEdit] executing lines and set text") {
code_edit->set_text("test\nline");
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->is_line_executing(0));
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK(code_edit->is_line_executing(0));
code_edit->clear_executing_lines();
code_edit->set_text("test\nline");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->set_text("");
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_executing(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_executing(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] executing lines and clear") {
code_edit->set_text("test\nline");
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->is_line_executing(0));
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_executing(0));
code_edit->clear_executing_lines();
code_edit->set_text("test\nline");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->clear();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_executing(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_executing(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] executing lines and new lines no text") {
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->is_line_executing(0));
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK_FALSE(code_edit->is_line_executing(0));
CHECK(code_edit->is_line_executing(1));
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK_FALSE(code_edit->is_line_executing(1));
CHECK(code_edit->is_line_executing(2));
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_executing(2));
CHECK(code_edit->is_line_executing(3));
}
SUBCASE("[CodeEdit] executing lines and new lines with text") {
code_edit->insert_text_at_caret("text");
code_edit->set_line_as_executing(0, true);
CHECK(code_edit->is_line_executing(0));
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_executing(0));
CHECK_FALSE(code_edit->is_line_executing(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line_count() == 3);
CHECK(code_edit->is_line_executing(0));
CHECK_FALSE(code_edit->is_line_executing(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line_count() == 4);
CHECK_FALSE(code_edit->is_line_executing(0));
CHECK(code_edit->is_line_executing(1));
}
SUBCASE("[CodeEdit] executing lines and backspace") {
code_edit->set_text("\n\n");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->set_caret_line(2);
SEND_GUI_ACTION("ui_text_backspace");
CHECK(code_edit->is_line_executing(1));
SEND_GUI_ACTION("ui_text_backspace");
CHECK_FALSE(code_edit->is_line_executing(0));
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_executing(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] executing lines and delete") {
code_edit->set_text("\n\n");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->set_caret_line(1);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 2);
CHECK(code_edit->is_line_executing(1));
code_edit->set_caret_line(0);
SEND_GUI_ACTION("ui_text_delete");
CHECK(code_edit->get_line_count() == 1);
ERR_PRINT_OFF;
CHECK_FALSE(code_edit->is_line_executing(1));
ERR_PRINT_ON;
}
SUBCASE("[CodeEdit] executing lines and delete selection") {
code_edit->set_text("\n\n");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_executing(0));
}
SUBCASE("[CodeEdit] executing lines and undo") {
code_edit->set_text("\n\n");
code_edit->set_line_as_executing(1, true);
CHECK(code_edit->is_line_executing(1));
code_edit->select(0, 0, 2, 0);
code_edit->delete_selection();
MessageQueue::get_singleton()->flush();
CHECK_FALSE(code_edit->is_line_executing(0));
code_edit->undo();
CHECK_FALSE(code_edit->is_line_executing(1));
}
}
SUBCASE("[CodeEdit] line numbers") {
SUBCASE("[CodeEdit] draw line numbers gutter and padding") {
code_edit->set_draw_line_numbers(false);
CHECK_FALSE(code_edit->is_draw_line_numbers_enabled());
code_edit->set_draw_line_numbers(true);
CHECK(code_edit->is_draw_line_numbers_enabled());
code_edit->set_line_numbers_zero_padded(false);
CHECK_FALSE(code_edit->is_line_numbers_zero_padded());
code_edit->set_line_numbers_zero_padded(true);
CHECK(code_edit->is_line_numbers_zero_padded());
code_edit->set_line_numbers_zero_padded(false);
CHECK_FALSE(code_edit->is_line_numbers_zero_padded());
code_edit->set_draw_line_numbers(false);
CHECK_FALSE(code_edit->is_draw_line_numbers_enabled());
code_edit->set_line_numbers_zero_padded(true);
CHECK(code_edit->is_line_numbers_zero_padded());
}
}
SUBCASE("[CodeEdit] line folding") {
SUBCASE("[CodeEdit] draw line folding gutter") {
code_edit->set_draw_fold_gutter(false);
CHECK_FALSE(code_edit->is_drawing_fold_gutter());
code_edit->set_draw_fold_gutter(true);
CHECK(code_edit->is_drawing_fold_gutter());
}
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] delimiters") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
const Point2 OUTSIDE_DELIMITER = Point2(-1, -1);
code_edit->clear_string_delimiters();
code_edit->clear_comment_delimiters();
SUBCASE("[CodeEdit] add and remove delimiters") {
SUBCASE("[CodeEdit] add and remove string delimiters") {
code_edit->add_string_delimiter("\"", "\"", false);
CHECK(code_edit->has_string_delimiter("\""));
CHECK(code_edit->get_string_delimiters().size() == 1);
ERR_PRINT_OFF;
code_edit->add_string_delimiter("\"", "\'", false);
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->add_string_delimiter("'", "\"", false);
CHECK(code_edit->has_string_delimiter("'"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->add_string_delimiter("f", "\"", false);
CHECK_FALSE(code_edit->has_string_delimiter("f"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->add_string_delimiter("f", "\"", false);
CHECK_FALSE(code_edit->has_string_delimiter("f"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->add_string_delimiter("@", "f", false);
CHECK_FALSE(code_edit->has_string_delimiter("@"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->add_string_delimiter("f", "f", false);
CHECK_FALSE(code_edit->has_string_delimiter("f"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->add_string_delimiter("", "#", false);
CHECK_FALSE(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 2);
ERR_PRINT_ON;
code_edit->add_string_delimiter("#", "", false);
CHECK(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 3);
code_edit->remove_string_delimiter("#");
CHECK_FALSE(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 2);
TypedArray<String> delimiters = { "^^ ^^" };
code_edit->set_string_delimiters(delimiters);
CHECK_FALSE(code_edit->has_string_delimiter("\""));
CHECK(code_edit->has_string_delimiter("^^"));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->clear_string_delimiters();
CHECK_FALSE(code_edit->has_string_delimiter("^^"));
CHECK(code_edit->get_string_delimiters().size() == 0);
}
SUBCASE("[CodeEdit] add and remove comment delimiters") {
code_edit->add_comment_delimiter("\"", "\"", false);
CHECK(code_edit->has_comment_delimiter("\""));
CHECK(code_edit->get_comment_delimiters().size() == 1);
ERR_PRINT_OFF;
code_edit->add_comment_delimiter("\"", "\'", false);
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->add_comment_delimiter("'", "\"", false);
CHECK(code_edit->has_comment_delimiter("'"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->add_comment_delimiter("f", "\"", false);
CHECK_FALSE(code_edit->has_comment_delimiter("f"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->add_comment_delimiter("f", "\"", false);
CHECK_FALSE(code_edit->has_comment_delimiter("f"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->add_comment_delimiter("@", "f", false);
CHECK_FALSE(code_edit->has_comment_delimiter("@"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->add_comment_delimiter("f", "f", false);
CHECK_FALSE(code_edit->has_comment_delimiter("f"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->add_comment_delimiter("", "#", false);
CHECK_FALSE(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
ERR_PRINT_ON;
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 3);
code_edit->remove_comment_delimiter("#");
CHECK_FALSE(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
TypedArray<String> delimiters = { "^^ ^^" };
code_edit->set_comment_delimiters(delimiters);
CHECK_FALSE(code_edit->has_comment_delimiter("\""));
CHECK(code_edit->has_comment_delimiter("^^"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->clear_comment_delimiters();
CHECK_FALSE(code_edit->has_comment_delimiter("^^"));
CHECK(code_edit->get_comment_delimiters().size() == 0);
}
SUBCASE("[CodeEdit] add and remove mixed delimiters") {
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
ERR_PRINT_OFF;
code_edit->add_string_delimiter("#", "", false);
CHECK_FALSE(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 0);
code_edit->add_string_delimiter("\"", "\"", false);
CHECK(code_edit->has_string_delimiter("\""));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->add_comment_delimiter("\"", "", false);
CHECK_FALSE(code_edit->has_comment_delimiter("\""));
CHECK(code_edit->get_comment_delimiters().size() == 1);
ERR_PRINT_ON;
code_edit->remove_comment_delimiter("\"");
CHECK(code_edit->has_string_delimiter("\""));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->remove_string_delimiter("#");
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->clear_comment_delimiters();
CHECK(code_edit->has_string_delimiter("\""));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->clear_string_delimiters();
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
}
}
SUBCASE("[CodeEdit] single line delimiters") {
SUBCASE("[CodeEdit] single line string delimiters") {
code_edit->add_string_delimiter("#", "", false);
CHECK(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->insert_text_at_caret(" \n#\n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 1) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 1) == Point2(2, 1));
CHECK(code_edit->is_in_string(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
int idx = code_edit->is_in_string(1, 1);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "");
code_edit->set_text(" \n# # \n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 1) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 1) == Point2(6, 1));
CHECK(code_edit->is_in_string(1, 5) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 5) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 5) == Point2(6, 1));
CHECK(code_edit->is_in_string(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
code_edit->set_text(" \n # # \n ");
CHECK(code_edit->is_in_string(1) != -1);
code_edit->set_text(" \n text # # \n ");
CHECK(code_edit->is_in_string(1) == -1);
code_edit->set_text(" \n # # \n ");
code_edit->remove_string_delimiter("#");
CHECK_FALSE(code_edit->has_string_delimiter("$"));
CHECK(code_edit->get_string_delimiters().size() == 0);
CHECK(code_edit->is_in_string(1) == -1);
code_edit->add_string_delimiter("#", "", false);
CHECK(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 1);
CHECK(code_edit->is_in_string(1) != -1);
code_edit->clear_string_delimiters();
CHECK_FALSE(code_edit->has_string_delimiter("$"));
CHECK(code_edit->get_string_delimiters().size() == 0);
CHECK(code_edit->is_in_string(1) == -1);
}
SUBCASE("[CodeEdit] single line comment delimiters") {
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->insert_text_at_caret(" \n#\n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 1) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 1) == Point2(2, 1));
CHECK(code_edit->is_in_comment(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
int idx = code_edit->is_in_comment(1, 1);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "");
code_edit->set_text(" \n# # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 1) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 1) == Point2(6, 1));
CHECK(code_edit->is_in_comment(1, 5) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 5) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 5) == Point2(6, 1));
CHECK(code_edit->is_in_comment(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
code_edit->set_text(" \n # # \n ");
CHECK(code_edit->is_in_comment(1) != -1);
code_edit->set_text(" \n text # # \n ");
CHECK(code_edit->is_in_comment(1) == -1);
code_edit->set_text(" \n # # \n ");
code_edit->remove_comment_delimiter("#");
CHECK_FALSE(code_edit->has_comment_delimiter("$"));
CHECK(code_edit->get_comment_delimiters().size() == 0);
CHECK(code_edit->is_in_comment(1) == -1);
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
CHECK(code_edit->is_in_comment(1) != -1);
code_edit->clear_comment_delimiters();
CHECK_FALSE(code_edit->has_comment_delimiter("$"));
CHECK(code_edit->get_comment_delimiters().size() == 0);
CHECK(code_edit->is_in_comment(1) == -1);
}
SUBCASE("[CodeEdit] single line mixed delimiters") {
code_edit->add_string_delimiter("&", "", false);
CHECK(code_edit->has_string_delimiter("&"));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->add_comment_delimiter("#", "", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->set_text(" \n# & \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 1) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 1) == Point2(6, 1));
CHECK(code_edit->is_in_comment(1, 5) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 5) == Point2(1, 1));
CHECK(code_edit->get_delimiter_end_position(1, 5) == Point2(6, 1));
CHECK(code_edit->is_in_string(1, 5) == -1);
CHECK(code_edit->is_in_comment(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
code_edit->remove_comment_delimiter("#");
CHECK_FALSE(code_edit->has_comment_delimiter("$"));
CHECK(code_edit->get_comment_delimiters().size() == 0);
CHECK(code_edit->is_in_comment(1, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 5) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 5) == Point2(4, 1));
CHECK(code_edit->get_delimiter_end_position(1, 5) == Point2(6, 1));
}
}
SUBCASE("[CodeEdit] multiline delimiters") {
SUBCASE("[CodeEdit] multiline string delimiters") {
code_edit->clear_string_delimiters();
code_edit->clear_comment_delimiters();
code_edit->add_string_delimiter("#", "#", false);
CHECK(code_edit->has_string_delimiter("#"));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->set_text(" \n # # \n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(5, 1));
CHECK(code_edit->is_in_string(1, 6) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 6) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 6) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
int idx = code_edit->is_in_string(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n\n # \n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(2, 3));
CHECK(code_edit->is_in_string(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(2, 3));
CHECK(code_edit->is_in_string(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(2, 3));
CHECK(code_edit->is_in_string(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
code_edit->set_text(" \n # \n \n # \n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(2, 3));
CHECK(code_edit->is_in_string(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(2, 3));
CHECK(code_edit->is_in_string(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(2, 3));
CHECK(code_edit->is_in_string(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
idx = code_edit->is_in_string(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->add_string_delimiter("^", "^", false);
CHECK(code_edit->has_string_delimiter("^"));
CHECK(code_edit->get_string_delimiters().size() == 2);
code_edit->set_text(" \n # ^\n \n^ # \n ");
CHECK(code_edit->is_in_string(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(3, 3));
CHECK(code_edit->is_in_string(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(3, 3));
CHECK(code_edit->is_in_string(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(3, 3));
CHECK(code_edit->is_in_string(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_string(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
idx = code_edit->is_in_string(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n ");
idx = code_edit->is_in_string(1, 2);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(-1, -1));
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n\n #\n ");
CHECK(code_edit->is_in_string(1) != -1);
CHECK(code_edit->is_in_string(2) != -1);
CHECK(code_edit->is_in_string(3) != -1);
code_edit->set_text(" \n test # \n\n # test \n ");
CHECK(code_edit->is_in_string(1) == -1);
CHECK(code_edit->is_in_string(2) != -1);
CHECK(code_edit->is_in_string(3) == -1);
code_edit->set_text("\n\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(0);
CHECK(code_edit->is_in_string(0) == -1);
CHECK(code_edit->is_in_string(1) == -1);
code_edit->insert_text_at_caret("#");
CHECK(code_edit->is_in_string(0) != -1);
CHECK(code_edit->is_in_string(1) != -1);
code_edit->insert_text_at_caret("#");
CHECK(code_edit->is_in_string(0) != -1);
CHECK(code_edit->is_in_string(1) == -1);
}
SUBCASE("[CodeEdit] multiline comment delimiters") {
code_edit->add_comment_delimiter("#", "#", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->set_text(" \n # # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(5, 1));
CHECK(code_edit->is_in_comment(1, 6) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 6) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 6) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(2, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(2, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(2, 1) == OUTSIDE_DELIMITER);
int idx = code_edit->is_in_comment(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n\n # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(2, 3));
CHECK(code_edit->is_in_comment(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(2, 3));
CHECK(code_edit->is_in_comment(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(2, 3));
CHECK(code_edit->is_in_comment(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
code_edit->set_text(" \n # \n \n # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(2, 3));
CHECK(code_edit->is_in_comment(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(2, 3));
CHECK(code_edit->is_in_comment(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(2, 3));
CHECK(code_edit->is_in_comment(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
idx = code_edit->is_in_comment(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->add_comment_delimiter("^", "^", false);
CHECK(code_edit->has_comment_delimiter("^"));
CHECK(code_edit->get_comment_delimiters().size() == 2);
code_edit->set_text(" \n # ^\n \n^ # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(3, 3));
CHECK(code_edit->is_in_comment(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(3, 3));
CHECK(code_edit->is_in_comment(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(3, 3));
CHECK(code_edit->is_in_comment(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
idx = code_edit->is_in_comment(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n ");
idx = code_edit->is_in_comment(1, 2);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(-1, -1));
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
code_edit->set_text(" \n # \n\n #\n ");
CHECK(code_edit->is_in_comment(1) != -1);
CHECK(code_edit->is_in_comment(2) != -1);
CHECK(code_edit->is_in_comment(3) != -1);
code_edit->set_text(" \n test # \n\n # test \n ");
CHECK(code_edit->is_in_comment(1) == -1);
CHECK(code_edit->is_in_comment(2) != -1);
CHECK(code_edit->is_in_comment(3) == -1);
code_edit->set_text("\n\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(0);
CHECK(code_edit->is_in_comment(0) == -1);
CHECK(code_edit->is_in_comment(1) == -1);
code_edit->insert_text_at_caret("#");
CHECK(code_edit->is_in_comment(0) != -1);
CHECK(code_edit->is_in_comment(1) != -1);
code_edit->insert_text_at_caret("#");
CHECK(code_edit->is_in_comment(0) != -1);
CHECK(code_edit->is_in_comment(1) == -1);
}
SUBCASE("[CodeEdit] multiline mixed delimiters") {
code_edit->add_comment_delimiter("#", "#", false);
CHECK(code_edit->has_comment_delimiter("#"));
CHECK(code_edit->get_comment_delimiters().size() == 1);
code_edit->add_string_delimiter("^", "^", false);
CHECK(code_edit->has_string_delimiter("^"));
CHECK(code_edit->get_string_delimiters().size() == 1);
code_edit->set_text(" \n # ^\n \n^ # \n ");
CHECK(code_edit->is_in_comment(0, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(0, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 0) == -1);
CHECK(code_edit->get_delimiter_start_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(1, 0) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(1, 2) != -1);
CHECK(code_edit->get_delimiter_start_position(1, 2) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(1, 2) == Point2(3, 3));
CHECK(code_edit->is_in_comment(2, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(2, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(2, 0) == Point2(3, 3));
CHECK(code_edit->is_in_comment(3, 0) != -1);
CHECK(code_edit->get_delimiter_start_position(3, 0) == Point2(2, 1));
CHECK(code_edit->get_delimiter_end_position(3, 0) == Point2(3, 3));
CHECK(code_edit->is_in_comment(3, 3) == -1);
CHECK(code_edit->get_delimiter_start_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(3, 3) == OUTSIDE_DELIMITER);
CHECK(code_edit->is_in_comment(4, 1) == -1);
CHECK(code_edit->get_delimiter_start_position(4, 1) == OUTSIDE_DELIMITER);
CHECK(code_edit->get_delimiter_end_position(4, 1) == OUTSIDE_DELIMITER);
int idx = code_edit->is_in_comment(1, 2);
CHECK(code_edit->get_delimiter_start_key(idx) == "#");
CHECK(code_edit->get_delimiter_end_key(idx) == "#");
CHECK(code_edit->is_in_comment(1) != -1);
CHECK(code_edit->is_in_comment(2) != -1);
CHECK(code_edit->is_in_comment(3) != -1);
}
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] indent") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
SUBCASE("[CodeEdit] indent settings") {
code_edit->set_indent_size(10);
CHECK(code_edit->get_indent_size() == 10);
CHECK(code_edit->get_tab_size() == 10);
code_edit->set_auto_indent_enabled(false);
CHECK_FALSE(code_edit->is_auto_indent_enabled());
code_edit->set_auto_indent_enabled(true);
CHECK(code_edit->is_auto_indent_enabled());
code_edit->set_indent_using_spaces(false);
CHECK_FALSE(code_edit->is_indent_using_spaces());
code_edit->set_indent_using_spaces(true);
CHECK(code_edit->is_indent_using_spaces());
TypedArray<String> auto_indent_prefixes = { "::", "s", "1" };
code_edit->set_auto_indent_prefixes(auto_indent_prefixes);
auto_indent_prefixes = code_edit->get_auto_indent_prefixes();
CHECK(auto_indent_prefixes.has(":"));
CHECK(auto_indent_prefixes.has("s"));
CHECK(auto_indent_prefixes.has("1"));
}
SUBCASE("[CodeEdit] indent tabs") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(false);
code_edit->set_editable(false);
code_edit->do_indent();
CHECK(code_edit->get_line(0).is_empty());
code_edit->indent_lines();
CHECK(code_edit->get_line(0).is_empty());
code_edit->set_editable(true);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\t");
SEND_GUI_ACTION("ui_text_indent");
CHECK(code_edit->get_line(0) == "\t\t");
code_edit->set_text("");
code_edit->insert_text_at_caret("test");
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "test\t");
code_edit->set_text("test text");
code_edit->set_caret_column(5);
code_edit->add_caret(0, 7);
code_edit->add_caret(0, 2);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "te\tst \tte\txt");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->get_caret_column(0) == 7);
CHECK(code_edit->get_caret_column(1) == 10);
CHECK(code_edit->get_caret_column(2) == 3);
code_edit->remove_secondary_carets();
code_edit->set_text("");
code_edit->insert_text_at_caret("test");
code_edit->indent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("test");
code_edit->select_all();
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("test");
code_edit->select(0, 4, 0, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 5);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\ntext");
code_edit->select_all();
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "\ttext");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("test\ntext");
code_edit->select(0, 0, 1, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\ntext");
code_edit->select(0, 4, 1, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 5);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\ntext");
code_edit->select(1, 0, 0, 4);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("test");
code_edit->select(0, 1, 0, 2);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text("test");
code_edit->select(0, 1, 0, 2);
code_edit->add_caret(0, 4);
code_edit->select(0, 4, 0, 3, 1);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 0);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 3);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 0);
CHECK(code_edit->get_selection_origin_column(1) == 5);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 4);
}
SUBCASE("[CodeEdit] indent spaces") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(true);
code_edit->set_editable(false);
code_edit->do_indent();
CHECK(code_edit->get_line(0).is_empty());
code_edit->indent_lines();
CHECK(code_edit->get_line(0).is_empty());
code_edit->set_editable(true);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " ");
SEND_GUI_ACTION("ui_text_indent");
CHECK(code_edit->get_line(0) == " ");
code_edit->set_text("");
code_edit->insert_text_at_caret("test");
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "test ");
code_edit->set_text("test text");
code_edit->set_caret_column(5);
code_edit->add_caret(0, 7);
code_edit->add_caret(0, 2);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == "te st te xt");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->get_caret_column(0) == 10);
CHECK(code_edit->get_caret_column(1) == 14);
CHECK(code_edit->get_caret_column(2) == 4);
code_edit->remove_secondary_carets();
code_edit->set_text("");
code_edit->insert_text_at_caret("test");
code_edit->indent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("test");
code_edit->select_all();
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("test");
code_edit->select(0, 4, 0, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test");
code_edit->select_all();
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("test\ntext");
code_edit->select_all();
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == " text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("test\ntext");
code_edit->select(0, 0, 1, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\ntext");
code_edit->select(0, 4, 1, 0);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\ntext");
code_edit->select(1, 0, 0, 4);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("test");
code_edit->select(0, 1, 0, 2);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 5);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 6);
code_edit->set_text("test");
code_edit->select(0, 1, 0, 2);
code_edit->add_caret(0, 4);
code_edit->select(0, 4, 0, 3, 1);
code_edit->do_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 0);
CHECK(code_edit->get_selection_origin_column(0) == 5);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 6);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 0);
CHECK(code_edit->get_selection_origin_column(1) == 8);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 7);
}
SUBCASE("[CodeEdit] unindent tabs") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(false);
code_edit->set_text("\t");
code_edit->set_editable(false);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\t");
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\t");
code_edit->set_editable(true);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "");
code_edit->set_text("");
code_edit->insert_text_at_caret("\t");
code_edit->backspace();
CHECK(code_edit->get_line(0) == "");
code_edit->set_text("");
code_edit->insert_text_at_caret("\ttest");
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text("\t\ttest");
code_edit->set_caret_column(1);
code_edit->add_caret(0, 3);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_caret_count() == 2);
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 2);
code_edit->remove_secondary_carets();
code_edit->set_text("\t\ttest");
code_edit->set_caret_column(0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\t\ttest");
SEND_GUI_ACTION("ui_text_dedent");
CHECK(code_edit->get_line(0) == "\ttest");
code_edit->set_text("\t\ttest");
code_edit->select_all();
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("\t\ttest");
code_edit->select(0, 6, 0, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 5);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\t\ttest\n\t\ttext");
code_edit->select_all();
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "\ttext");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("\ttest\n\ttext");
code_edit->select(0, 0, 1, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "\ttext");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\ttest\n\ttext");
code_edit->select(1, 0, 0, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "\ttext");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\ttest\n\ttext");
code_edit->select(0, 5, 1, 1);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 4);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\ttest");
code_edit->select(0, 1, 0, 2);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("\ttest");
code_edit->select(0, 0, 0, 1);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\t\ttest");
code_edit->select(0, 1, 0, 2);
code_edit->add_caret(0, 4);
code_edit->select(0, 4, 0, 3, 1);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 0);
CHECK(code_edit->get_selection_origin_column(0) == 0);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 1);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 0);
CHECK(code_edit->get_selection_origin_column(1) == 3);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 2);
}
SUBCASE("[CodeEdit] unindent spaces") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(true);
code_edit->set_text(" ");
code_edit->set_editable(false);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " ");
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " ");
code_edit->set_editable(true);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "");
code_edit->set_text("");
code_edit->insert_text_at_caret(" ");
code_edit->backspace();
CHECK(code_edit->get_line(0) == "");
code_edit->set_text("");
code_edit->insert_text_at_caret(" a");
code_edit->backspace();
CHECK(code_edit->get_line(0) == " ");
code_edit->set_text("");
code_edit->insert_text_at_caret(" test");
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text(" test");
code_edit->set_caret_column(1);
code_edit->add_caret(0, 9);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_caret_count() == 2);
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 5);
code_edit->remove_secondary_carets();
code_edit->set_text(" test");
code_edit->set_caret_column(0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test");
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
code_edit->set_text(" test");
SEND_GUI_ACTION("ui_text_dedent");
CHECK(code_edit->get_line(0) == " test");
code_edit->set_text(" test");
code_edit->select_all();
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text(" test");
code_edit->select(0, 12, 0, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test\n text");
code_edit->select_all();
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == " text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text(" test\n text");
code_edit->select(0, 0, 1, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == " text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test\n text");
code_edit->select(1, 0, 0, 0);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == " text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test\n text");
code_edit->select(0, 5, 1, 1);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 1);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test");
code_edit->select(0, 4, 0, 5);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text(" test");
code_edit->select(0, 0, 0, 4);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test");
code_edit->select(0, 1, 0, 2);
code_edit->add_caret(0, 4);
code_edit->select(0, 12, 0, 10, 1);
code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_caret_count() == 2);
CHECK_FALSE(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 0);
CHECK(code_edit->get_selection_origin_column(1) == 8);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 6);
}
SUBCASE("[CodeEdit] auto indent") {
SUBCASE("[CodeEdit] auto indent tabs") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(false);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test:");
CHECK(code_edit->get_line(1) == "\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test:");
CHECK(code_edit->get_line(1) == "\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "test:");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test: ");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: ");
CHECK(code_edit->get_line(1) == "\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test: # comment");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: # comment");
CHECK(code_edit->get_line(1) == "\t");
code_edit->remove_comment_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->add_string_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test: # string");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: # string");
CHECK(code_edit->get_line(1) == "");
code_edit->remove_string_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test := 0 # comment");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test := 0 # comment");
CHECK(code_edit->get_line(1) == "");
code_edit->remove_comment_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test := 0");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test := 0");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("\ttest");
code_edit->set_caret_column(3);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "\tte");
CHECK(code_edit->get_line(1) == "\tst");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("\ttest");
code_edit->set_caret_column(3);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == "\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("\ttest");
code_edit->set_caret_column(3);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "\t");
CHECK(code_edit->get_line(1) == "\ttest");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("\ttest:");
code_edit->set_caret_column(6);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "\ttest:");
CHECK(code_edit->get_line(1) == "\t\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 2);
code_edit->set_text("\ttest:");
code_edit->set_caret_column(3);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "\ttest:");
CHECK(code_edit->get_line(1) == "\t\t");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 2);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test{");
CHECK(code_edit->get_line(1) == "\t");
CHECK(code_edit->get_line(2) == "}");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "test{}");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test{}");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
}
SUBCASE("[CodeEdit] auto indent spaces") {
code_edit->set_indent_size(4);
code_edit->set_auto_indent_enabled(true);
code_edit->set_indent_using_spaces(true);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test:");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test:");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text("");
code_edit->insert_text_at_caret("test:");
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "test:");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test: ");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: ");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test: # comment");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: # comment");
CHECK(code_edit->get_line(1) == " ");
code_edit->remove_comment_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->add_string_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test: # string");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test: # string");
CHECK(code_edit->get_line(1) == "");
code_edit->remove_string_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test := 0 # comment");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test := 0 # comment");
CHECK(code_edit->get_line(1) == "");
code_edit->remove_comment_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test := 0");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test := 0");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(" test");
code_edit->set_caret_column(6);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == " te");
CHECK(code_edit->get_line(1) == " st");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text(" test");
code_edit->set_caret_column(6);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text(" test");
code_edit->set_caret_column(6);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == " ");
CHECK(code_edit->get_line(1) == " test");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text(" test:");
code_edit->set_caret_column(9);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == " test:");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text(" test:");
code_edit->set_caret_column(9);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == " test:");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test{");
CHECK(code_edit->get_line(1) == " ");
CHECK(code_edit->get_line(2) == "}");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "test{}");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("");
code_edit->insert_text_at_caret("test{}");
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test{}");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("");
code_edit->insert_text_at_caret("test:test#:");
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test:test#:");
CHECK(code_edit->get_line(1) == "");
code_edit->remove_comment_delimiter("#");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
}
}
SUBCASE("[CodeEdit] convert indent to tabs") {
code_edit->set_indent_size(4);
code_edit->set_indent_using_spaces(false);
code_edit->set_text(" test");
code_edit->select(0, 9, 0, 8);
code_edit->convert_indent();
CHECK(code_edit->get_line(0) == "\t\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 3);
CHECK(code_edit->get_caret_column() == 2);
code_edit->set_text(" test\n");
code_edit->select(0, 8, 0, 9);
code_edit->convert_indent();
CHECK(code_edit->get_line(0) == "\t\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text("\n test\n");
code_edit->select(1, 8, 1, 9);
code_edit->convert_indent();
CHECK(code_edit->get_line(1) == "\t\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text("\n test");
code_edit->select(1, 8, 1, 9);
code_edit->convert_indent();
CHECK(code_edit->get_line(1) == "\t\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text(" test\n test\n");
code_edit->select(1, 8, 1, 9);
code_edit->convert_indent(1, 1);
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->get_line(1) == "\t\ttest");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text("'''\n test\n test\n'''");
code_edit->select(1, 0, 1, 8);
code_edit->convert_indent();
CHECK(code_edit->get_line(1) == " test");
CHECK(code_edit->get_line(2) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_column() == 8);
}
SUBCASE("[CodeEdit] convert indent to spaces") {
code_edit->set_indent_size(4);
code_edit->set_indent_using_spaces(true);
code_edit->set_text("\t\ttest");
code_edit->select(0, 3, 0, 2);
code_edit->convert_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 9);
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_text("\t\ttest\n");
code_edit->select(0, 2, 0, 3);
code_edit->convert_indent();
CHECK(code_edit->get_line(0) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_column() == 9);
code_edit->set_text("\n\t\ttest\n");
code_edit->select(1, 2, 1, 3);
code_edit->convert_indent();
CHECK(code_edit->get_line(1) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_column() == 9);
code_edit->set_text("\n\t\ttest");
code_edit->select(1, 2, 1, 3);
code_edit->convert_indent();
CHECK(code_edit->get_line(1) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_column() == 9);
code_edit->set_text("\ttest\n\t\ttest\n");
code_edit->select(1, 2, 1, 3);
code_edit->convert_indent(1, 1);
CHECK(code_edit->get_line(0) == "\ttest");
CHECK(code_edit->get_line(1) == " test");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_column() == 9);
ERR_PRINT_OFF;
code_edit->convert_indent(0, 4);
code_edit->convert_indent(4, 5);
code_edit->convert_indent(4, 1);
ERR_PRINT_ON;
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] folding") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
code_edit->set_line_folding_enabled(true);
SUBCASE("[CodeEdit] folding settings") {
code_edit->set_line_folding_enabled(true);
CHECK(code_edit->is_line_folding_enabled());
code_edit->set_line_folding_enabled(false);
CHECK_FALSE(code_edit->is_line_folding_enabled());
}
SUBCASE("[CodeEdit] folding") {
code_edit->set_text("line1\nline2\nline3");
for (int i = 0; i < 2; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("\tline1\n\tline2\n\tline3");
for (int i = 0; i < 2; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("line1\n\tline2\nline3");
CHECK(code_edit->can_fold_line(0));
for (int i = 1; i < 2; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("line1\n\tline2\n\n\nline3");
CHECK(code_edit->can_fold_line(0));
for (int i = 1; i < 2; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("line1\n\tline2\n\t\tline3\nline4");
CHECK(code_edit->can_fold_line(0));
CHECK(code_edit->can_fold_line(1));
for (int i = 2; i < 3; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK(code_edit->is_line_folded(1));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK_FALSE(code_edit->is_line_folded(3));
CHECK(code_edit->get_next_visible_line_offset_from(2, 1) == 2);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK_FALSE(code_edit->is_line_folded(3));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
CHECK(code_edit->get_folded_lines().size() == 1);
CHECK((int)code_edit->get_folded_lines()[0] == 0);
code_edit->unfold_line(1);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->unfold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
CHECK(code_edit->get_folded_lines().size() == 0);
code_edit->fold_all_lines();
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
code_edit->unfold_all_lines();
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->toggle_foldable_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
code_edit->unfold_line(1);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("line1\n\tline2\n\n\n\ttest\n\nline3");
CHECK(code_edit->can_fold_line(0));
for (int i = 1; i < code_edit->get_line_count(); i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
code_edit->fold_line(i);
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
for (int i = 1; i < code_edit->get_line_count(); i++) {
CHECK_FALSE(code_edit->is_line_folded(i));
}
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 5);
code_edit->set_text("line1\n\tline2");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->add_comment_delimiter("#", "", true);
code_edit->set_text("#line1\n#\tline2");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("test #line1\n#\tline2");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("#line1\ntest #\tline2");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->add_string_delimiter("^", "", true);
code_edit->set_text("^line1\n^\tline2");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("test ^line1\n^\tline2");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("^line1\ntest ^\tline2");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->add_comment_delimiter("&", "&", false);
code_edit->set_text("&line1\n\tline2&\nline3");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("&line1\nline2&\ntest");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(2));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("test &line1\n\tline2&");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("&line1\n\tline2& test");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->add_string_delimiter("$", "$", false);
code_edit->set_text("$line1\n\tline2$");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("test $line1\n\tline2$");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("$line1\n\tline2$ test");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 1);
code_edit->set_text("test\n\tline1\n#line1\n#line2\n\ttest");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
code_edit->set_text("test\n\tline1\n^line1\n^line2\n\ttest");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
code_edit->set_text("line1\n\tline2\n#test");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("line1\n#test\n\tline2\nline3");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(2));
code_edit->fold_line(2);
CHECK_FALSE(code_edit->is_line_folded(2));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
code_edit->set_text("\tline1\n\t\tline2\n#test");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 2);
code_edit->set_text("\tline1\n#test\n\t\tline2\nline3");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(2));
code_edit->fold_line(2);
CHECK_FALSE(code_edit->is_line_folded(2));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 3);
code_edit->set_text("test\n\tline1\n&line1\nline2&\n\ttest");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
code_edit->set_text("test\n\tline1\n$line1\nline2$\n\ttest");
CHECK(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
}
SUBCASE("[CodeEdit] folding comments including and/or adjacent to code regions") {
code_edit->add_comment_delimiter("#", "", true);
code_edit->set_text("#line0\n#region a\nnothing\n#line3\n#endregion");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK_FALSE(code_edit->can_fold_line(3));
code_edit->set_text("#line0\n#line1\n#region a\n#line3\n#line4\nnothing\n#endregion");
CHECK(code_edit->can_fold_line(3));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_EQ(code_edit->get_visible_line_count_in_range(0, 1), 1);
CHECK_EQ(code_edit->get_visible_line_count_in_range(2, 2), 1);
code_edit->set_text("#region a\nnothing\n#line2\n#line3\n#endregion\n#line5\n#line6");
CHECK(code_edit->can_fold_line(5));
code_edit->fold_line(2);
CHECK(code_edit->is_line_folded(2));
CHECK_EQ(code_edit->get_visible_line_count_in_range(2, 3), 1);
CHECK_EQ(code_edit->get_visible_line_count_in_range(4, 4), 1);
code_edit->add_comment_delimiter("/*", "*/", false);
code_edit->set_text("/*\nnothing\n#region a\n*/\n#endregion");
CHECK(code_edit->can_fold_line(0));
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_EQ(code_edit->get_visible_line_count_in_range(0, 3), 1);
CHECK_EQ(code_edit->get_visible_line_count_in_range(4, 4), 1);
}
SUBCASE("[CodeEdit] folding carets") {
code_edit->set_text("test\n\tline1\n\t\tline 2\n");
code_edit->set_caret_line(1);
code_edit->set_caret_column(0);
code_edit->add_caret(1, 3);
code_edit->add_caret(2, 8);
code_edit->add_caret(2, 1);
code_edit->select(2, 0, 2, 1, 3);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK(code_edit->get_caret_count() == 1);
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 4);
code_edit->set_text("test\n\tline1");
code_edit->select(1, 1, 1, 2);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\n\tlline1");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 3);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 2);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 4);
code_edit->undo();
CHECK(code_edit->get_text() == "test\n\tline1");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 2);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 1);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->redo();
CHECK(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 3);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
}
SUBCASE("[CodeEdit] actions unfold") {
code_edit->set_text("test\n\tline1 test\n\t\tline 2\ntest2");
code_edit->select(0, 0, 0, 4);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
code_edit->add_selection_for_next_occurrence();
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_caret_column() == 4);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_selection_origin_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 11);
CHECK(code_edit->get_selection_origin_column(1) == 7);
CHECK_FALSE(code_edit->is_line_folded(0));
code_edit->remove_secondary_carets();
code_edit->select(0, 0, 0, 4);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
code_edit->skip_selection_for_next_occurrence();
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_caret_column() == 11);
CHECK(code_edit->get_selection_origin_column() == 7);
CHECK_FALSE(code_edit->is_line_folded(0));
code_edit->remove_secondary_carets();
code_edit->deselect();
}
SUBCASE("[CodeEdit] toggle folding carets") {
code_edit->set_text("test\n\tline1\ntest2\n\tline2");
code_edit->set_caret_line(0);
code_edit->set_caret_column(1);
code_edit->toggle_foldable_lines_at_carets();
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(2));
code_edit->add_caret(2, 0);
code_edit->toggle_foldable_lines_at_carets();
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK(code_edit->is_line_folded(2));
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 1);
CHECK(code_edit->get_caret_line(1) == 2);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->unfold_all_lines();
code_edit->remove_secondary_carets();
code_edit->set_caret_line(0);
code_edit->set_caret_column(1);
code_edit->add_caret(0, 4);
code_edit->add_caret(1, 2);
code_edit->toggle_foldable_lines_at_carets();
CHECK(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(2));
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 1);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 4);
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] region folding") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
SUBCASE("[CodeEdit] region tags") {
code_edit->set_line_folding_enabled(true);
code_edit->set_text("#region region_name\nline2\n#endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK_FALSE(code_edit->is_line_code_region_start(1));
CHECK_FALSE(code_edit->is_line_code_region_start(2));
CHECK_FALSE(code_edit->is_line_code_region_end(0));
CHECK_FALSE(code_edit->is_line_code_region_end(1));
CHECK(code_edit->is_line_code_region_end(2));
code_edit->set_text("#region region_name\nline2\n#endregion\n#open region_name\nline2\n#close");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
CHECK_FALSE(code_edit->is_line_code_region_start(3));
CHECK_FALSE(code_edit->is_line_code_region_end(5));
code_edit->set_code_region_tags("open", "close");
CHECK_FALSE(code_edit->is_line_code_region_start(0));
CHECK_FALSE(code_edit->is_line_code_region_end(2));
CHECK(code_edit->is_line_code_region_start(3));
CHECK(code_edit->is_line_code_region_end(5));
code_edit->set_code_region_tags("region", "endregion");
CHECK(code_edit->get_code_region_start_tag() == "region");
CHECK(code_edit->get_code_region_end_tag() == "endregion");
ERR_PRINT_OFF;
code_edit->set_code_region_tags("same_tag", "same_tag");
ERR_PRINT_ON;
CHECK(code_edit->get_code_region_start_tag() == "region");
CHECK(code_edit->get_code_region_end_tag() == "endregion");
}
SUBCASE("[CodeEdit] create code region") {
code_edit->set_line_folding_enabled(true);
code_edit->set_text("line1\nline2\nline3");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->select(1, 0, 1, 4);
code_edit->create_code_region();
CHECK(code_edit->is_line_code_region_start(1));
CHECK(code_edit->is_line_code_region_end(3));
CHECK(code_edit->get_text() == "line1\n#region New Code Region\nline2\n#endregion\nline3");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selected_text() == "New Code Region");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 23);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->is_line_folded(1));
code_edit->undo();
CHECK(code_edit->get_text() == "line1\nline2\nline3");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 4);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->redo();
CHECK(code_edit->get_text() == "line1\n#region New Code Region\nline2\n#endregion\nline3");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selected_text() == "New Code Region");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 23);
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK_FALSE(code_edit->is_line_folded(1));
code_edit->set_text("line1\nline2\nline3");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->create_code_region();
CHECK(code_edit->get_text() == "line1\nline2\nline3");
code_edit->set_text("line1\nline2\nline3");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->select(0, 0, 0, 4, 0);
code_edit->add_caret(2, 5);
code_edit->select(2, 0, 2, 5, 1);
code_edit->create_code_region();
CHECK(code_edit->get_text() == "#region New Code Region\nline1\n#endregion\nline2\n#region New Code Region\nline3\n#endregion");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selected_text() == "New Code Region");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 23);
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 8);
code_edit->set_text("line1\nline2\nline3");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->select(0, 0, 0, 4, 0);
code_edit->add_caret(2, 5);
code_edit->create_code_region();
CHECK(code_edit->get_text() == "#region New Code Region\nline1\n#endregion\nline2\nline3");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selected_text() == "New Code Region");
code_edit->set_text("test line1\ntest line2\ntest line3");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->select(0, 0, 1, 2, 0);
code_edit->add_caret(1, 4);
code_edit->select(1, 4, 2, 5, 1);
code_edit->create_code_region();
CHECK(code_edit->get_text() == "#region New Code Region\ntest line1\ntest line2\ntest line3\n#endregion");
code_edit->set_text("//region region_name\nline2\n//endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("//", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
code_edit->set_text("line1\nline2\nline3");
code_edit->clear_comment_delimiters();
code_edit->create_code_region();
CHECK(code_edit->get_text() == "line1\nline2\nline3");
code_edit->add_comment_delimiter("/*", "*/");
code_edit->create_code_region();
CHECK(code_edit->get_text() == "line1\nline2\nline3");
}
SUBCASE("[CodeEdit] region comment delimiters") {
code_edit->set_line_folding_enabled(true);
code_edit->set_text("//region region_name\nline2\n//endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("/*", "*/");
code_edit->add_comment_delimiter("//", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
code_edit->set_text("#region region_name\nline2\n#endregion\n//region region_name\nline2\n//endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("//", "");
code_edit->add_comment_delimiter("#", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
CHECK_FALSE(code_edit->is_line_code_region_start(3));
CHECK_FALSE(code_edit->is_line_code_region_end(5));
code_edit->remove_comment_delimiter("#");
CHECK_FALSE(code_edit->is_line_code_region_start(0));
CHECK_FALSE(code_edit->is_line_code_region_end(2));
CHECK(code_edit->is_line_code_region_start(3));
CHECK(code_edit->is_line_code_region_end(5));
code_edit->set_text("//region region_name\nline2\n//endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("//", "");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
code_edit->clear_comment_delimiters();
CHECK_FALSE(code_edit->is_line_code_region_start(0));
CHECK_FALSE(code_edit->is_line_code_region_end(2));
}
SUBCASE("[CodeEdit] fold region") {
code_edit->set_line_folding_enabled(true);
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("#region region_name\nline2\nline3\n#endregion\nvisible line");
CHECK(code_edit->can_fold_line(0));
for (int i = 1; i < 5; i++) {
CHECK_FALSE(code_edit->can_fold_line(i));
}
for (int i = 0; i < 5; i++) {
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
ERR_PRINT_OFF;
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("#region region_name\nline2\nline3\n#bad_end_tag\nvisible line");
CHECK_FALSE(code_edit->can_fold_line(0));
ERR_PRINT_ON;
ERR_PRINT_OFF;
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("#region without end\n#region region2\nline3\n#endregion\n#no_end");
CHECK_FALSE(code_edit->can_fold_line(0));
CHECK(code_edit->can_fold_line(1));
ERR_PRINT_ON;
ERR_PRINT_OFF;
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("#region region1\n#region region2\nline3\n#endregion\n#endregion");
CHECK(code_edit->can_fold_line(0));
CHECK(code_edit->can_fold_line(1));
code_edit->fold_line(1);
CHECK(code_edit->get_next_visible_line_offset_from(2, 1) == 3);
code_edit->fold_line(0);
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
ERR_PRINT_ON;
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->set_text("#region region\ninside\nline3\n#endregion\nvisible");
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 4);
code_edit->unfold_line(1);
CHECK_FALSE(code_edit->is_line_folded(0));
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("#", "");
code_edit->clear_string_delimiters();
code_edit->add_string_delimiter("\"", "\"");
code_edit->set_text("#region region_name1\nline2\n\"\n#region region_name2\n#endregion\n\"\n#endregion\nvisible");
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(6));
CHECK(code_edit->can_fold_line(0));
for (int i = 1; i < 7; i++) {
if (i == 2) {
continue;
}
CHECK_FALSE(code_edit->can_fold_line(i));
}
for (int i = 0; i < 7; i++) {
CHECK_FALSE(code_edit->is_line_folded(i));
}
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
CHECK(code_edit->get_next_visible_line_offset_from(1, 1) == 7);
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] completion") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
SUBCASE("[CodeEdit] auto brace completion") {
code_edit->set_auto_brace_completion_enabled(true);
CHECK(code_edit->is_auto_brace_completion_enabled());
code_edit->set_highlight_matching_braces_enabled(true);
CHECK(code_edit->is_highlight_matching_braces_enabled());
Dictionary auto_brace_completion_pairs;
auto_brace_completion_pairs["["] = "]";
auto_brace_completion_pairs["'"] = "'";
auto_brace_completion_pairs[";"] = "'";
auto_brace_completion_pairs["'''"] = "'''";
code_edit->set_auto_brace_completion_pairs(auto_brace_completion_pairs);
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
CHECK(code_edit->get_auto_brace_completion_pairs()["["] == "]");
CHECK(code_edit->get_auto_brace_completion_pairs()["'"] == "'");
CHECK(code_edit->get_auto_brace_completion_pairs()[";"] == "'");
CHECK(code_edit->get_auto_brace_completion_pairs()["'''"] == "'''");
ERR_PRINT_OFF;
code_edit->add_auto_brace_completion_pair("[", "]");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("[", "");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("", "]");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("", "");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("a", "]");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("[", "a");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
code_edit->add_auto_brace_completion_pair("a", "a");
CHECK(code_edit->get_auto_brace_completion_pairs().size() == 4);
ERR_PRINT_ON;
CHECK(code_edit->has_auto_brace_completion_open_key("["));
CHECK(code_edit->has_auto_brace_completion_open_key("'"));
CHECK(code_edit->has_auto_brace_completion_open_key(";"));
CHECK(code_edit->has_auto_brace_completion_open_key("'''"));
CHECK_FALSE(code_edit->has_auto_brace_completion_open_key("("));
CHECK(code_edit->has_auto_brace_completion_close_key("]"));
CHECK(code_edit->has_auto_brace_completion_close_key("'"));
CHECK(code_edit->has_auto_brace_completion_close_key("'''"));
CHECK_FALSE(code_edit->has_auto_brace_completion_close_key(")"));
CHECK(code_edit->get_auto_brace_completion_close_key("[") == "]");
CHECK(code_edit->get_auto_brace_completion_close_key("'") == "'");
CHECK(code_edit->get_auto_brace_completion_close_key(";") == "'");
CHECK(code_edit->get_auto_brace_completion_close_key("'''") == "'''");
CHECK(code_edit->get_auto_brace_completion_close_key("(").is_empty());
code_edit->clear();
SEND_GUI_KEY_EVENT(Key::BRACKETLEFT);
CHECK(code_edit->get_line(0) == "[]");
code_edit->clear();
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_line(0) == "''");
CHECK(code_edit->get_caret_column() == 1);
SEND_GUI_ACTION("ui_text_caret_right");
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_line(0) == "''''''");
CHECK(code_edit->get_caret_column() == 3);
SEND_GUI_ACTION("ui_text_backspace");
CHECK(code_edit->get_line(0).is_empty());
SEND_GUI_KEY_EVENT(Key::BRACKETLEFT);
CHECK(code_edit->get_line(0) == "[]");
CHECK(code_edit->get_caret_column() == 1);
SEND_GUI_KEY_EVENT(Key::BRACKETRIGHT);
CHECK(code_edit->get_line(0) == "[]");
CHECK(code_edit->get_caret_column() == 2);
code_edit->clear();
SEND_GUI_KEY_EVENT(Key::A);
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_line(0) == "A'");
code_edit->add_comment_delimiter("#", "");
code_edit->clear();
SEND_GUI_KEY_EVENT(Key::NUMBERSIGN);
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_line(0) == "#'");
code_edit->clear();
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
SEND_GUI_KEY_EVENT(Key::QUOTEDBL);
CHECK(code_edit->get_line(0) == "'\"'");
code_edit->clear();
code_edit->insert_text_at_caret("abc");
code_edit->select_all();
SEND_GUI_KEY_EVENT(Key::BRACKETLEFT);
CHECK(code_edit->get_line(0) == "[abc]");
CHECK(code_edit->get_caret_column() == 4);
code_edit->clear();
code_edit->insert_text_at_caret("abc\nabc");
code_edit->select_all();
SEND_GUI_KEY_EVENT(Key::BRACKETLEFT);
CHECK(code_edit->get_text() == "[abc\nabc]");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 3);
code_edit->clear();
code_edit->insert_text_at_caret("abc");
code_edit->select_all();
SEND_GUI_KEY_EVENT(Key::KEY_1);
CHECK(code_edit->get_text() == "1");
code_edit->clear();
code_edit->insert_text_at_caret("\'\'abc");
code_edit->select(0, 2, 0, 5);
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_text() == "\'\'\'abc\'");
auto_brace_completion_pairs.erase("\'");
code_edit->set_auto_brace_completion_pairs(auto_brace_completion_pairs);
CHECK_FALSE(code_edit->has_auto_brace_completion_open_key("\'"));
code_edit->clear();
code_edit->insert_text_at_caret("\'\'abc");
code_edit->select(0, 2, 0, 5);
SEND_GUI_KEY_EVENT(Key::APOSTROPHE);
CHECK(code_edit->get_text() == "\'\'\'");
}
SUBCASE("[CodeEdit] autocomplete with brace completion") {
code_edit->set_auto_brace_completion_enabled(true);
CHECK(code_edit->is_auto_brace_completion_enabled());
code_edit->insert_text_at_caret("(te)");
code_edit->set_caret_column(3);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "(test())");
CHECK(code_edit->get_caret_column() == 7);
code_edit->undo();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test(");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "(test())");
CHECK(code_edit->get_caret_column() == 6);
code_edit->undo();
code_edit->set_auto_brace_completion_enabled(false);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "(test())");
CHECK(code_edit->get_caret_column() == 7);
code_edit->undo();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test(");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "(test()");
CHECK(code_edit->get_caret_column() == 6);
code_edit->set_auto_brace_completion_enabled(true);
code_edit->clear();
code_edit->insert_text_at_caret("\"\"");
code_edit->set_caret_column(1);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\"");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "\"test\"");
CHECK(code_edit->get_caret_column() == 6);
code_edit->undo();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "\"\"test\"");
CHECK(code_edit->get_caret_column() == 7);
code_edit->undo();
code_edit->set_auto_brace_completion_enabled(false);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\"");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "\"test\"");
CHECK(code_edit->get_caret_column() == 6);
code_edit->undo();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "\"\"test\"");
CHECK(code_edit->get_caret_column() == 7);
code_edit->undo();
}
SUBCASE("[CodeEdit] autocomplete") {
code_edit->set_code_completion_enabled(true);
CHECK(code_edit->is_code_completion_enabled());
TypedArray<String> completion_prefixes = { "", ".", ".", ",," };
ERR_PRINT_OFF;
code_edit->set_code_completion_prefixes(completion_prefixes);
ERR_PRINT_ON;
completion_prefixes = code_edit->get_code_completion_prefixes();
CHECK(completion_prefixes.size() == 2);
CHECK(completion_prefixes.has("."));
CHECK(completion_prefixes.has(","));
code_edit->set_text("test\ntest");
CHECK(code_edit->get_text_for_code_completion() == String::chr(0xFFFF) + "test\ntest");
}
SUBCASE("[CodeEdit] autocomplete request") {
SIGNAL_WATCH(code_edit, "code_completion_requested");
code_edit->set_code_completion_enabled(true);
Array signal_args = { {} };
code_edit->request_code_completion();
SIGNAL_CHECK_FALSE("code_completion_requested");
code_edit->request_code_completion(true);
SIGNAL_CHECK("code_completion_requested", signal_args);
SEND_GUI_ACTION("ui_text_completion_query");
SIGNAL_CHECK("code_completion_requested", signal_args);
TypedArray<String> completion_prefixes = { "." };
code_edit->set_code_completion_prefixes(completion_prefixes);
code_edit->insert_text_at_caret(".");
code_edit->request_code_completion();
SIGNAL_CHECK("code_completion_requested", signal_args);
code_edit->insert_text_at_caret(" ");
code_edit->request_code_completion();
SIGNAL_CHECK("code_completion_requested", signal_args);
code_edit->clear();
code_edit->insert_text_at_caret("t");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "test.", "test.");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test.");
SIGNAL_CHECK("code_completion_requested", signal_args);
SIGNAL_UNWATCH(code_edit, "code_completion_requested");
}
SUBCASE("[CodeEdit] autocomplete completion") {
if (TS->has_feature(TextServer::FEATURE_FONT_DYNAMIC) && TS->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
CHECK(code_edit->get_code_completion_selected_index() == -1);
code_edit->set_code_completion_enabled(true);
CHECK(code_edit->get_code_completion_selected_index() == -1);
code_edit->update_code_completion_options();
code_edit->set_code_completion_selected_index(1);
CHECK(code_edit->get_code_completion_selected_index() == -1);
CHECK(code_edit->get_code_completion_option(0).size() == 0);
CHECK(code_edit->get_code_completion_options().size() == 0);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_0.", "item_0");
code_edit->set_code_completion_selected_index(1);
CHECK(code_edit->get_code_completion_selected_index() == -1);
CHECK(code_edit->get_code_completion_option(0).size() == 0);
CHECK(code_edit->get_code_completion_options().size() == 0);
int before_text_caret_column = code_edit->get_caret_column();
code_edit->insert_text_at_caret("i");
code_edit->update_code_completion_options();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
ERR_PRINT_OFF;
code_edit->set_code_completion_selected_index(1);
ERR_PRINT_ON;
CHECK(code_edit->get_code_completion_selected_index() == 0);
CHECK(code_edit->get_code_completion_option(0).size() == 7);
CHECK(code_edit->get_code_completion_options().size() == 1);
SEND_GUI_ACTION("ui_cancel");
CHECK(code_edit->get_code_completion_selected_index() == -1);
code_edit->update_code_completion_options();
CHECK(code_edit->get_code_completion_selected_index() == 0);
code_edit->set_code_completion_selected_index(1);
CHECK(code_edit->get_code_completion_selected_index() == 1);
CHECK(code_edit->get_code_completion_option(0).size() == 7);
CHECK(code_edit->get_code_completion_options().size() == 3);
Dictionary option = code_edit->get_code_completion_option(0);
CHECK((int)option["kind"] == (int)CodeEdit::CodeCompletionKind::KIND_CLASS);
CHECK(option["display_text"] == "item_0.");
CHECK(option["insert_text"] == "item_0");
CHECK(option["font_color"] == Color(1, 0, 0));
CHECK(option["icon"] == Ref<Resource>());
CHECK(option["default_value"] == Color(1, 0, 0));
code_edit->set_size(Size2(100, 100));
code_edit->set_caret_column(before_text_caret_column + 1);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_caret_line_start");
code_edit->update_code_completion_options();
CHECK(code_edit->get_code_completion_selected_index() == -1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_caret_column(before_text_caret_column + 1);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_caret_line_end");
code_edit->update_code_completion_options();
CHECK(code_edit->get_code_completion_selected_index() == -1);
CHECK(code_edit->get_caret_column() == before_text_caret_column + 1);
code_edit->set_caret_column(before_text_caret_column + 1);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_page_down");
CHECK(code_edit->get_code_completion_selected_index() == 2);
SEND_GUI_ACTION("ui_page_up");
CHECK(code_edit->get_code_completion_selected_index() == 0);
SEND_GUI_ACTION("ui_up");
CHECK(code_edit->get_code_completion_selected_index() == 2);
SEND_GUI_ACTION("ui_down");
CHECK(code_edit->get_code_completion_selected_index() == 0);
SEND_GUI_KEY_EVENT(Key::T);
CHECK(code_edit->get_code_completion_selected_index() == 0);
SEND_GUI_ACTION("ui_left");
CHECK(code_edit->get_code_completion_selected_index() == 0);
SEND_GUI_ACTION("ui_right");
CHECK(code_edit->get_code_completion_selected_index() == 0);
SEND_GUI_ACTION("ui_text_backspace");
CHECK(code_edit->get_code_completion_selected_index() == 0);
Point2 caret_pos = code_edit->get_caret_draw_pos();
caret_pos.y += code_edit->get_line_height();
SEND_GUI_MOUSE_BUTTON_EVENT(caret_pos, MouseButton::WHEEL_DOWN, MouseButtonMask::NONE, Key::NONE);
CHECK(code_edit->get_code_completion_selected_index() == 1);
SEND_GUI_MOUSE_BUTTON_EVENT(caret_pos, MouseButton::WHEEL_UP, MouseButtonMask::NONE, Key::NONE);
CHECK(code_edit->get_code_completion_selected_index() == 0);
caret_pos.y += code_edit->get_line_height() * 2;
SEND_GUI_MOUSE_BUTTON_EVENT(caret_pos, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(caret_pos, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE);
CHECK(code_edit->get_code_completion_selected_index() == 2);
SEND_GUI_DOUBLE_CLICK(caret_pos, Key::NONE);
CHECK(code_edit->get_code_completion_selected_index() == -1);
CHECK(code_edit->get_line(0) == "item_2");
code_edit->set_auto_brace_completion_enabled(false);
code_edit->undo();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
code_edit->set_editable(false);
code_edit->confirm_code_completion();
code_edit->set_editable(true);
CHECK(code_edit->get_line(0) == "i");
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0 test");
code_edit->clear();
code_edit->insert_text_at_caret("\"item_1 test\"");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "\"item_0\"");
code_edit->clear();
code_edit->insert_text_at_caret("\"item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "\"item_0\" test");
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_accept");
CHECK(code_edit->get_line(0) == "item_01 test");
code_edit->clear();
code_edit->insert_text_at_caret("\"item_1 test\"");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_accept");
CHECK(code_edit->get_line(0) == "\"item_0\"1 test\"");
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0( test");
CHECK(code_edit->get_caret_column() == 7);
code_edit->clear();
code_edit->insert_text_at_caret("item_1( test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0( test");
CHECK(code_edit->get_caret_column() == 6);
code_edit->clear();
code_edit->insert_text_at_caret("item_1( test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0( test");
CHECK(code_edit->get_caret_column() == 7);
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 8);
code_edit->clear();
code_edit->insert_text_at_caret("item_1() test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 6);
code_edit->clear();
code_edit->insert_text_at_caret("item_1() test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 8);
code_edit->set_auto_brace_completion_enabled(true);
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 7);
code_edit->clear();
code_edit->insert_text_at_caret("item_1( test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0( test");
CHECK(code_edit->get_caret_column() == 6);
code_edit->clear();
code_edit->insert_text_at_caret("item_1( test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0( test");
CHECK(code_edit->get_caret_column() == 7);
code_edit->clear();
code_edit->insert_text_at_caret("item_1 test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 8);
code_edit->clear();
code_edit->insert_text_at_caret("item_1() test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 6);
code_edit->clear();
code_edit->insert_text_at_caret("item_1() test");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_text_completion_replace");
CHECK(code_edit->get_line(0) == "item_0() test");
CHECK(code_edit->get_caret_column() == 8);
}
}
SUBCASE("[CodeEdit] autocomplete suggestion order") {
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test", "test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "tset", "tset");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test", "test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "stest", "stest");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "tset", "tset");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "stest", "stest");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "stest");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test", "test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "Test", "Test");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "Test", "Test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "stest_bis", "test_bis");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "Test");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test", "test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test_bis", "test_bis", Color(1, 1, 1), Ref<Resource>(), Variant::NIL, CodeEdit::LOCATION_LOCAL);
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test_bis");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "test", "test");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "Test", "Test", Color(1, 1, 1), Ref<Resource>(), Variant::NIL, CodeEdit::LOCATION_LOCAL);
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "test");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "stest", "stest");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "sstest", "sstest");
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "stest");
code_edit->clear();
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "stest", "stest");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "sstest", "sstest", Color(1, 1, 1), Ref<Resource>(), Variant::NIL, CodeEdit::LOCATION_LOCAL);
code_edit->update_code_completion_options();
code_edit->confirm_code_completion();
CHECK(code_edit->get_line(0) == "sstest");
}
SUBCASE("[CodeEdit] autocomplete currently selected option") {
code_edit->set_code_completion_enabled(true);
REQUIRE(code_edit->is_code_completion_enabled());
code_edit->insert_text_at_caret("te");
code_edit->set_caret_column(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te1", "te1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 0, "Initially selected item should be 0.");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te1", "te1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 0, "Adding later options shouldn't update selection.");
code_edit->set_code_completion_selected_index(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te1", "te1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te5", "te5");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te6", "te6");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 2, "Adding later options shouldn't update selection.");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te1", "te1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te5", "te5");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 2, "Removing elements after selected element shouldn't update selection.");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te1", "te1");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te6", "te6");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 2, "Changing elements after selected element shouldn't update selection.");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te2", "te2");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te6", "te6");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 0, "Changing elements before selected element should reset selection.");
code_edit->set_code_completion_selected_index(2);
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te3", "te3");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te4", "te4");
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "te6", "te6");
code_edit->update_code_completion_options();
CHECK_MESSAGE(code_edit->get_code_completion_selected_index() == 0, "Removing elements before selected element should reset selection.");
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] symbol lookup") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
code_edit->set_symbol_lookup_on_click_enabled(true);
CHECK(code_edit->is_symbol_lookup_on_click_enabled());
if (TS->has_feature(TextServer::FEATURE_FONT_DYNAMIC) && TS->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
code_edit->set_size(Size2(100, 100));
code_edit->set_text("this is some text");
Point2 caret_pos = code_edit->get_caret_draw_pos();
caret_pos.x += 60;
SEND_GUI_MOUSE_MOTION_EVENT(caret_pos, MouseButtonMask::NONE, Key::NONE);
CHECK(code_edit->get_text_for_symbol_lookup() == "this is s" + String::chr(0xFFFF) + "ome text");
SIGNAL_WATCH(code_edit, "symbol_validate");
#ifdef MACOS_ENABLED
SEND_GUI_KEY_EVENT(Key::META);
#else
SEND_GUI_KEY_EVENT(Key::CTRL);
#endif
Array signal_args = { { "some" } };
SIGNAL_CHECK("symbol_validate", signal_args);
SIGNAL_UNWATCH(code_edit, "symbol_validate");
}
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] line length guidelines") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
TypedArray<int> guide_lines;
code_edit->set_line_length_guidelines(guide_lines);
CHECK(code_edit->get_line_length_guidelines().size() == 0);
guide_lines.push_back(80);
guide_lines.push_back(120);
code_edit->set_line_length_guidelines(guide_lines);
CHECK((int)code_edit->get_line_length_guidelines()[0] == 80);
CHECK((int)code_edit->get_line_length_guidelines()[1] == 120);
memdelete(code_edit);
}
TEST_CASE("[SceneTree][CodeEdit] text manipulation") {
CodeEdit *code_edit = memnew(CodeEdit);
SceneTree::get_singleton()->get_root()->add_child(code_edit);
code_edit->grab_focus();
SUBCASE("[SceneTree][CodeEdit] backspace") {
code_edit->set_text("test backspace");
code_edit->select(0, 0, 0, 5);
code_edit->backspace();
CHECK(code_edit->get_line(0) == "backspace");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test backspace");
code_edit->select(0, 5, 0, 0);
code_edit->backspace();
CHECK(code_edit->get_line(0) == "backspace");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("line 1\nline 2");
code_edit->set_caret_line(1);
code_edit->set_caret_column(0);
code_edit->backspace();
CHECK(code_edit->get_line(0) == "line 1line 2");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 6);
code_edit->set_text("line 1\nline 2");
code_edit->set_caret_line(1);
code_edit->set_caret_column(2);
code_edit->add_caret(1, 0);
code_edit->add_caret(1, 5);
code_edit->backspace();
CHECK(code_edit->get_text() == "line 1lne2");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 7);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 6);
CHECK(code_edit->get_caret_line(2) == 0);
CHECK(code_edit->get_caret_column(2) == 9);
code_edit->remove_secondary_carets();
code_edit->set_text("line 1\nline 2");
code_edit->set_caret_line(1);
code_edit->set_caret_column(2);
code_edit->add_caret(1, 1);
code_edit->backspace();
CHECK(code_edit->get_text() == "line 1\nne 2");
CHECK(code_edit->get_caret_count() == 1);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("line 1\nline 2\nline 3");
code_edit->select_all();
code_edit->backspace();
CHECK(code_edit->get_text().is_empty());
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("line 1\nline 2\nline 3");
code_edit->set_caret_line(0);
code_edit->set_caret_column(0);
code_edit->backspace();
CHECK(code_edit->get_text() == "line 1\nline 2\nline 3");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_line_folding_enabled(true);
code_edit->set_text("line 1\n\tline 2\nline 3");
code_edit->set_caret_line(2);
code_edit->set_caret_column(0);
code_edit->fold_line(0);
code_edit->backspace();
CHECK_FALSE(code_edit->is_line_folded(0));
code_edit->set_line_folding_enabled(false);
code_edit->set_line_folding_enabled(true);
code_edit->set_text("line 1\n\tline 2\nline 3");
code_edit->set_caret_line(2);
code_edit->set_caret_column(4);
code_edit->fold_line(0);
code_edit->backspace();
CHECK(code_edit->is_line_folded(0));
code_edit->set_line_folding_enabled(false);
}
SUBCASE("[TextEdit] cut") {
DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
code_edit->set_line_folding_enabled(true);
code_edit->set_text("this is\nsome\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(6);
code_edit->cut();
CHECK(DS->clipboard_get() == "this is\n");
CHECK(code_edit->get_text() == "some\n");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 3);
code_edit->undo();
CHECK(DS->clipboard_get() == "this is\n");
CHECK(code_edit->get_text() == "this is\nsome\n");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 6);
code_edit->redo();
CHECK(DS->clipboard_get() == "this is\n");
CHECK(code_edit->get_text() == "some\n");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 3);
code_edit->set_text("this is\n\tsome\n");
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
code_edit->cut();
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK(DS->clipboard_get() == "this is\n");
CHECK(code_edit->get_text() == "\tsome\n");
CHECK(code_edit->get_caret_line() == 0);
code_edit->set_text("this is\nsome\n");
code_edit->select(0, 5, 0, 7);
SEND_GUI_ACTION("ui_cut");
CHECK(code_edit->get_viewport()->is_input_handled());
CHECK(DS->clipboard_get() == "is");
CHECK(code_edit->get_text() == "this \nsome\n");
CHECK_FALSE(code_edit->get_caret_line());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("this is\nsome\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(5);
code_edit->set_editable(false);
code_edit->cut();
code_edit->set_editable(true);
CHECK(DS->clipboard_get() == "this is\n");
CHECK(code_edit->get_text() == "this is\nsome\n");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 5);
code_edit->set_text("this is\nsome\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(3);
code_edit->add_caret(0, 2);
code_edit->add_caret(0, 4);
code_edit->add_caret(2, 0);
code_edit->cut();
CHECK(DS->clipboard_get() == "this is\n\n");
CHECK(code_edit->get_text() == "some");
CHECK(code_edit->get_caret_count() == 3);
CHECK_FALSE(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 2);
CHECK_FALSE(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 3);
CHECK_FALSE(code_edit->has_selection(2));
CHECK(code_edit->get_caret_line(2) == 0);
CHECK(code_edit->get_caret_column(2) == 4);
code_edit->remove_secondary_carets();
code_edit->set_caret_line(0);
code_edit->set_caret_column(2);
code_edit->cut();
CHECK(DS->clipboard_get() == "some\n");
CHECK(code_edit->get_text() == "");
CHECK(code_edit->get_line_count() == 1);
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->cut();
CHECK(DS->clipboard_get() == "\n");
CHECK(code_edit->get_text() == "");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("this is\nsome\ntext to\nbe\n\ncut");
code_edit->set_caret_line(2);
code_edit->set_caret_column(7);
code_edit->add_caret(3, 0);
code_edit->add_caret(0, 2);
code_edit->cut();
CHECK(DS->clipboard_get() == "this is\ntext to\nbe\n");
CHECK(code_edit->get_text() == "some\n\ncut");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 2);
code_edit->remove_secondary_carets();
code_edit->set_text("this is\nsome\ntext to\nbe\n\ncut");
code_edit->add_caret(3, 0);
code_edit->add_caret(0, 2);
code_edit->add_caret(2, 0);
code_edit->select(1, 0, 1, 2, 0);
code_edit->select(3, 0, 4, 0, 1);
code_edit->select(0, 5, 0, 3, 2);
code_edit->cut();
CHECK(DS->clipboard_get() == "s \nso\nbe\n");
CHECK(code_edit->get_text() == "thiis\nme\ntext to\n\ncut");
CHECK(code_edit->get_caret_count() == 4);
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 3);
CHECK(code_edit->get_caret_column(1) == 0);
CHECK(code_edit->get_caret_line(2) == 0);
CHECK(code_edit->get_caret_column(2) == 3);
CHECK(code_edit->get_caret_line(3) == 2);
CHECK(code_edit->get_caret_column(3) == 0);
}
SUBCASE("[SceneTree][CodeEdit] cut when empty selection clipboard disabled") {
DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
code_edit->set_empty_selection_clipboard_enabled(false);
DS->clipboard_set("");
code_edit->set_text("this is\nsome\n");
code_edit->set_caret_line(0);
code_edit->set_caret_column(6);
MessageQueue::get_singleton()->flush();
SIGNAL_DISCARD("text_set");
SIGNAL_DISCARD("text_changed");
SIGNAL_DISCARD("lines_edited_from");
SIGNAL_DISCARD("caret_changed");
code_edit->cut();
MessageQueue::get_singleton()->flush();
CHECK(DS->clipboard_get() == "");
CHECK(code_edit->get_text() == "this is\nsome\n");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 6);
SIGNAL_CHECK_FALSE("caret_changed");
SIGNAL_CHECK_FALSE("text_changed");
SIGNAL_CHECK_FALSE("lines_edited_from");
}
SUBCASE("[SceneTree][CodeEdit] new line") {
code_edit->set_text("test new line");
code_edit->set_caret_line(0);
code_edit->set_caret_column(13);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test new line");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test new line");
code_edit->set_caret_line(0);
code_edit->set_caret_column(5);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test ");
CHECK(code_edit->get_line(1) == "new line");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test new line");
code_edit->select(0, 0, 0, 5);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "new line");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test new line");
code_edit->select(0, 0, 0, 5);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test new line");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test new line");
code_edit->select(0, 0, 0, 5);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "test new line");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test new line");
code_edit->set_caret_line(0);
code_edit->set_caret_column(5);
code_edit->add_caret(0, 8);
SEND_GUI_ACTION("ui_text_newline");
CHECK(code_edit->get_line(0) == "test ");
CHECK(code_edit->get_line(1) == "new");
CHECK(code_edit->get_line(2) == " line");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 2);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->set_text("test new line");
code_edit->remove_secondary_carets();
code_edit->set_caret_line(0);
code_edit->set_caret_column(5);
code_edit->add_caret(0, 8);
SEND_GUI_ACTION("ui_text_newline_blank");
CHECK(code_edit->get_line(0) == "test new line");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_line(2) == "");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 2);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->set_text("test new line");
code_edit->remove_secondary_carets();
code_edit->set_caret_line(0);
code_edit->set_caret_column(5);
code_edit->add_caret(0, 8);
SEND_GUI_ACTION("ui_text_newline_above");
CHECK(code_edit->get_line(0) == "");
CHECK(code_edit->get_line(1) == "");
CHECK(code_edit->get_line(2) == "test new line");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 0);
}
SUBCASE("[SceneTree][CodeEdit] move lines up") {
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(2);
code_edit->set_caret_column(1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nto\nlines\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->undo();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 1);
code_edit->redo();
CHECK(code_edit->get_text() == "test\nto\nlines\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(0);
code_edit->set_caret_column(1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(0, 0, 1, 0);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(3);
code_edit->set_caret_column(0);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\n\nto\nmove\naround");
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(4, 0, 5, 1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\nmove\naround\n");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 3);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 4);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(4, 0, 5, 0);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\nmove\n\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 3);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 4);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(5, 2, 4, 1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\nmove\naround\n");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 4);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_line() == 3);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(5, 2, 5, 4);
code_edit->add_caret(4, 0);
code_edit->add_caret(4, 4);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "test\nlines\nto\nmove\naround\n");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 4);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 4);
CHECK(code_edit->get_caret_column(0) == 4);
CHECK_FALSE(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 3);
CHECK(code_edit->get_caret_column(1) == 0);
CHECK_FALSE(code_edit->has_selection(2));
CHECK(code_edit->get_caret_line(2) == 3);
CHECK(code_edit->get_caret_column(2) == 4);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(2, 2, 1, 4);
code_edit->add_caret(5, 0);
code_edit->select(5, 0, 5, 1, 1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "lines\nto\ntest\n\naround\nmove");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 1);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 4);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 4);
CHECK(code_edit->get_selection_origin_column(1) == 0);
CHECK(code_edit->get_caret_line(1) == 4);
CHECK(code_edit->get_caret_column(1) == 1);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(1, 2, 2, 0);
code_edit->add_caret(2, 2);
code_edit->select(2, 2, 3, 0, 1);
code_edit->move_lines_up();
CHECK(code_edit->get_text() == "lines\nto\ntest\n\nmove\naround");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 0);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 1);
CHECK(code_edit->get_selection_origin_column(1) == 2);
CHECK(code_edit->get_caret_line(1) == 2);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->remove_secondary_carets();
code_edit->deselect();
code_edit->set_line_folding_enabled(true);
code_edit->set_text("test\n\tline1 test\n\t\tline 2\ntest2");
code_edit->set_caret_line(3);
code_edit->set_caret_column(0);
code_edit->fold_line(0);
CHECK(code_edit->is_line_folded(0));
code_edit->move_lines_up();
CHECK(code_edit->get_caret_count() == 1);
CHECK_FALSE(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 0);
CHECK(code_edit->get_text() == "test\n\tline1 test\ntest2\n\t\tline 2");
CHECK_FALSE(code_edit->is_line_folded(0));
}
SUBCASE("[SceneTree][CodeEdit] move lines down") {
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(1);
code_edit->set_caret_column(1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\nto\nlines\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 1);
code_edit->undo();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->redo();
CHECK(code_edit->get_text() == "test\nto\nlines\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(5);
code_edit->set_caret_column(1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->get_caret_line() == 5);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(4, 0, 5, 0);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nmove\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 4);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 5);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->set_caret_line(3);
code_edit->set_caret_column(0);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\nlines\nto\nmove\n\naround");
CHECK(code_edit->get_caret_line() == 4);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(1, 0, 2, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\n\nlines\nto\nmove\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 2);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 3);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(1, 0, 2, 0);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\nto\nlines\n\nmove\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 2);
CHECK(code_edit->get_selection_origin_column() == 0);
CHECK(code_edit->get_caret_line() == 3);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(2, 2, 1, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\n\nlines\nto\nmove\naround");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 3);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(1, 2, 1, 4);
code_edit->add_caret(0, 0);
code_edit->add_caret(0, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "to\ntest\nlines\n\nmove\naround");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 2);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 2);
CHECK(code_edit->get_caret_column(0) == 4);
CHECK_FALSE(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 0);
CHECK_FALSE(code_edit->has_selection(2));
CHECK(code_edit->get_caret_line(2) == 1);
CHECK(code_edit->get_caret_column(2) == 1);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(0, 2, 1, 4);
code_edit->add_caret(4, 0);
code_edit->select(4, 0, 4, 2, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "to\ntest\nlines\n\naround\nmove");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 1);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 2);
CHECK(code_edit->get_caret_column(0) == 4);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 5);
CHECK(code_edit->get_selection_origin_column(1) == 0);
CHECK(code_edit->get_caret_line(1) == 5);
CHECK(code_edit->get_caret_column(1) == 2);
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(1, 2, 2, 0);
code_edit->add_caret(2, 2);
code_edit->select(2, 2, 3, 0, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "test\n\nlines\nto\nmove\naround");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 2);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 3);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 3);
CHECK(code_edit->get_selection_origin_column(1) == 2);
CHECK(code_edit->get_caret_line(1) == 4);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nmove\naround");
code_edit->select(0, 2, 1, 0);
code_edit->add_caret(2, 2);
code_edit->select(2, 0, 3, 0, 1);
code_edit->move_lines_down();
CHECK(code_edit->get_text() == "lines\ntest\n\nto\nmove\naround");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 1);
CHECK(code_edit->get_selection_origin_column(0) == 2);
CHECK(code_edit->get_caret_line(0) == 2);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 3);
CHECK(code_edit->get_selection_origin_column(1) == 0);
CHECK(code_edit->get_caret_line(1) == 4);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->remove_secondary_carets();
code_edit->deselect();
code_edit->set_line_folding_enabled(true);
code_edit->set_text("test\ntest2\n\tline1 test\n\t\tline 2\ntest2");
code_edit->set_caret_line(0);
code_edit->set_caret_column(0);
code_edit->fold_line(1);
CHECK(code_edit->is_line_folded(1));
code_edit->move_lines_down();
CHECK(code_edit->get_caret_count() == 1);
CHECK_FALSE(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
CHECK(code_edit->get_text() == "test2\ntest\n\tline1 test\n\t\tline 2\ntest2");
CHECK_FALSE(code_edit->is_line_folded(0));
CHECK_FALSE(code_edit->is_line_folded(1));
}
SUBCASE("[SceneTree][CodeEdit] delete lines") {
code_edit->set_text("test\nlines\nto\n\ndelete");
code_edit->set_caret_line(1);
code_edit->set_caret_column(1);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "test\nto\n\ndelete");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->undo();
CHECK(code_edit->get_text() == "test\nlines\nto\n\ndelete");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->redo();
CHECK(code_edit->get_text() == "test\nto\n\ndelete");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->set_caret_line(2);
code_edit->set_caret_column(0);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "test\nto\ndelete");
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_caret_line(0);
code_edit->set_caret_column(0);
code_edit->add_caret(0, 1);
code_edit->add_caret(0, 4);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "to\ndelete");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 0);
CHECK(code_edit->get_caret_column(1) == 1);
CHECK(code_edit->get_caret_line(2) == 0);
CHECK(code_edit->get_caret_column(2) == 2);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\ndelete");
code_edit->select(0, 1, 2, 1);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "\ndelete");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\ndelete");
code_edit->select(0, 1, 1, 0);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "lines\nto\n\ndelete");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text("test\nlines\nto\n\ndelete");
code_edit->set_caret_line(0);
code_edit->set_caret_column(2);
code_edit->add_caret(1, 0);
code_edit->add_caret(4, 5);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "to\n");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 0);
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\ndelete");
code_edit->add_caret(4, 5);
code_edit->select(0, 1, 1, 1);
code_edit->select(5, 5, 4, 0, 1);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "to\n");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->get_caret_line(0) == 0);
CHECK(code_edit->get_caret_column(0) == 1);
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 0);
code_edit->remove_secondary_carets();
code_edit->set_text("test");
code_edit->set_caret_line(0);
code_edit->set_caret_column(4);
code_edit->delete_lines();
CHECK(code_edit->get_text() == "");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 0);
CHECK(code_edit->get_caret_column() == 0);
}
SUBCASE("[SceneTree][CodeEdit] duplicate selection") {
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->select(0, 1, 1, 2);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\nliest\nlines\nto\n\nduplicate");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 2);
code_edit->undo();
CHECK(code_edit->get_text() == "test\nlines\nto\n\nduplicate");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 0);
CHECK(code_edit->get_selection_origin_column() == 1);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 2);
code_edit->redo();
CHECK(code_edit->get_text() == "test\nliest\nlines\nto\n\nduplicate");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 1);
CHECK(code_edit->get_selection_origin_column() == 2);
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 2);
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->select(1, 1, 0, 2);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\nlst\nlines\nto\n\nduplicate");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 2);
CHECK(code_edit->get_selection_origin_column() == 1);
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 1);
code_edit->deselect();
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->set_caret_line(1);
code_edit->set_caret_column(2);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\nlines\nlines\nto\n\nduplicate");
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line() == 2);
CHECK(code_edit->get_caret_column() == 2);
code_edit->deselect();
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->set_caret_line(1);
code_edit->set_caret_column(2);
code_edit->add_caret(5, 0);
code_edit->add_caret(0, 4);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\ntest\nlines\nlines\nto\n\nduplicate\nduplicate");
CHECK(code_edit->get_caret_count() == 3);
CHECK_FALSE(code_edit->has_selection());
CHECK(code_edit->get_caret_line(0) == 3);
CHECK(code_edit->get_caret_column(0) == 2);
CHECK(code_edit->get_caret_line(1) == 7);
CHECK(code_edit->get_caret_column(1) == 0);
CHECK(code_edit->get_caret_line(2) == 1);
CHECK(code_edit->get_caret_column(2) == 4);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->add_caret(4, 4);
code_edit->add_caret(0, 1);
code_edit->add_caret(0, 4);
code_edit->select(2, 0, 2, 1, 0);
code_edit->select(3, 0, 4, 4, 1);
code_edit->select(0, 1, 0, 0, 2);
code_edit->select(0, 2, 0, 4, 3);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "ttestst\nlines\ntto\n\ndupl\nduplicate");
CHECK(code_edit->get_caret_count() == 4);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 2);
CHECK(code_edit->get_selection_origin_column(0) == 1);
CHECK(code_edit->get_caret_line(0) == 2);
CHECK(code_edit->get_caret_column(0) == 2);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 4);
CHECK(code_edit->get_selection_origin_column(1) == 4);
CHECK(code_edit->get_caret_line(1) == 5);
CHECK(code_edit->get_caret_column(1) == 4);
CHECK(code_edit->has_selection(2));
CHECK(code_edit->get_selection_origin_line(2) == 0);
CHECK(code_edit->get_selection_origin_column(2) == 2);
CHECK(code_edit->get_caret_line(2) == 0);
CHECK(code_edit->get_caret_column(2) == 1);
CHECK(code_edit->has_selection(3));
CHECK(code_edit->get_selection_origin_line(3) == 0);
CHECK(code_edit->get_selection_origin_column(3) == 5);
CHECK(code_edit->get_caret_line(3) == 0);
CHECK(code_edit->get_caret_column(3) == 7);
code_edit->remove_secondary_carets();
code_edit->set_text("test\nlines\nto\n\nduplicate");
code_edit->add_caret(1, 2);
code_edit->select(1, 0, 1, 1, 0);
code_edit->select(1, 1, 1, 4, 1);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test\nllineines\nto\n\nduplicate");
CHECK(code_edit->get_caret_count() == 2);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 1);
CHECK(code_edit->get_selection_origin_column(0) == 1);
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 2);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 1);
CHECK(code_edit->get_selection_origin_column(1) == 5);
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 8);
code_edit->remove_secondary_carets();
code_edit->set_text("test duplicate");
code_edit->select(0, 14, 0, 13, 0);
code_edit->add_caret(0, 8);
code_edit->add_caret(0, 4);
code_edit->select(0, 2, 0, 4, 2);
code_edit->duplicate_selection();
CHECK(code_edit->get_text() == "test duplicate\ntestst duplicatee");
CHECK(code_edit->get_caret_count() == 3);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 1);
CHECK(code_edit->get_selection_origin_column(0) == 17);
CHECK(code_edit->get_caret_line(0) == 1);
CHECK(code_edit->get_caret_column(0) == 16);
CHECK_FALSE(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 1);
CHECK(code_edit->get_caret_column(1) == 10);
CHECK(code_edit->has_selection(2));
CHECK(code_edit->get_selection_origin_line(2) == 1);
CHECK(code_edit->get_selection_origin_column(2) == 4);
CHECK(code_edit->get_caret_line(2) == 1);
CHECK(code_edit->get_caret_column(2) == 6);
}
SUBCASE("[SceneTree][CodeEdit] duplicate lines") {
String reset_text = R"(extends Node
func _ready():
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var c := a + b
for i in range(c):
print("This is the solution: ", sin(i))
var pos = get_index() - 1
print("Make sure this exits: %b" % pos)
)";
code_edit->set_text(reset_text);
code_edit->set_caret_line(0);
code_edit->duplicate_lines();
CHECK(code_edit->get_line(0) == "extends Node");
CHECK(code_edit->get_line(1) == "extends Node");
CHECK(code_edit->get_line(2) == "");
CHECK(code_edit->get_caret_line() == 1);
CHECK(code_edit->get_caret_column() == 0);
code_edit->set_text(reset_text);
code_edit->select(4, 8, 6, 15);
code_edit->duplicate_lines();
CHECK(code_edit->get_text() == R"(extends Node
func _ready():
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var c := a + b
for i in range(c):
var b := get_child_count()
var c := a + b
for i in range(c):
print("This is the solution: ", sin(i))
var pos = get_index() - 1
print("Make sure this exits: %b" % pos)
)");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 7);
CHECK(code_edit->get_selection_origin_column() == 8);
CHECK(code_edit->get_caret_line() == 9);
CHECK(code_edit->get_caret_column() == 15);
code_edit->set_text(reset_text);
code_edit->select(6, 15, 4, 8);
code_edit->duplicate_lines();
CHECK(code_edit->get_text() == R"(extends Node
func _ready():
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var c := a + b
for i in range(c):
var b := get_child_count()
var c := a + b
for i in range(c):
print("This is the solution: ", sin(i))
var pos = get_index() - 1
print("Make sure this exits: %b" % pos)
)");
CHECK(code_edit->has_selection());
CHECK(code_edit->get_selection_origin_line() == 9);
CHECK(code_edit->get_selection_origin_column() == 15);
CHECK(code_edit->get_caret_line() == 7);
CHECK(code_edit->get_caret_column() == 8);
code_edit->remove_secondary_carets();
code_edit->deselect();
code_edit->set_text(reset_text);
code_edit->set_caret_line(3);
code_edit->set_caret_column(1);
code_edit->add_caret(5, 1);
code_edit->add_caret(5, 5);
code_edit->add_caret(4, 2);
code_edit->duplicate_lines();
CHECK(code_edit->get_text() == R"(extends Node
func _ready():
var a := len(OS.get_cmdline_args())
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var b := get_child_count()
var c := a + b
var c := a + b
for i in range(c):
print("This is the solution: ", sin(i))
var pos = get_index() - 1
print("Make sure this exits: %b" % pos)
)");
CHECK(code_edit->get_caret_count() == 4);
CHECK_FALSE(code_edit->has_selection(0));
CHECK(code_edit->get_caret_line(0) == 4);
CHECK(code_edit->get_caret_column(0) == 1);
CHECK_FALSE(code_edit->has_selection(1));
CHECK(code_edit->get_caret_line(1) == 8);
CHECK(code_edit->get_caret_column(1) == 1);
CHECK_FALSE(code_edit->has_selection(2));
CHECK(code_edit->get_caret_line(2) == 8);
CHECK(code_edit->get_caret_column(2) == 5);
CHECK_FALSE(code_edit->has_selection(3));
CHECK(code_edit->get_caret_line(3) == 6);
CHECK(code_edit->get_caret_column(3) == 2);
code_edit->remove_secondary_carets();
code_edit->set_text(reset_text);
code_edit->add_caret(4, 2);
code_edit->add_caret(6, 0);
code_edit->add_caret(7, 8);
code_edit->select(0, 0, 2, 5, 0);
code_edit->select(3, 0, 4, 2, 1);
code_edit->select(7, 1, 6, 0, 2);
code_edit->select(7, 3, 7, 8, 3);
code_edit->duplicate_lines();
CHECK(code_edit->get_text() == R"(extends Node
func _ready():
extends Node
func _ready():
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var a := len(OS.get_cmdline_args())
var b := get_child_count()
var c := a + b
for i in range(c):
print("This is the solution: ", sin(i))
for i in range(c):
print("This is the solution: ", sin(i))
var pos = get_index() - 1
print("Make sure this exits: %b" % pos)
)");
CHECK(code_edit->get_caret_count() == 4);
CHECK(code_edit->has_selection(0));
CHECK(code_edit->get_selection_origin_line(0) == 3);
CHECK(code_edit->get_selection_origin_column(0) == 0);
CHECK(code_edit->get_caret_line(0) == 5);
CHECK(code_edit->get_caret_column(0) == 5);
CHECK(code_edit->has_selection(1));
CHECK(code_edit->get_selection_origin_line(1) == 8);
CHECK(code_edit->get_selection_origin_column(1) == 0);
CHECK(code_edit->get_caret_line(1) == 9);
CHECK(code_edit->get_caret_column(1) == 2);
CHECK(code_edit->has_selection(2));
CHECK(code_edit->get_selection_origin_line(2) == 14);
CHECK(code_edit->get_selection_origin_column(2) == 1);
CHECK(code_edit->get_caret_line(2) == 13);
CHECK(code_edit->get_caret_column(2) == 0);
CHECK(code_edit->has_selection(3));
CHECK(code_edit->get_selection_origin_line(3) == 14);
CHECK(code_edit->get_selection_origin_column(3) == 3);
CHECK(code_edit->get_caret_line(3) == 14);
CHECK(code_edit->get_caret_column(3) == 8);
}
memdelete(code_edit);
}
}