Skip to content

Commit 5619abe

Browse files
author
Кирилл Безуглый
committed
test: add tests for untagged attribute
1 parent e60d0d8 commit 5619abe

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

tarantool/src/msgpack/encode.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,75 @@ mod tests {
18611861
assert_eq!(original, decoded);
18621862
}
18631863

1864+
#[test]
1865+
fn encode_enum_untagged() {
1866+
#[derive(Clone, Encode, Decode, PartialEq, Debug)]
1867+
#[encode(tarantool = "crate", untagged)]
1868+
enum Foo {
1869+
BarUnit,
1870+
BarTuple1(bool),
1871+
BarStruct2 { bar1: bool, bar2: String },
1872+
BarTupleN(usize, [u8; 3], Box<Foo>),
1873+
}
1874+
1875+
// unit variant - encode (ok), decode as array (ok), decode as map (ok)
1876+
let original = Foo::BarUnit;
1877+
let bytes = encode(&original);
1878+
assert_value(&bytes, Value::Nil);
1879+
let decoded_arr = Foo::decode(&mut bytes.as_slice(), ARR_CTX).unwrap();
1880+
assert_eq!(decoded_arr, original);
1881+
let decoded_map = Foo::decode(&mut bytes.as_slice(), MAP_CTX).unwrap();
1882+
assert_eq!(decoded_map, original);
1883+
1884+
// single field unnamed variant - encode (ok), decode as array (ok), decode as map (ok)
1885+
let original = Foo::BarTuple1(true);
1886+
let bytes = encode(&original);
1887+
assert_value(&bytes, Value::Array(vec![Value::from(true)]));
1888+
let decoded_arr = Foo::decode(&mut bytes.as_slice(), ARR_CTX).unwrap();
1889+
assert_eq!(decoded_arr, original);
1890+
let decoded_map = Foo::decode(&mut bytes.as_slice(), MAP_CTX).unwrap();
1891+
assert_eq!(decoded_map, original);
1892+
1893+
// multi field named variant - encode (ok), decode as array (ok), decode as map (ok)
1894+
let original = Foo::BarStruct2 {
1895+
bar1: false,
1896+
bar2: "welcome".to_owned(),
1897+
};
1898+
let bytes = encode(&original);
1899+
assert_value(
1900+
&bytes,
1901+
Value::Array(vec![Value::from(false), Value::from("welcome")]),
1902+
);
1903+
let decoded_arr = Foo::decode(&mut bytes.as_slice(), ARR_CTX).unwrap();
1904+
assert_eq!(decoded_arr, original);
1905+
let decoded_map = Foo::decode(&mut bytes.as_slice(), MAP_CTX).unwrap();
1906+
assert_eq!(decoded_map, original);
1907+
1908+
// complex self-referencing multi field variant - encode (ok), decode as array (ok), decode as map (ok)
1909+
let original = Foo::BarTupleN(52, [37, 13, 42], Box::new(Foo::BarTuple1(true)));
1910+
let bytes = encode(&original);
1911+
assert_value(
1912+
&bytes,
1913+
Value::Array(vec![
1914+
Value::from(52),
1915+
Value::Array(vec![Value::from(37), Value::from(13), Value::from(42)]),
1916+
Value::Array(vec![Value::from(true)]),
1917+
]),
1918+
);
1919+
let decoded_arr = Foo::decode(&mut bytes.as_slice(), ARR_CTX).unwrap();
1920+
assert_eq!(decoded_arr, original);
1921+
let decoded_map = Foo::decode(&mut bytes.as_slice(), MAP_CTX).unwrap();
1922+
assert_eq!(decoded_map, original);
1923+
1924+
// variant mismatch from valid msgpack bytes - decode as array (err), decode as map (err)
1925+
let mut bytes = Vec::new();
1926+
rmp::encode::write_str(&mut bytes, "0xDEADBEEF").unwrap();
1927+
let err = Foo::decode(&mut bytes.as_slice(), ARR_CTX).unwrap_err();
1928+
assert_eq!(err.to_string(), "failed decoding tarantool::msgpack::encode::tests::encode_enum_untagged::Foo: received stream didn't match any enum variant");
1929+
let err = Foo::decode(&mut bytes.as_slice(), MAP_CTX).unwrap_err();
1930+
assert_eq!(err.to_string(), "failed decoding tarantool::msgpack::encode::tests::encode_enum_untagged::Foo: received stream didn't match any enum variant");
1931+
}
1932+
18641933
#[test]
18651934
fn encode_named_with_raw_ident() {
18661935
#[derive(Clone, Encode, Decode, PartialEq, Debug)]

0 commit comments

Comments
 (0)