Skip to content

Commit

Permalink
Added JsonPrintable::measureLength() (issue #75)
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed May 9, 2015
1 parent c385862 commit 08d05df
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 17 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Arduino JSON: change log
========================

v4.4
----

* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75)

v4.3
----

Expand Down
20 changes: 20 additions & 0 deletions include/ArduinoJson/Internals/DummyPrint.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson

#pragma once

#include "../Arduino/Print.hpp"

namespace ArduinoJson {
namespace Internals {

// A dummy Print implementation used in JsonPrintable::measureLength()
class DummyPrint : public Print {
public:
virtual size_t write(uint8_t) { return 1; }
};
}
}
11 changes: 11 additions & 0 deletions include/ArduinoJson/Internals/JsonPrintable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#pragma once

#include "DummyPrint.hpp"
#include "IndentedPrint.hpp"
#include "JsonWriter.hpp"
#include "Prettyfier.hpp"
Expand Down Expand Up @@ -47,6 +48,16 @@ class JsonPrintable {
return prettyPrintTo(indentedPrint);
}

size_t measureLength() const {
DummyPrint dp;
return printTo(dp);
}

size_t measurePrettyLength() const {
DummyPrint dp;
return prettyPrintTo(dp);
}

private:
const T &downcast() const { return *static_cast<const T *>(this); }
};
Expand Down
4 changes: 2 additions & 2 deletions scripts/create-build-envs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ build-env()
if [[ $(uname) == MINGW* ]]
then
build-env "Make" "MinGW Makefiles"
build-env "SublimeText" "Sublime Text 2 - MinGW Makefiles"
build-env "SublimeText" "Sublime Text 2 - Ninja"
build-env "VisualStudio" "Visual Studio 12 2013"
else
build-env "SublimeText" "Sublime Text 2 - Unix Makefiles"
build-env "SublimeText" "Sublime Text 2 - Ninja"
build-env "Make" "Unix Makefiles"
build-env "Xcode" "Xcode"
fi
14 changes: 8 additions & 6 deletions test/JsonArray_PrettyPrintTo_Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ class JsonArray_PrettyPrintTo_Tests : public testing::Test {
JsonArray& array;

void outputMustBe(const char* expected) {
size_t n = array.prettyPrintTo(_buffer, sizeof(_buffer));
EXPECT_STREQ(expected, _buffer);
EXPECT_EQ(strlen(expected), n);
}
char actual[256];

size_t actualLen = array.prettyPrintTo(actual, sizeof(actual));
size_t measuredLen = array.measurePrettyLength();

private:
char _buffer[256];
EXPECT_STREQ(expected, actual);
EXPECT_EQ(strlen(expected), actualLen);
EXPECT_EQ(strlen(expected), measuredLen);
}
};

TEST_F(JsonArray_PrettyPrintTo_Tests, Empty) { outputMustBe("[]"); }
Expand Down
7 changes: 5 additions & 2 deletions test/JsonArray_PrintTo_Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ class JsonArray_PrintTo_Tests : public testing::Test {
JsonArray &array;

void outputMustBe(const char *expected) {
size_t n = array.printTo(buffer, sizeof(buffer));
size_t actualLen = array.printTo(buffer, sizeof(buffer));
size_t measuredLen = array.measureLength();

EXPECT_STREQ(expected, buffer);
EXPECT_EQ(strlen(expected), n);
EXPECT_EQ(strlen(expected), actualLen);
EXPECT_EQ(strlen(expected), measuredLen);
}

private:
Expand Down
12 changes: 7 additions & 5 deletions test/JsonObject_PrettyPrintTo_Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ class JsonObject_PrettyPrintTo_Tests : public testing::Test {
JsonObject &_object;

void outputMustBe(const char *expected) {
size_t n = _object.prettyPrintTo(buffer, sizeof(buffer));
char buffer[256];

size_t actualLen = _object.prettyPrintTo(buffer, sizeof(buffer));
size_t measuredLen = _object.measurePrettyLength();

EXPECT_STREQ(expected, buffer);
EXPECT_EQ(strlen(expected), n);
EXPECT_EQ(strlen(expected), actualLen);
EXPECT_EQ(strlen(expected), measuredLen);
}

private:
char buffer[256];
};

TEST_F(JsonObject_PrettyPrintTo_Tests, EmptyObject) { outputMustBe("{}"); }
Expand Down
6 changes: 4 additions & 2 deletions test/JsonObject_PrintTo_Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ class JsonObject_PrintTo_Tests : public testing::Test {
protected:
void outputMustBe(const char *expected) {
char actual[256];
int result = object.printTo(actual, sizeof(actual));
size_t actualLen = object.printTo(actual, sizeof(actual));
size_t measuredLen = object.measureLength();

EXPECT_STREQ(expected, actual);
EXPECT_EQ(strlen(expected), result);
EXPECT_EQ(strlen(expected), actualLen);
EXPECT_EQ(strlen(expected), measuredLen);
}

StaticJsonBuffer<JSON_OBJECT_SIZE(2)> json;
Expand Down

0 comments on commit 08d05df

Please sign in to comment.