You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2022/10/20 09:03:51 UTC

[avro] 01/02: AVRO-3646: Add unit tests for deserializing Value to Enum with different variants

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch avro-3646-serde-for-enum-mixed-variants
in repository https://gitbox.apache.org/repos/asf/avro.git

commit 243696c37bcc4a5575af8bb84e7924c12ca03e59
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Thu Oct 20 11:57:38 2022 +0300

    AVRO-3646: Add unit tests for deserializing Value to Enum with different variants
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
 lang/rust/avro/src/de.rs  | 89 +++++++++++++++++++++++++++++++++--------------
 lang/rust/avro/src/ser.rs | 27 +++++++++++---
 2 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/lang/rust/avro/src/de.rs b/lang/rust/avro/src/de.rs
index 1d3b50360..db948b855 100644
--- a/lang/rust/avro/src/de.rs
+++ b/lang/rust/avro/src/de.rs
@@ -662,17 +662,6 @@ mod tests {
         Val2,
     }
 
-    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
-    struct TestNullExternalEnum {
-        a: NullExternalEnum,
-    }
-
-    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
-    enum NullExternalEnum {
-        Val1(()),
-        Val2(u64),
-    }
-
     #[derive(Debug, Serialize, Deserialize, PartialEq)]
     struct TestSingleValueExternalEnum {
         a: SingleValueExternalEnum,
@@ -786,23 +775,69 @@ mod tests {
     }
 
     #[test]
-    fn test_from_value_null_enum() {
-        let expected = TestNullExternalEnum {
-            a: NullExternalEnum::Val1(()),
-        };
+    fn avro_3645_3646_test_from_value_enum() {
+        #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
+        struct TestNullExternalEnum {
+            a: NullExternalEnum,
+        }
 
-        let test = Value::Record(vec![(
-            "a".to_owned(),
-            Value::Record(vec![
-                ("type".to_owned(), Value::String("Val1".to_owned())),
-                ("value".to_owned(), Value::Union(0, Box::new(Value::Null))),
-            ]),
-        )]);
-        let final_value: TestNullExternalEnum = from_value(&test).unwrap();
-        assert_eq!(
-            final_value, expected,
-            "Error deserializing null external enum"
-        );
+        #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
+        enum NullExternalEnum {
+            Val1,
+            Val2(),
+            Val3(()),
+            Val4(u64),
+        }
+
+        let data = vec![
+            (
+                TestNullExternalEnum {
+                    a: NullExternalEnum::Val1,
+                },
+                Value::Record(vec![("a".to_owned(), Value::Enum(0, "Val1".to_owned()))]),
+            ),
+            (
+                TestNullExternalEnum {
+                    a: NullExternalEnum::Val2(),
+                },
+                Value::Record(vec![(
+                    "a".to_owned(),
+                    Value::Record(vec![
+                        ("type".to_owned(), Value::Enum(1, "Val2".to_owned())),
+                        ("value".to_owned(), Value::Array(vec![])),
+                    ]),
+                )]),
+            ),
+            (
+                TestNullExternalEnum {
+                    a: NullExternalEnum::Val3(()),
+                },
+                Value::Record(vec![(
+                    "a".to_owned(),
+                    Value::Record(vec![
+                        ("type".to_owned(), Value::Enum(2, "Val3".to_owned())),
+                        ("value".to_owned(), Value::Union(2, Box::new(Value::Null))),
+                    ]),
+                )]),
+            ),
+            (
+                TestNullExternalEnum {
+                    a: NullExternalEnum::Val4(123),
+                },
+                Value::Record(vec![(
+                    "a".to_owned(),
+                    Value::Record(vec![
+                        ("type".to_owned(), Value::Enum(3, "Val4".to_owned())),
+                        ("value".to_owned(), Value::Union(3, Value::Long(123).into())),
+                    ]),
+                )]),
+            ),
+        ];
+
+        for (expected, test) in data.iter() {
+            let actual: TestNullExternalEnum = from_value(test).unwrap();
+            assert_eq!(actual, *expected);
+        }
     }
 
     #[test]
diff --git a/lang/rust/avro/src/ser.rs b/lang/rust/avro/src/ser.rs
index 16f56d703..7f3a551f1 100644
--- a/lang/rust/avro/src/ser.rs
+++ b/lang/rust/avro/src/ser.rs
@@ -1000,7 +1000,7 @@ mod tests {
     }
 
     #[test]
-    fn avro_3646_test_to_value_null_enum() {
+    fn avro_3646_test_to_value_enum() {
         #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
         struct TestNullExternalEnum2 {
             a: NullExternalEnum2,
@@ -1010,7 +1010,8 @@ mod tests {
         enum NullExternalEnum2 {
             Val1,
             Val2(),
-            Val3(u64),
+            Val3(()),
+            Val4(u64),
         }
 
         let test_val1 = TestNullExternalEnum2 {
@@ -1045,14 +1046,14 @@ mod tests {
         );
 
         let test_val3 = TestNullExternalEnum2 {
-            a: NullExternalEnum2::Val3(123),
+            a: NullExternalEnum2::Val3(()),
         };
 
         let expected_val3 = Value::Record(vec![(
             "a".to_owned(),
             Value::Record(vec![
                 ("type".to_owned(), Value::Enum(2, "Val3".to_owned())),
-                ("value".to_owned(), Value::Union(2, Value::Long(123).into())),
+                ("value".to_owned(), Value::Union(2, Value::Null.into())),
             ]),
         )]);
 
@@ -1061,5 +1062,23 @@ mod tests {
             actual_val3, expected_val3,
             "error serializing null external enum, val3"
         );
+
+        let test_val4 = TestNullExternalEnum2 {
+            a: NullExternalEnum2::Val4(123),
+        };
+
+        let expected_val4 = Value::Record(vec![(
+            "a".to_owned(),
+            Value::Record(vec![
+                ("type".to_owned(), Value::Enum(3, "Val4".to_owned())),
+                ("value".to_owned(), Value::Union(3, Value::Long(123).into())),
+            ]),
+        )]);
+
+        let actual_val4 = to_value(test_val4).unwrap();
+        assert_eq!(
+            actual_val4, expected_val4,
+            "error serializing null external enum, val4"
+        );
     }
 }