diff --git a/JsonGenerator/PrettyPrintDecorator.cpp b/JsonGenerator/PrettyPrintDecorator.cpp index 0a964670..3667ebcb 100644 --- a/JsonGenerator/PrettyPrintDecorator.cpp +++ b/JsonGenerator/PrettyPrintDecorator.cpp @@ -12,74 +12,33 @@ size_t PrettyPrintDecorator::write(uint8_t c) switch (c) { case '{': - case '[': - - if (previousChar == '{' || previousChar == '[') - { - n = writeln() + sink.write(c); - } - else - { - n = sink.write(c); - } - - indent++; + case '[': + n = inString ? writeNormalChar(c) : writeOpening(c); break; case '}': - case ']': - indent--; - - if (previousChar == '{' || previousChar == '[') - { - n = sink.write(c); - } - else - { - n = writeln() + sink.write(c); - } + case ']': + n = inString ? writeNormalChar(c) : writeClosing(c); break; case ',': - if (isInAString) - { - n = sink.write(c); - } - else - { - n = sink.write(c) + writeln(); - } + n = inString ? writeNormalChar(c) : writeComma(); break; case ':': - if (isInAString) - { - n = sink.write(c); - } - else - { - n = sink.write(c) + sink.write(' '); - } + n = inString ? writeNormalChar(c) : writeColumn(); break; case '\"': + n = writeNormalChar(c); + if (previousChar != '\\') - { - isInAString = !isInAString; - } - // no break; + inString = !inString; + + break; default: - - if (previousChar == '{' || previousChar == '[') - { - n = writeln() + sink.write(c); - } - else - { - n = sink.write(c); - } - + n = writeNormalChar(c); break; } @@ -95,4 +54,51 @@ size_t PrettyPrintDecorator::writeln() n += sink.write(' '); return n; +} + +size_t PrettyPrintDecorator::writeNormalChar(uint8_t c) +{ + bool inEmptyBlock = !inString && (previousChar == '{' || previousChar == '['); + + return inEmptyBlock ? writeln() + sink.write(c) : sink.write(c); +} + +size_t PrettyPrintDecorator::writeColumn() +{ + return sink.write(':') + sink.write(' '); +} + +size_t PrettyPrintDecorator::writeComma() +{ + return sink.write(',') + writeln(); +} + +size_t PrettyPrintDecorator::writeOpening(uint8_t c) +{ + size_t n; + + if (previousChar == '{' || previousChar == '[') + { + n = writeln() + sink.write(c); + } + else + { + n = sink.write(c); + } + + indent++; + return n; +} + +size_t PrettyPrintDecorator::writeClosing(uint8_t c) +{ + indent--; + if (previousChar == '{' || previousChar == '[') + { + return sink.write(c); + } + else + { + return writeln() + sink.write(c); + } } \ No newline at end of file diff --git a/JsonGenerator/PrettyPrintDecorator.h b/JsonGenerator/PrettyPrintDecorator.h index 7170af3f..cbc3681d 100644 --- a/JsonGenerator/PrettyPrintDecorator.h +++ b/JsonGenerator/PrettyPrintDecorator.h @@ -16,7 +16,7 @@ public: : indent(0), sink(p) { previousChar = 0; - isInAString = false; + inString = false; } virtual size_t write(uint8_t); @@ -25,8 +25,14 @@ private: int indent; uint8_t previousChar; Print& sink; - bool isInAString; + bool inString; size_t writeln(); + + size_t writeNormalChar(uint8_t c); + size_t writeColumn(); + size_t writeComma(); + size_t writeOpening(uint8_t c); + size_t writeClosing(uint8_t c); }; diff --git a/JsonGeneratorTests/PrettyPrint_String_Tests.cpp b/JsonGeneratorTests/PrettyPrint_String_Tests.cpp index 4a046e79..961dcc8f 100644 --- a/JsonGeneratorTests/PrettyPrint_String_Tests.cpp +++ b/JsonGeneratorTests/PrettyPrint_String_Tests.cpp @@ -30,6 +30,30 @@ namespace JsonGeneratorTests whenInputIs ("\":\\\"',\""); outputMustBe("\":\\\"',\""); } + + TEST_METHOD(OpeningCurlyBrace) + { + whenInputIs ("\"{\""); + outputMustBe("\"{\""); + } + + TEST_METHOD(OpeningSquareBrace) + { + whenInputIs("\"[\""); + outputMustBe("\"[\""); + } + + TEST_METHOD(ClosingCurlyBrace) + { + whenInputIs("\"}\""); + outputMustBe("\"}\""); + } + + TEST_METHOD(ClosingSquareBrace) + { + whenInputIs("\"]\""); + outputMustBe("\"]\""); + } private: