Add SmartNewline command with tests and editor integration
- Introduced `CommandId::SmartNewline` for auto-indented newlines, enhancing text editing workflows. - Added `cmd_smart_newline` to implement indentation-aware newline logic. - Integrated SmartNewline with keymaps, mouse/keyboard input handlers, and terminal/editor commands. - Wrote comprehensive tests in `test_smart_newline.cc` to validate behavior for spaces, tabs, and no-indentation cases. - Updated `Command.h` and `CMakeLists.txt` to register and build the new command.
This commit is contained in:
79
tests/test_smart_newline.cc
Normal file
79
tests/test_smart_newline.cc
Normal file
@@ -0,0 +1,79 @@
|
||||
#include "Test.h"
|
||||
#include "Buffer.h"
|
||||
#include "Editor.h"
|
||||
#include "Command.h"
|
||||
#include <string>
|
||||
|
||||
|
||||
TEST (SmartNewline_AutoIndent)
|
||||
{
|
||||
Editor editor;
|
||||
InstallDefaultCommands();
|
||||
Buffer &buf = editor.Buffers().emplace_back();
|
||||
|
||||
// Set up initial state: " line1"
|
||||
buf.insert_text(0, 0, " line1");
|
||||
buf.SetCursor(7, 0); // At end of line
|
||||
|
||||
// Execute SmartNewline
|
||||
bool ok = Execute(editor, CommandId::SmartNewline);
|
||||
ASSERT_TRUE(ok);
|
||||
|
||||
// Should have two lines now
|
||||
ASSERT_EQ(buf.Nrows(), 2);
|
||||
// Line 0 remains " line1"
|
||||
ASSERT_EQ(buf.GetLineString(0), " line1");
|
||||
// Line 1 should have " " (two spaces)
|
||||
ASSERT_EQ(buf.GetLineString(1), " ");
|
||||
// Cursor should be at (2, 1)
|
||||
ASSERT_EQ(buf.Curx(), 2);
|
||||
ASSERT_EQ(buf.Cury(), 1);
|
||||
}
|
||||
|
||||
|
||||
TEST (SmartNewline_TabIndent)
|
||||
{
|
||||
Editor editor;
|
||||
InstallDefaultCommands();
|
||||
Buffer &buf = editor.Buffers().emplace_back();
|
||||
|
||||
// Set up initial state: "\tline1"
|
||||
buf.insert_text(0, 0, "\tline1");
|
||||
buf.SetCursor(6, 0); // At end of line
|
||||
|
||||
// Execute SmartNewline
|
||||
bool ok = Execute(editor, CommandId::SmartNewline);
|
||||
ASSERT_TRUE(ok);
|
||||
|
||||
// Should have two lines now
|
||||
ASSERT_EQ(buf.Nrows(), 2);
|
||||
// Line 1 should have "\t"
|
||||
ASSERT_EQ(buf.GetLineString(1), "\t");
|
||||
// Cursor should be at (1, 1)
|
||||
ASSERT_EQ(buf.Curx(), 1);
|
||||
ASSERT_EQ(buf.Cury(), 1);
|
||||
}
|
||||
|
||||
|
||||
TEST (SmartNewline_NoIndent)
|
||||
{
|
||||
Editor editor;
|
||||
InstallDefaultCommands();
|
||||
Buffer &buf = editor.Buffers().emplace_back();
|
||||
|
||||
// Set up initial state: "line1"
|
||||
buf.insert_text(0, 0, "line1");
|
||||
buf.SetCursor(5, 0); // At end of line
|
||||
|
||||
// Execute SmartNewline
|
||||
bool ok = Execute(editor, CommandId::SmartNewline);
|
||||
ASSERT_TRUE(ok);
|
||||
|
||||
// Should have two lines now
|
||||
ASSERT_EQ(buf.Nrows(), 2);
|
||||
// Line 1 should be empty
|
||||
ASSERT_EQ(buf.GetLineString(1), "");
|
||||
// Cursor should be at (0, 1)
|
||||
ASSERT_EQ(buf.Curx(), 0);
|
||||
ASSERT_EQ(buf.Cury(), 1);
|
||||
}
|
||||
Reference in New Issue
Block a user