diff --git a/CHANGELOG.md b/CHANGELOG.md index b796eaf3..88fdd1a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ HEAD ---- * Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181) +* Fixed `JsonVariant::is()` that was incorrectly returning false (issue #214) v5.0.7 ------ diff --git a/include/ArduinoJson/JsonVariant.ipp b/include/ArduinoJson/JsonVariant.ipp index 4a15e1dd..436cc795 100644 --- a/include/ArduinoJson/JsonVariant.ipp +++ b/include/ArduinoJson/JsonVariant.ipp @@ -174,10 +174,8 @@ bool JsonVariant::is() const; template <> // in .cpp bool JsonVariant::is() const; -template <> -inline bool JsonVariant::is() const { - return _type == Internals::JSON_BOOLEAN; -} +template <> // int .cpp +bool JsonVariant::is() const; template <> inline bool JsonVariant::is() const { diff --git a/src/JsonVariant.cpp b/src/JsonVariant.cpp index 3393e81c..fec047c0 100644 --- a/src/JsonVariant.cpp +++ b/src/JsonVariant.cpp @@ -86,6 +86,16 @@ String JsonVariant::as() const { return s; } +template <> +bool JsonVariant::is() const { + if (_type == JSON_BOOLEAN) return true; + + if (_type != JSON_UNPARSED || _content.asString == NULL) return false; + + return !strcmp(_content.asString, "true") || + !strcmp(_content.asString, "false"); +} + template <> bool JsonVariant::is() const { if (_type == JSON_INTEGER) return true; diff --git a/test/Issue214.cpp b/test/Issue214.cpp new file mode 100644 index 00000000..140f2052 --- /dev/null +++ b/test/Issue214.cpp @@ -0,0 +1,16 @@ +// Copyright Benoit Blanchon 2014-2016 +// MIT License +// +// Arduino JSON library +// https://github.com/bblanchon/ArduinoJson +// If you like this project, please add a star! + +#include +#include + +TEST(Issue214, IsBool) { + char json[] = "{\"ota\": {\"enabled\": true}}"; + StaticJsonBuffer jsonBuffer; + JsonObject& parsedJson = jsonBuffer.parseObject(json); + ASSERT_TRUE(parsedJson["ota"]["enabled"].is()); +} diff --git a/test/JsonVariant_Is_Tests.cpp b/test/JsonVariant_Is_Tests.cpp index 96a1d18c..1d616488 100644 --- a/test/JsonVariant_Is_Tests.cpp +++ b/test/JsonVariant_Is_Tests.cpp @@ -77,6 +77,26 @@ TEST(SUITE, StringIsInt) { assertIsNot("42"); } TEST(SUITE, StringIsLong) { assertIsNot("42"); } TEST(SUITE, StringIsString) { assertIs("42"); } +TEST(SUITE, UnparsedTrueIsArra) { assertIsNot(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsBool) { assertIs(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsDouble) { assertIsNot(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsFloat) { assertIsNot(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsInt) { assertIsNot(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsLong) { assertIsNot(Unparsed("true")); } +TEST(SUITE, UnparsedTrueIsString) { + assertIsNot(Unparsed("true")); +} + +TEST(SUITE, UnparsedFalseIsArra) { assertIsNot(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsBool) { assertIs(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsDouble) { assertIsNot(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsFloat) { assertIsNot(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsInt) { assertIsNot(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsLong) { assertIsNot(Unparsed("false")); } +TEST(SUITE, UnparsedFalseIsString) { + assertIsNot(Unparsed("false")); +} + TEST(SUITE, UnparsedIntIsArra) { assertIsNot(Unparsed("42")); } TEST(SUITE, UnparsedIntIsBool) { assertIsNot(Unparsed("42")); } TEST(SUITE, UnparsedIntIsDouble) { assertIsNot(Unparsed("42")); }