Fixed bug when a string contains a brace

This commit is contained in:
Benoit Blanchon
2014-08-25 12:23:08 +02:00
parent 8465cc0c83
commit 752378a8cb
3 changed files with 91 additions and 55 deletions

View File

@ -13,73 +13,32 @@ size_t PrettyPrintDecorator::write(uint8_t c)
{ {
case '{': case '{':
case '[': case '[':
n = inString ? writeNormalChar(c) : writeOpening(c);
if (previousChar == '{' || previousChar == '[')
{
n = writeln() + sink.write(c);
}
else
{
n = sink.write(c);
}
indent++;
break; break;
case '}': case '}':
case ']': case ']':
indent--; n = inString ? writeNormalChar(c) : writeClosing(c);
if (previousChar == '{' || previousChar == '[')
{
n = sink.write(c);
}
else
{
n = writeln() + sink.write(c);
}
break; break;
case ',': case ',':
if (isInAString) n = inString ? writeNormalChar(c) : writeComma();
{
n = sink.write(c);
}
else
{
n = sink.write(c) + writeln();
}
break; break;
case ':': case ':':
if (isInAString) n = inString ? writeNormalChar(c) : writeColumn();
{
n = sink.write(c);
}
else
{
n = sink.write(c) + sink.write(' ');
}
break; break;
case '\"': case '\"':
n = writeNormalChar(c);
if (previousChar != '\\') if (previousChar != '\\')
{ inString = !inString;
isInAString = !isInAString;
} break;
// no break;
default: default:
n = writeNormalChar(c);
if (previousChar == '{' || previousChar == '[')
{
n = writeln() + sink.write(c);
}
else
{
n = sink.write(c);
}
break; break;
} }
@ -96,3 +55,50 @@ size_t PrettyPrintDecorator::writeln()
return n; 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);
}
}

View File

@ -16,7 +16,7 @@ public:
: indent(0), sink(p) : indent(0), sink(p)
{ {
previousChar = 0; previousChar = 0;
isInAString = false; inString = false;
} }
virtual size_t write(uint8_t); virtual size_t write(uint8_t);
@ -25,8 +25,14 @@ private:
int indent; int indent;
uint8_t previousChar; uint8_t previousChar;
Print& sink; Print& sink;
bool isInAString; bool inString;
size_t writeln(); 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);
}; };

View File

@ -31,6 +31,30 @@ namespace JsonGeneratorTests
outputMustBe("\":\\\"',\""); outputMustBe("\":\\\"',\"");
} }
TEST_METHOD(OpeningCurlyBrace)
{
whenInputIs ("\"{\"");
outputMustBe("\"{\"");
}
TEST_METHOD(OpeningSquareBrace)
{
whenInputIs("\"[\"");
outputMustBe("\"[\"");
}
TEST_METHOD(ClosingCurlyBrace)
{
whenInputIs("\"}\"");
outputMustBe("\"}\"");
}
TEST_METHOD(ClosingSquareBrace)
{
whenInputIs("\"]\"");
outputMustBe("\"]\"");
}
private: private:
void whenInputIs(const char input[]) void whenInputIs(const char input[])