test_integration.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "gtest/gtest.h"
  2. #include "lumacs/editor_core.hpp"
  3. #include "lumacs/buffer_manager.hpp"
  4. #include "lumacs/window_manager.hpp"
  5. #include "lumacs/kill_ring_manager.hpp"
  6. using namespace lumacs;
  7. class IntegrationTest : public ::testing::Test {
  8. protected:
  9. std::unique_ptr<EditorCore> core;
  10. void SetUp() override {
  11. core = std::make_unique<EditorCore>();
  12. core->buffer().clear(); // Start with clean scratch buffer
  13. core->set_cursor({0,0});
  14. }
  15. void TearDown() override {
  16. core.reset();
  17. }
  18. };
  19. TEST_F(IntegrationTest, BufferWindowIndependenceAndKillRing) {
  20. // 1. Setup initial buffer "buffer1"
  21. core->new_buffer("buffer1");
  22. core->buffer().insert({0,0}, "Hello");
  23. ASSERT_EQ(core->buffer().content(), "Hello");
  24. // 2. Split window. Both should show "buffer1"
  25. core->split_horizontally();
  26. // Now we have 2 windows. The new one is active.
  27. auto w2 = core->active_window();
  28. // Switch focus to w1 (previous) just to check
  29. core->next_window();
  30. auto w1 = core->active_window();
  31. ASSERT_NE(w1, w2);
  32. ASSERT_EQ(w1->buffer().name(), "buffer1");
  33. ASSERT_EQ(w2->buffer().name(), "buffer1");
  34. // 3. Create "buffer2" and switch active window (w1) to it
  35. // Note: new_buffer switches the active window to the new buffer
  36. core->new_buffer("buffer2");
  37. ASSERT_EQ(core->active_window()->buffer().name(), "buffer2");
  38. // Check that w2 still shows buffer1
  39. ASSERT_EQ(w2->buffer().name(), "buffer1");
  40. // 4. Insert text in buffer2
  41. core->buffer().insert({0,0}, "World");
  42. ASSERT_EQ(core->buffer().content(), "World");
  43. // Verify buffer1 is unchanged
  44. ASSERT_EQ(w2->buffer().content(), "Hello");
  45. // 5. Kill Ring Interaction
  46. // Switch to w2 (buffer1)
  47. core->set_active_window(w2);
  48. ASSERT_EQ(core->buffer().name(), "buffer1");
  49. // Kill "Hello"
  50. core->set_cursor({0,0});
  51. core->kill_line();
  52. ASSERT_EQ(core->buffer().content(), ""); // Empty now (newline might remain depending on kill_line logic)
  53. // Actually kill_line kills the text. If it was "Hello", and no newline, it kills "Hello".
  54. // Switch to w1 (buffer2)
  55. core->set_active_window(w1);
  56. ASSERT_EQ(core->buffer().name(), "buffer2");
  57. // Go to end
  58. core->goto_end();
  59. // Yank "Hello"
  60. core->yank();
  61. ASSERT_EQ(core->buffer().content(), "WorldHello");
  62. }
  63. TEST_F(IntegrationTest, CursorIndependenceSameBuffer) {
  64. core->new_buffer("shared_buf");
  65. core->buffer().insert({0,0}, "Line1\nLine2\nLine3");
  66. core->split_vertically();
  67. auto w2 = core->active_window();
  68. core->next_window();
  69. auto w1 = core->active_window();
  70. // Both view shared_buf
  71. ASSERT_EQ(w1->buffer().name(), "shared_buf");
  72. ASSERT_EQ(w2->buffer().name(), "shared_buf");
  73. // Move cursor in w1 to Line 3
  74. core->set_active_window(w1);
  75. core->goto_line(2); // 0-indexed -> Line 3
  76. ASSERT_EQ(core->cursor().line, 2);
  77. // Check w2 cursor - should still be at 0,0
  78. ASSERT_EQ(w2->cursor().line, 0);
  79. // Move w2 cursor to Line 2
  80. core->set_active_window(w2);
  81. core->goto_line(1);
  82. ASSERT_EQ(core->cursor().line, 1);
  83. // Check w1 cursor again
  84. ASSERT_EQ(w1->cursor().line, 2);
  85. }