Files
kte/tests/test_reflow_indented_bullets.cc
T
Claude 29d0ee8244 Remove Buffer::Rows() and the Line wrapper
The row cache rebuilt a string for every line of the file after each edit
and had one production caller left (filetype detection in the ImGui
frontend, which needs only the first line). Removed with it: rows_,
nrows_, the dirty flag set on every edit, ensure_rows_cache and a mutex
guarding only that cache. Tests read lines with GetLineString, Nrows or,
where they compare every line, a test-only LinesForTests().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015rcVQiiWyTzoNrsvLSaAfB
2026-09-24 12:19:59 -07:00

79 lines
2.2 KiB
C++

#include "Test.h"
#include "Buffer.h"
#include "Command.h"
#include "Editor.h"
#include <iostream>
#include <string>
static std::string
to_string_rows(const Buffer &buf)
{
std::string out;
for (const auto &r: buf.LinesForTests()) {
out += static_cast<std::string>(r);
out.push_back('\n');
}
return out;
}
TEST(ReflowParagraph_IndentedBullets_PreserveStructure)
{
InstallDefaultCommands();
Editor ed;
ed.SetDimensions(24, 80);
Buffer b;
// Test the example from the issue: indented list items should not be merged
const std::string initial =
"+ something at the top\n"
" + something indented\n"
"+ the next line\n";
b.insert_text(0, 0, initial);
// Put cursor on first item
b.SetCursor(0, 0);
ed.AddBuffer(std::move(b));
Buffer *buf = ed.CurrentBuffer();
ASSERT_TRUE(buf != nullptr);
// Use a width that's larger than all lines (so no wrapping should occur)
const int width = 80;
ASSERT_TRUE(Execute(ed, std::string("reflow-paragraph"), std::string(), width));
const auto &rows = buf->LinesForTests();
const std::string result = to_string_rows(*buf);
// We should have 3 lines (plus possibly a trailing empty line)
ASSERT_TRUE(rows.size() >= 3);
// Check that the structure is preserved
std::string line0 = static_cast<std::string>(rows[0]);
std::string line1 = static_cast<std::string>(rows[1]);
std::string line2 = static_cast<std::string>(rows[2]);
// First line should start with "+ "
EXPECT_TRUE(line0.rfind("+ ", 0) == 0);
EXPECT_TRUE(line0.find("something at the top") != std::string::npos);
// Second line should start with " + " (two spaces, then +)
EXPECT_TRUE(line1.rfind(" + ", 0) == 0);
EXPECT_TRUE(line1.find("something indented") != std::string::npos);
// Third line should start with "+ "
EXPECT_TRUE(line2.rfind("+ ", 0) == 0);
EXPECT_TRUE(line2.find("the next line") != std::string::npos);
// The indented line should NOT be merged with the first line
EXPECT_TRUE(line0.find("indented") == std::string::npos);
// Debug output if something goes wrong
if (line0.rfind("+ ", 0) != 0 || line1.rfind(" + ", 0) != 0 || line2.rfind("+ ", 0) != 0) {
std::cerr << "Reflow did not preserve indented bullet structure:\n" << result << "\n";
}
}