Epic refactoring in progress

This commit is contained in:
Benoit Blanchon
2014-10-28 17:58:46 +01:00
parent 61218f12fd
commit 10ab95522d
10 changed files with 38 additions and 30 deletions

View File

@ -11,6 +11,7 @@
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
// TODO: copy from JsonArrayIterator
class JsonArrayConstIterator { class JsonArrayConstIterator {
public: public:
explicit JsonArrayConstIterator(JsonArrayNode *node) : _node(node) {} explicit JsonArrayConstIterator(JsonArrayNode *node) : _node(node) {}

View File

@ -39,6 +39,8 @@ class JsonArrayImpl {
private: private:
JsonArrayImpl(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {} JsonArrayImpl(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {}
inline void addNode(JsonArrayNode *node);
JsonBuffer *_buffer; JsonBuffer *_buffer;
Internals::JsonArrayNode *_firstNode; Internals::JsonArrayNode *_firstNode;
}; };

View File

@ -29,8 +29,10 @@ class JsonArrayIterator {
} }
JsonArrayIterator &operator++() { JsonArrayIterator &operator++() {
_node = _node->next; if (_node) {
updateValue(); _node = _node->next;
updateValue();
}
return *this; return *this;
} }

View File

@ -25,7 +25,7 @@ class JsonObjectIterator {
} }
JsonObjectIterator &operator++() { JsonObjectIterator &operator++() {
_pair._node = _pair._node->next; if (_pair._node) _pair._node = _pair._node->next;
return *this; return *this;
} }

View File

@ -24,7 +24,7 @@ class JsonObjectNode {
JsonObjectNode* next; JsonObjectNode* next;
private: private:
JsonObjectNode(const char* k) : key(k) {} JsonObjectNode(const char* k) : key(k), next(NULL) {}
}; };
} }
} }

View File

