Serializer edge case bug fix: very deep indents ignored indent_char

This commit is contained in:
Evan Driscoll 2018-06-02 21:34:55 -05:00
parent a983e47619
commit 1c1c789084
5 changed files with 74 additions and 8 deletions

View File

@ -162,7 +162,7 @@ class fancy_serializer
const auto new_indent = (depth + 1) * style.indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, style.indent_char);
}
const int newline_len = (style.indent_step > 0);
@ -207,7 +207,7 @@ class fancy_serializer
const auto new_indent = (depth + 1) * style.indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, style.indent_char);
}
const int newline_len = (style.indent_step > 0);

View File

@ -93,7 +93,7 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, indent_char);
}
// first n-1 elements
@ -166,7 +166,7 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, indent_char);
}
// first n-1 elements

View File

@ -9876,7 +9876,7 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, indent_char);
}
// first n-1 elements
@ -9949,7 +9949,7 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, indent_char);
}
// first n-1 elements
@ -10232,7 +10232,7 @@ class fancy_serializer
const auto new_indent = (depth + 1) * style.indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, style.indent_char);
}
const int newline_len = (style.indent_step > 0);
@ -10277,7 +10277,7 @@ class fancy_serializer
const auto new_indent = (depth + 1) * style.indent_step;
if (JSON_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
indent_string.resize(indent_string.size() * 2, style.indent_char);
}
const int newline_len = (style.indent_step > 0);

View File

@ -187,4 +187,39 @@ TEST_CASE("serialization")
"]"
);
}
SECTION("indent_char is honored for deep indents in lists")
{
fancy_serializer_style style;
style.indent_step = 300;
style.indent_char = 'X';
auto str = fancy_to_string({1, {1}}, style);
std::string indent(300, 'X');
CHECK(str ==
"[\n" +
indent + "1,\n" +
indent + "[\n" +
indent + indent + "1\n" +
indent + "]\n" +
"]");
}
SECTION("indent_char is honored for deep indents in objects")
{
fancy_serializer_style style;
style.indent_step = 300;
style.indent_char = 'X';
auto str = fancy_to_string({{"key", {{"key", 1}}}}, style);
std::string indent(300, 'X');
CHECK(str ==
"{\n" +
indent + "\"key\": {\n" +
indent + indent + "\"key\": 1\n" +
indent + "}\n" +
"}");
}
}

View File

@ -63,6 +63,37 @@ TEST_CASE("serialization")
}
}
SECTION("indent_char is honored for deep indents in lists")
{
std::stringstream ss;
json j = {1, {1}};
ss << std::setw(300) << std::setfill('X') << j;
std::string indent(300, 'X');
CHECK(ss.str() ==
"[\n" +
indent + "1,\n" +
indent + "[\n" +
indent + indent + "1\n" +
indent + "]\n" +
"]");
}
SECTION("indent_char is honored for deep indents in objects")
{
std::stringstream ss;
json j = {{"key", {{"key", 1}}}};
ss << std::setw(300) << std::setfill('X') << j;
std::string indent(300, 'X');
CHECK(ss.str() ==
"{\n" +
indent + "\"key\": {\n" +
indent + indent + "\"key\": 1\n" +
indent + "}\n" +
"}");
}
SECTION("operator>>")
{
SECTION("no given width")