/**
     * Test EnumSchemaItem
     *
     * Create SchemaItem with default value. Method setDefaultValue should return true,
     * SmartObject should contain default value.
     * Not Enum SmartObject should converted to intObject and setted up by the default value.
     **/
    TEST_F(EnumSchemaItemTest, test_item_with_default_value)
    {
        SmartObject obj;
        ISchemaItemPtr item = TEnumSchemaItem<TestType::eType>::create(testEnum,
            TSchemaItemParameter<TestType::eType>(TestType::FACTORY_DEFAULTS));

        //Object - valid enum
        obj = TestType::BLUETOOTH_OFF;
        int resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);
        bool resDefault = item->setDefaultValue(obj);
        EXPECT_TRUE(resDefault);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());

        //Obj - bool
        obj = true;

        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);
        resDefault = item->setDefaultValue(obj);
        EXPECT_TRUE(resDefault);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());

        //Object - number
        obj = 3.1415926;

        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);

        resDefault = item->setDefaultValue(obj);
        EXPECT_TRUE(resDefault);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());

        //Object - string
        obj = "Some string";
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);

        resDefault = item->setDefaultValue(obj);
        EXPECT_TRUE(resDefault);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());
    }
    /**
     * Test EnumSchemaItem with default value
     *
     * Create SchemaItem without default value. Method setDefaultValue should return false,
     * SmartObject should contain previous value.
     **/
    TEST_F(EnumSchemaItemTest, test_item_without_default_value)
    {
        SmartObject obj;

        ISchemaItemPtr item = TEnumSchemaItem<TestType::eType>::create(testEnum,
            TSchemaItemParameter<TestType::eType>());

        //Object - valid enum
        obj = TestType::BLUETOOTH_OFF;
        int resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);
        bool resDefault = item->setDefaultValue(obj);
        EXPECT_FALSE(resDefault);
        EXPECT_EQ(TestType::BLUETOOTH_OFF, obj.asInt());

        //Obj - bool
        obj = true;

        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);
        resDefault = item->setDefaultValue(obj);
        EXPECT_FALSE(resDefault);
        EXPECT_TRUE(obj.asBool());

        //Object - number
        obj = 3.1415926;

        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);

        resDefault = item->setDefaultValue(obj);
        EXPECT_FALSE(resDefault);
        EXPECT_EQ(3.1415926, obj.asDouble());

        //Object - string
        obj = "Some string";
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);

        resDefault = item->setDefaultValue(obj);
        EXPECT_FALSE(resDefault);
        EXPECT_EQ(std::string("Some string"), obj.asString());

        //Object - int in range of enum
        obj = 6;
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);

        //Object - int out of enum range
        obj = 15;
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::OUT_OF_RANGE, resultType);
    }
    /**
     * Test apply and unapply EnumSchemaItem
     **/
    TEST_F(EnumSchemaItemTest, test_apply_unapply_schema)
    {
        SmartObject obj;

        ISchemaItemPtr item = TEnumSchemaItem<TestType::eType>::create(testEnum,
            TSchemaItemParameter<TestType::eType>(TestType::FACTORY_DEFAULTS));

        //Object - valid enum
        obj = TestType::BLUETOOTH_OFF;
        int resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);
        bool resDefault = item->setDefaultValue(obj);
        EXPECT_TRUE(resDefault);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());

        item->unapplySchema(obj);
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);
        EXPECT_EQ(std::string("FACTORY_DEFAULTS"), obj.asString());

        item->applySchema(obj);
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);
        EXPECT_EQ(TestType::FACTORY_DEFAULTS, obj.asInt());

        obj = "TOO_MANY_REQUESTS";
        item->applySchema(obj);
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::OK, resultType);
        EXPECT_EQ(TestType::TOO_MANY_REQUESTS, obj.asInt());

        obj = "ENOUGH_REQUESTS";
        item->applySchema(obj);
        resultType = item->validate(obj);
        EXPECT_EQ(Errors::INVALID_VALUE, resultType);
        EXPECT_EQ(std::string("ENOUGH_REQUESTS"), obj.asString());
    }