@ -17,9 +17,11 @@ class StaticJsonBuffer : public JsonBuffer {
virtual ~StaticJsonBuffer() {} virtual ~StaticJsonBuffer() {}
int capacity() { return CAPACITY; } int capacity() const { return CAPACITY; }
int size() { return _size; } int size() const { return _size; }
void clear() { _size = 0; }
protected: protected:
virtual void* alloc(size_t size) { virtual void* alloc(size_t size) {

View File

@ -27,19 +27,28 @@ int JsonArrayImpl::size() const {
JsonValueImpl *JsonArrayImpl::operator[](int index) const { JsonValueImpl *JsonArrayImpl::operator[](int index) const {
JsonArrayNode *node = _firstNode; JsonArrayNode *node = _firstNode;
while (node && index--) node = node->next; while (node && index--) node = node->next;
return node ? &node->value : NULL;
return NULL;
} }
JsonValueImpl *JsonArrayImpl::add() { JsonValueImpl *JsonArrayImpl::add() {
if (_buffer) return NULL;
JsonArrayNode *node = JsonArrayNode::createFrom(_buffer); JsonArrayNode *node = JsonArrayNode::createFrom(_buffer);
if (!node) return NULL; if (!node) return NULL;
addNode(node);
return &node->value; return &node->value;
} }
void JsonArrayImpl::addNode(JsonArrayNode *newNode) {
if (_firstNode) {
JsonArrayNode *lastNode = _firstNode;
while (lastNode->next) lastNode = lastNode->next;
lastNode->next = newNode;
} else {
_firstNode = newNode;
}
}
JsonArrayImpl *JsonArrayImpl::createNestedArray() { JsonArrayImpl *JsonArrayImpl::createNestedArray() {
JsonValueImpl *value = add(); JsonValueImpl *value = add();
if (!value) return NULL; if (!value) return NULL;

View File

@ -42,7 +42,7 @@ class Issue10 : public testing::Test {
}; };
TEST_F(Issue10, PopulateArrayByAddingAnObject) { TEST_F(Issue10, PopulateArrayByAddingAnObject) {
StaticJsonBuffer<20> json; StaticJsonBuffer<200> json;
JsonArray array = json.createArray(); JsonArray array = json.createArray();
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
@ -59,7 +59,7 @@ TEST_F(Issue10, PopulateArrayByAddingAnObject) {
} }
TEST_F(Issue10, PopulateArrayByCreatingNestedObjects) { TEST_F(Issue10, PopulateArrayByCreatingNestedObjects) {
StaticJsonBuffer<20> json; StaticJsonBuffer<200> json;
JsonArray array = json.createArray(); JsonArray array = json.createArray();
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {

View File

@ -15,9 +15,10 @@ using namespace ArduinoJson;
class JsonArray_Container_Tests : public ::testing::Test { class JsonArray_Container_Tests : public ::testing::Test {
protected: protected:
virtual void SetUp() { array = json.createArray(); } virtual void SetUp() {
json.clear();
void nodeCountMustBe(int expected) { EXPECT_EQ(expected, json.size()); } array = json.createArray();
}
template <typename T> template <typename T>
void firstElementMustBe(T expected) { void firstElementMustBe(T expected) {
@ -31,7 +32,7 @@ class JsonArray_Container_Tests : public ::testing::Test {
void sizeMustBe(int expected) { EXPECT_EQ(expected, array.size()); } void sizeMustBe(int expected) { EXPECT_EQ(expected, array.size()); }
StaticJsonBuffer<42> json; StaticJsonBuffer<256> json;
JsonArray array; JsonArray array;
private: private:
@ -41,19 +42,18 @@ class JsonArray_Container_Tests : public ::testing::Test {
} }
}; };
TEST_F(JsonArray_Container_Tests, InitialSizeIsZero) { TEST_F(JsonArray_Container_Tests, SuccessIsTrue) {
sizeMustBe(0); EXPECT_TRUE(array.success());
nodeCountMustBe(1);
} }
TEST_F(JsonArray_Container_Tests, InitialSizeIsZero) { sizeMustBe(0); }
TEST_F(JsonArray_Container_Tests, Grow_WhenValuesAreAdded) { TEST_F(JsonArray_Container_Tests, Grow_WhenValuesAreAdded) {
array.add("hello"); array.add("hello");
sizeMustBe(1); sizeMustBe(1);
nodeCountMustBe(2);
array.add("world"); array.add("world");
sizeMustBe(2); sizeMustBe(2);
nodeCountMustBe(3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreIntegers) { TEST_F(JsonArray_Container_Tests, CanStoreIntegers) {
@ -62,7 +62,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreIntegers) {
firstElementMustBe(123); firstElementMustBe(123);
secondElementMustBe(456); secondElementMustBe(456);
nodeCountMustBe(3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreDoubles) { TEST_F(JsonArray_Container_Tests, CanStoreDoubles) {
@ -71,7 +70,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreDoubles) {
firstElementMustBe(123.45); firstElementMustBe(123.45);
secondElementMustBe(456.78); secondElementMustBe(456.78);
nodeCountMustBe(3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreBooleans) { TEST_F(JsonArray_Container_Tests, CanStoreBooleans) {
@ -80,7 +78,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreBooleans) {
firstElementMustBe(true); firstElementMustBe(true);
secondElementMustBe(false); secondElementMustBe(false);
nodeCountMustBe(3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreStrings) { TEST_F(JsonArray_Container_Tests, CanStoreStrings) {
@ -92,7 +89,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreStrings) {
firstElementMustBe(firstString); firstElementMustBe(firstString);
secondElementMustBe(secondString); secondElementMustBe(secondString);
nodeCountMustBe(3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreNestedArrays) { TEST_F(JsonArray_Container_Tests, CanStoreNestedArrays) {
@ -104,7 +100,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreNestedArrays) {
firstElementMustBe(innerarray1); firstElementMustBe(innerarray1);
secondElementMustBe(innerarray2); secondElementMustBe(innerarray2);
nodeCountMustBe(1 + 3 + 3);
} }
TEST_F(JsonArray_Container_Tests, CanStoreNestedObjects) { TEST_F(JsonArray_Container_Tests, CanStoreNestedObjects) {
@ -116,7 +111,6 @@ TEST_F(JsonArray_Container_Tests, CanStoreNestedObjects) {
firstElementMustBe(innerObject1); firstElementMustBe(innerObject1);
secondElementMustBe(innerObject2); secondElementMustBe(innerObject2);
nodeCountMustBe(1 + 3 + 3);
} }
TEST_F(JsonArray_Container_Tests, CanCreateNestedArrays) { TEST_F(JsonArray_Container_Tests, CanCreateNestedArrays) {
@ -125,7 +119,6 @@ TEST_F(JsonArray_Container_Tests, CanCreateNestedArrays) {
firstElementMustBe(innerarray1); firstElementMustBe(innerarray1);
secondElementMustBe(innerarray2); secondElementMustBe(innerarray2);
nodeCountMustBe(1 + 1 + 1);
} }
TEST_F(JsonArray_Container_Tests, CanCreateNestedObjects) { TEST_F(JsonArray_Container_Tests, CanCreateNestedObjects) {
@ -134,5 +127,4 @@ TEST_F(JsonArray_Container_Tests, CanCreateNestedObjects) {
firstElementMustBe(innerObject1); firstElementMustBe(innerObject1);
secondElementMustBe(innerObject2); secondElementMustBe(innerObject2);
nodeCountMustBe(3);
} }

View File

@ -11,7 +11,7 @@
using namespace ArduinoJson; using namespace ArduinoJson;
TEST(JsonArray_Iterator_Test, SimpleTest) { TEST(JsonArray_Iterator_Test, SimpleTest) {
StaticJsonBuffer<42> jsonBuffer; StaticJsonBuffer<100> jsonBuffer;
JsonArray array = jsonBuffer.createArray(); JsonArray array = jsonBuffer.createArray();
array.add(12); array.add(12);