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"
+ );
}
}