Sfoglia il codice sorgente

Fixed `JsonVariant::is<bool>()` that was incorrectly returning false (issue #214)

Benoit Blanchon 10 anni fa
parent
commit
6a608d4b49

+ 1 - 0
CHANGELOG.md

@@ -5,6 +5,7 @@ HEAD
 ----
 
 * Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181)
+* Fixed `JsonVariant::is<bool>()` that was incorrectly returning false (issue #214)
 
 v5.0.7
 ------

+ 2 - 4
include/ArduinoJson/JsonVariant.ipp

@@ -174,10 +174,8 @@ bool JsonVariant::is<signed long>() const;
 template <>  // in .cpp
 bool JsonVariant::is<double>() const;
 
-template <>
-inline bool JsonVariant::is<bool>() const {
-  return _type == Internals::JSON_BOOLEAN;
-}
+template <>  // int .cpp
+bool JsonVariant::is<bool>() const;
 
 template <>
 inline bool JsonVariant::is<char const *>() const {

+ 10 - 0
src/JsonVariant.cpp

@@ -86,6 +86,16 @@ String JsonVariant::as<String>() const {
   return s;
 }
 
+template <>
+bool JsonVariant::is<bool>() 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<signed long>() const {
   if (_type == JSON_INTEGER) return true;

+ 16 - 0
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 <ArduinoJson.h>
+#include <gtest/gtest.h>
+
+TEST(Issue214, IsBool) {
+  char json[] = "{\"ota\": {\"enabled\": true}}";
+  StaticJsonBuffer<JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(1)> jsonBuffer;
+  JsonObject& parsedJson = jsonBuffer.parseObject(json);
+  ASSERT_TRUE(parsedJson["ota"]["enabled"].is<bool>());
+}

+ 20 - 0
test/JsonVariant_Is_Tests.cpp

@@ -77,6 +77,26 @@ TEST(SUITE, StringIsInt) { assertIsNot<int>("42"); }
 TEST(SUITE, StringIsLong) { assertIsNot<long>("42"); }
 TEST(SUITE, StringIsString) { assertIs<const char*>("42"); }
 
+TEST(SUITE, UnparsedTrueIsArra) { assertIsNot<JsonArray&>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsBool) { assertIs<bool>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsDouble) { assertIsNot<double>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsFloat) { assertIsNot<float>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsInt) { assertIsNot<int>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsLong) { assertIsNot<long>(Unparsed("true")); }
+TEST(SUITE, UnparsedTrueIsString) {
+  assertIsNot<const char*>(Unparsed("true"));
+}
+
+TEST(SUITE, UnparsedFalseIsArra) { assertIsNot<JsonArray&>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsBool) { assertIs<bool>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsDouble) { assertIsNot<double>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsFloat) { assertIsNot<float>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsInt) { assertIsNot<int>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsLong) { assertIsNot<long>(Unparsed("false")); }
+TEST(SUITE, UnparsedFalseIsString) {
+  assertIsNot<const char*>(Unparsed("false"));
+}
+
 TEST(SUITE, UnparsedIntIsArra) { assertIsNot<JsonArray&>(Unparsed("42")); }
 TEST(SUITE, UnparsedIntIsBool) { assertIsNot<bool>(Unparsed("42")); }
 TEST(SUITE, UnparsedIntIsDouble) { assertIsNot<double>(Unparsed("42")); }