#include <gtest/gtest.h>
#include <ArduinoJson/StaticJsonBuffer.hpp>
#include <ArduinoJson/JsonValue.hpp>

using namespace ArduinoJson;

class JsonValueTests : public ::testing::Test
{
protected:
    virtual void SetUp()
    {
        jsonValue1 = json.createValue();
        jsonValue2 = json.createValue();
    }

    StaticJsonBuffer<42> json;
    JsonValue jsonValue1;
    JsonValue jsonValue2;
};


TEST_F(JsonValueTests, CanStoreInteger)
{
    jsonValue1 = 123;

    EXPECT_EQ(123, (int) jsonValue1);
}

TEST_F(JsonValueTests, CanStoreDouble)
{
    jsonValue1 = 123.45;

    EXPECT_EQ(123.45, (double) jsonValue1);
}

TEST_F(JsonValueTests, CanStoreTrue)
{
    jsonValue1 = true;
    EXPECT_TRUE((bool) jsonValue1);
}

TEST_F(JsonValueTests, CanStoreFalse)
{
    jsonValue1 = false;
    EXPECT_FALSE((bool) jsonValue1);
}

TEST_F(JsonValueTests, CanStoreString)
{
    jsonValue1 = "hello";
 
    EXPECT_STREQ("hello", (const char*) jsonValue1);
}

TEST_F(JsonValueTests, CanStoreObject)
{
    JsonObject innerObject1 = json.createObject();

    jsonValue1 = innerObject1;

    EXPECT_EQ(innerObject1, (JsonObject) jsonValue1);
}

TEST_F(JsonValueTests, IntegersAreCopiedByValue)
{
    jsonValue1 = 123;
    jsonValue2 = jsonValue1;
    jsonValue1 = 456;

    EXPECT_EQ(123, (int) jsonValue2);
}

TEST_F(JsonValueTests, DoublesAreCopiedByValue)
{
    jsonValue1 = 123.45;
    jsonValue2 = jsonValue1;
    jsonValue1 = 456.78;

    EXPECT_EQ(123.45, (double) jsonValue2);
}

TEST_F(JsonValueTests, BooleansAreCopiedByValue)
{
    jsonValue1 = true;
    jsonValue2 = jsonValue1;
    jsonValue1 = false;

    EXPECT_TRUE((bool) jsonValue2);
}

TEST_F(JsonValueTests, StringsAreCopiedByValue)
{
    jsonValue1 = "hello";
    jsonValue2 = jsonValue1;
    jsonValue1 = "world";

    EXPECT_STREQ("hello", (const char*) jsonValue2);
}


TEST_F(JsonValueTests, ObjectsAreCopiedByReference)
{
    JsonObject object = json.createObject();

    jsonValue1 = object;

    object["hello"] = "world";

    EXPECT_EQ(1, ((JsonObject) jsonValue1).size());
}

TEST_F(JsonValueTests, ArraysAreCopiedByReference)
{
    JsonArray array = json.createArray();

    jsonValue1 = array;
    
    array.add("world");

    EXPECT_EQ(1, ((JsonObject) jsonValue1).size());
}