- Introduced SwapManager for sidecar journaling of buffer mutations, with a safe recovery mechanism. - Added group undo/redo functionality, allowing atomic grouping of related edits. - Implemented `SwapRecorder` and integrated it as a callback interface for mutations. - Added unit tests for swap journaling (save/load/replay) and undo grouping. - Refactored undo to support group tracking and ID management. - Updated CMake to include the new tests and swap journaling logic.
84 lines
2.2 KiB
C++
84 lines
2.2 KiB
C++
#include "Test.h"
|
|
|
|
#include "KKeymap.h"
|
|
|
|
#include <ncurses.h>
|
|
|
|
|
|
TEST (KKeymap_KPrefix_CanonicalChords)
|
|
{
|
|
CommandId id{};
|
|
|
|
// From docs/ke.md (K-commands)
|
|
ASSERT_TRUE(KLookupKCommand('s', false, id));
|
|
ASSERT_EQ(id, CommandId::Save);
|
|
ASSERT_TRUE(KLookupKCommand('s', true, id)); // C-k C-s
|
|
ASSERT_EQ(id, CommandId::Save);
|
|
|
|
ASSERT_TRUE(KLookupKCommand('d', false, id));
|
|
ASSERT_EQ(id, CommandId::KillToEOL);
|
|
ASSERT_TRUE(KLookupKCommand('d', true, id)); // C-k C-d
|
|
ASSERT_EQ(id, CommandId::KillLine);
|
|
|
|
ASSERT_TRUE(KLookupKCommand(' ', false, id)); // C-k SPACE
|
|
ASSERT_EQ(id, CommandId::ToggleMark);
|
|
|
|
ASSERT_TRUE(KLookupKCommand('j', false, id));
|
|
ASSERT_EQ(id, CommandId::JumpToMark);
|
|
|
|
ASSERT_TRUE(KLookupKCommand('f', false, id));
|
|
ASSERT_EQ(id, CommandId::FlushKillRing);
|
|
|
|
ASSERT_TRUE(KLookupKCommand('y', false, id));
|
|
ASSERT_EQ(id, CommandId::Yank);
|
|
|
|
// Unknown should not map
|
|
ASSERT_EQ(KLookupKCommand('Z', false, id), false);
|
|
}
|
|
|
|
|
|
TEST (KKeymap_CtrlChords_CanonicalChords)
|
|
{
|
|
CommandId id{};
|
|
|
|
// From docs/ke.md (other keybindings)
|
|
ASSERT_TRUE(KLookupCtrlCommand('n', id));
|
|
ASSERT_EQ(id, CommandId::MoveDown);
|
|
ASSERT_TRUE(KLookupCtrlCommand('p', id));
|
|
ASSERT_EQ(id, CommandId::MoveUp);
|
|
ASSERT_TRUE(KLookupCtrlCommand('f', id));
|
|
ASSERT_EQ(id, CommandId::MoveRight);
|
|
ASSERT_TRUE(KLookupCtrlCommand('b', id));
|
|
ASSERT_EQ(id, CommandId::MoveLeft);
|
|
|
|
ASSERT_TRUE(KLookupCtrlCommand('w', id));
|
|
ASSERT_EQ(id, CommandId::KillRegion);
|
|
ASSERT_TRUE(KLookupCtrlCommand('y', id));
|
|
ASSERT_EQ(id, CommandId::Yank);
|
|
|
|
ASSERT_EQ(KLookupCtrlCommand('z', id), false);
|
|
}
|
|
|
|
|
|
TEST (KKeymap_EscChords_CanonicalChords)
|
|
{
|
|
CommandId id{};
|
|
|
|
// From docs/ke.md (ESC bindings)
|
|
ASSERT_TRUE(KLookupEscCommand('b', id));
|
|
ASSERT_EQ(id, CommandId::WordPrev);
|
|
ASSERT_TRUE(KLookupEscCommand('f', id));
|
|
ASSERT_EQ(id, CommandId::WordNext);
|
|
ASSERT_TRUE(KLookupEscCommand('d', id));
|
|
ASSERT_EQ(id, CommandId::DeleteWordNext);
|
|
ASSERT_TRUE(KLookupEscCommand('q', id));
|
|
ASSERT_EQ(id, CommandId::ReflowParagraph);
|
|
ASSERT_TRUE(KLookupEscCommand('w', id));
|
|
ASSERT_EQ(id, CommandId::CopyRegion);
|
|
|
|
// ESC BACKSPACE
|
|
ASSERT_TRUE(KLookupEscCommand(KEY_BACKSPACE, id));
|
|
ASSERT_EQ(id, CommandId::DeleteWordPrev);
|
|
|
|
ASSERT_EQ(KLookupEscCommand('z', id), false);
|
|
} |