Browse Source

Implement enum types json deserialization

- Implement enum/enum list types deserialization
- Add test
Alexey Edelev 4 years ago
parent
commit
d2960e1703

+ 6 - 6
src/protobuf/qprotobufjsonserializer.cpp

@@ -389,14 +389,14 @@ QByteArray QProtobufJsonSerializer::serializeEnumList(const QList<int64> &values
 
 void QProtobufJsonSerializer::deserializeEnum(int64 &value, const QMetaEnum &metaEnum, QProtobufSelfcheckIterator &it) const
 {
-    Q_UNUSED(value)
-    Q_UNUSED(metaEnum)
-    Q_UNUSED(it)
+    value = metaEnum.keyToValue(it.data());
 }
 
 void QProtobufJsonSerializer::deserializeEnumList(QList<int64> &value, const QMetaEnum &metaEnum, QProtobufSelfcheckIterator &it) const
 {
-    Q_UNUSED(value)
-    Q_UNUSED(metaEnum)
-    Q_UNUSED(it)
+    auto arrayValues = microjson::parseJsonArray(it.data(), static_cast<size_t>(it.size()));
+
+    for (auto &arrayValue : arrayValues) {
+        value.append(metaEnum.keyToValue(arrayValue.value.c_str()));
+    }
 }

+ 22 - 26
tests/test_protobuf/jsondeserializationtest.cpp

@@ -388,6 +388,28 @@ TEST_F(JsonDeserializationTest, BoolMessageSerializeTest)
     EXPECT_FALSE(test.testFieldBool());
 }
 
+TEST_F(JsonDeserializationTest, SimpleEnumMessageSerializeTest)
+{
+    SimpleEnumMessage test;
+    test.deserialize(serializer.get(), "{\"localEnum\":\"LOCAL_ENUM_VALUE2\"}");
+    EXPECT_EQ(test.localEnum(), SimpleEnumMessage::LOCAL_ENUM_VALUE2);
+}
+
+
+TEST_F(JsonDeserializationTest, SimpleEnumListMessageTest)
+{
+    SimpleEnumListMessage test;
+    test.deserialize(serializer.get(), "{\"localEnumList\":[\"LOCAL_ENUM_VALUE0\",\"LOCAL_ENUM_VALUE1\",\"LOCAL_ENUM_VALUE2\",\"LOCAL_ENUM_VALUE1\",\"LOCAL_ENUM_VALUE2\",\"LOCAL_ENUM_VALUE3\"]}");
+    EXPECT_TRUE(test.localEnumList() == SimpleEnumListMessage::LocalEnumRepeated({SimpleEnumListMessage::LOCAL_ENUM_VALUE0,
+                                       SimpleEnumListMessage::LOCAL_ENUM_VALUE1,
+                                       SimpleEnumListMessage::LOCAL_ENUM_VALUE2,
+                                       SimpleEnumListMessage::LOCAL_ENUM_VALUE1,
+                                       SimpleEnumListMessage::LOCAL_ENUM_VALUE2,
+                                       SimpleEnumListMessage::LOCAL_ENUM_VALUE3}));
+    test.deserialize(serializer.get(), "{\"localEnumList\":[]}");
+    EXPECT_TRUE(test.localEnumList().isEmpty());
+}
+
 //TEST_F(JsonDeserializationTest, RepeatedComplexMessageTest)
 //{
 //    SimpleStringMessage stringMsg;
@@ -406,32 +428,6 @@ TEST_F(JsonDeserializationTest, BoolMessageSerializeTest)
 //    EXPECT_STREQ(QString::fromUtf8(result).toStdString().c_str(), "{\"testRepeatedComplex\":[]}");
 //}
 
-//TEST_F(JsonDeserializationTest, SimpleEnumMessageSerializeTest)
-//{
-//    SimpleEnumMessage test;
-//    test.setLocalEnum(SimpleEnumMessage::LOCAL_ENUM_VALUE2);
-//    QByteArray result = test.serialize(serializer.get());
-//    EXPECT_STREQ(QString::fromUtf8(result).toStdString().c_str(), "{\"localEnum\":\"LOCAL_ENUM_VALUE2\"}");
-//}
-
-
-//TEST_F(JsonDeserializationTest, SimpleEnumListMessageTest)
-//{
-//    SimpleEnumListMessage msg;
-
-//    msg.setLocalEnumList({SimpleEnumListMessage::LOCAL_ENUM_VALUE0,
-//                          SimpleEnumListMessage::LOCAL_ENUM_VALUE1,
-//                          SimpleEnumListMessage::LOCAL_ENUM_VALUE2,
-//                          SimpleEnumListMessage::LOCAL_ENUM_VALUE1,
-//                          SimpleEnumListMessage::LOCAL_ENUM_VALUE2,
-//                          SimpleEnumListMessage::LOCAL_ENUM_VALUE3});
-//    QByteArray result = msg.serialize(serializer.get());
-//    EXPECT_STREQ(QString::fromUtf8(result).toStdString().c_str(), "{\"localEnumList\":[\"LOCAL_ENUM_VALUE0\",\"LOCAL_ENUM_VALUE1\",\"LOCAL_ENUM_VALUE2\",\"LOCAL_ENUM_VALUE1\",\"LOCAL_ENUM_VALUE2\",\"LOCAL_ENUM_VALUE3\"]}");
-//    msg.setLocalEnumList({});
-//    result = msg.serialize(serializer.get());
-//    EXPECT_STREQ(QString::fromUtf8(result).toStdString().c_str(), "{\"localEnumList\":[]}");
-//}
-
 //TEST_F(JsonDeserializationTest, SimpleFixed32StringMapSerializeTest)
 //{
 //    SimpleFixed32StringMapMessage test;