From c61ee09d26269987567389b8d1841ac16c7cbc47 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 15 Oct 2014 23:10:52 +0200 Subject: [PATCH] Parse booleans --- srcs/Internals/JsonParser.cpp | 19 +++++++++++++++++++ srcs/Internals/JsonParser.h | 2 ++ srcs/JsonBuffer.cpp | 10 ++++++++++ srcs/JsonBuffer.h | 2 ++ tests/JsonArray_Parser_Tests.cpp | 19 ++++++++++--------- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/srcs/Internals/JsonParser.cpp b/srcs/Internals/JsonParser.cpp index abdefdfb..9949a73a 100644 --- a/srcs/Internals/JsonParser.cpp +++ b/srcs/Internals/JsonParser.cpp @@ -60,6 +60,11 @@ bool JsonParser::isComma() return *_ptr == ','; } +bool JsonParser::isBoolean() +{ + return *_ptr == 't' || *_ptr == 'f'; +} + void JsonParser::skipOneChar() { _ptr++; @@ -83,6 +88,9 @@ JsonNode* JsonParser::parseAnything() if (isDouble()) return parseDouble(); + if (isBoolean()) + return parseBoolean(); + return 0; } @@ -133,3 +141,14 @@ JsonNode *JsonParser::parseDouble() return _buffer->createDoubleNode(value, decimals); } + +JsonNode *JsonParser::parseBoolean() +{ + bool value = *_ptr == 't'; + + _ptr += value ? 4 : 5; + // 4 = strlen("true") + // 5 = strlen("false"); + + return _buffer->createBoolNode(value); +} diff --git a/srcs/Internals/JsonParser.h b/srcs/Internals/JsonParser.h index acab613f..340ffc76 100644 --- a/srcs/Internals/JsonParser.h +++ b/srcs/Internals/JsonParser.h @@ -27,12 +27,14 @@ private: inline bool isDouble(); inline bool isSpace(); inline bool isComma(); + inline bool isBoolean(); inline void skipOneChar(); inline void skipSpaces(); inline JsonNode* parseArray(); inline JsonNode* parseLong(); + inline JsonNode* parseBoolean(); JsonNode *parseDouble(); }; \ No newline at end of file diff --git a/srcs/JsonBuffer.cpp b/srcs/JsonBuffer.cpp index b3f93869..0daf34ae 100644 --- a/srcs/JsonBuffer.cpp +++ b/srcs/JsonBuffer.cpp @@ -64,3 +64,13 @@ JsonNode *JsonBuffer::createDoubleNode(double value, int decimals) return node; } + +JsonNode *JsonBuffer::createBoolNode(bool value) +{ + JsonNode* node = createNode(); + + if (node) + node->setAsBoolean(value); + + return node; +} diff --git a/srcs/JsonBuffer.h b/srcs/JsonBuffer.h index 9041b539..e619d033 100644 --- a/srcs/JsonBuffer.h +++ b/srcs/JsonBuffer.h @@ -38,5 +38,7 @@ private: JsonNode* createObjectNode(); JsonNode* createLongNode(long value); JsonNode *createDoubleNode(double value, int decimals); + + JsonNode *createBoolNode(bool value); }; diff --git a/tests/JsonArray_Parser_Tests.cpp b/tests/JsonArray_Parser_Tests.cpp index e0c5e7f0..b5dc30b8 100644 --- a/tests/JsonArray_Parser_Tests.cpp +++ b/tests/JsonArray_Parser_Tests.cpp @@ -117,15 +117,6 @@ TEST_F(JsonArray_Parser_Tests, TwoIntegers) secondElementMustBe(84); } -TEST_F(JsonArray_Parser_Tests, OneDouble) -{ - whenInputIs("[4.2]"); - - parseMustSucceed(); - sizeMustBe(1); - firstElementMustBe(4.2); -} - TEST_F(JsonArray_Parser_Tests, TwoDoubles) { whenInputIs("[4.2,8.4]"); @@ -134,4 +125,14 @@ TEST_F(JsonArray_Parser_Tests, TwoDoubles) sizeMustBe(2); firstElementMustBe(4.2); secondElementMustBe(8.4); +} + +TEST_F(JsonArray_Parser_Tests, TwoBooleans) +{ + whenInputIs("[true,false]"); + + parseMustSucceed(); + sizeMustBe(2); + firstElementMustBe(true); + secondElementMustBe(false); } \ No newline at end of file