THRIFT-5443: add support for partial Thrift deserialization
Client: java
Patch: Bhalchandra Pandit

This closes #2439
diff --git a/test/partial/thrift_test_schema.thrift b/test/partial/thrift_test_schema.thrift
new file mode 100644
index 0000000..311bd68
--- /dev/null
+++ b/test/partial/thrift_test_schema.thrift
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace java org.apache.thrift.partial
+
+// This thrift file is meant for testing partial deserialization.
+// It includes all field types and most combinations of complex types.
+// Those fields help ensure correctness of partial deserialization.
+
+enum TstEnum {
+    UNKNOWN = 0,
+    E_ONE = 1,
+    E_TWO = 2
+}
+
+struct SmallStruct {
+    // Primitive fields
+    1: optional byte byteField;
+    2: optional i16 i16Field;
+    3: optional i32 i32Field;
+    4: optional i64 i64Field;
+    5: optional double doubleField;
+    6: optional string stringField;
+
+    // Enum
+    7: optional TstEnum enumField;
+}
+
+// TODO(kpandit): Need to add bool field
+struct TestStruct {
+    // Primitive fields
+    1: optional byte byteField;
+    2: optional i16 i16Field;
+    3: optional i32 i32Field;
+    4: optional i64 i64Field;
+    5: optional double doubleField;
+    6: optional string stringField;
+
+    // Enum
+    7: optional TstEnum enumField;
+
+    8: optional binary binaryField;
+
+    // List
+    10: optional list<byte> byteList;
+    11: optional list<i16> i16List;
+    12: optional list<i32> i32List;
+    13: optional list<i64> i64List;
+    14: optional list<double> doubleList;
+    15: optional list<string> stringList;
+    16: optional list<TstEnum> enumList;
+    17: optional list<list<i32>> listList;
+    18: optional list<set<i32>> setList;
+    19: optional list<map<string, i32>> mapList;
+    20: optional list<SmallStruct> structList;
+    21: optional list<binary> binaryList;
+
+    // Set
+    30: optional set<byte> byteSet;
+    31: optional set<i16> i16Set;
+    32: optional set<i32> i32Set;
+    33: optional set<i64> i64Set;
+    34: optional set<double> doubleSet;
+    35: optional set<string> stringSet;
+    36: optional set<TstEnum> enumSet;
+    37: optional set<list<i32>> listSet (nolint = "set.value.type");
+    38: optional set<set<i32>> setSet (nolint = "set.value.type");
+    39: optional set<map<string, i32>> mapSet (nolint = "set.value.type");
+    40: optional set<SmallStruct> structSet (nolint = "set.value.type");
+    41: optional set<binary> binarySet;
+
+    // Map
+    50: optional map<byte, byte> byteMap;
+    51: optional map<i16, i16> i16Map;
+    52: optional map<i32, i32> i32Map;
+    53: optional map<i64, i64> i64Map;
+    54: optional map<double, double> doubleMap;
+    55: optional map<string, string> stringMap;
+    56: optional map<TstEnum, TstEnum> enumMap;
+    57: optional map<i32, list<i32>> listMap;
+    58: optional map<i32, set<i32>> setMap;
+    59: optional map<i32, map<i32, i32>> mapMap;
+    60: optional map<SmallStruct, SmallStruct> structMap (nolint = "map.key.type");
+    61: optional map<i32, binary> binaryMap;
+
+    70: optional SmallStruct structField;
+}
+
+struct InnermostStruct {
+  1: optional string value;
+  2: optional i32 intValue;
+}
+
+struct InnerStruct {
+  1: optional InnermostStruct value;
+  2: optional i32 intValue;
+}
+
+struct OuterStruct {
+  1: optional InnerStruct value;
+  2: optional map<string, InnerStruct> structMap;
+}
+
+union SimpleUnion {
+  1: optional i32 intValue;
+  2: optional string stringValue;
+}
+
+struct StructWithUnions {
+  1: optional i32 intValue;
+  2: optional SmallStruct smallStruct;
+  3: optional SimpleUnion simpleUnion;
+  4: optional list<SimpleUnion> unionList;
+  5: optional set<SimpleUnion> unionSet (nolint = "set.value.type");
+  6: optional map<SimpleUnion, string> keyUnionMap (nolint = "map.key.type");
+  7: optional map<string, SimpleUnion> valUnionMap;
+  8: optional map<SimpleUnion, SimpleUnion> unionMap (nolint = "map.key.type");
+}