summaryrefslogtreecommitdiffstats
path: root/rust/vendor/bendy/tests/struct_codec.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/vendor/bendy/tests/struct_codec.rs')
-rw-r--r--rust/vendor/bendy/tests/struct_codec.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/rust/vendor/bendy/tests/struct_codec.rs b/rust/vendor/bendy/tests/struct_codec.rs
new file mode 100644
index 0000000..2769545
--- /dev/null
+++ b/rust/vendor/bendy/tests/struct_codec.rs
@@ -0,0 +1,89 @@
+use bendy::{
+ decoding::{Error as DecodingError, FromBencode, Object},
+ encoding::{Error as EncodingError, SingleItemEncoder, ToBencode},
+};
+
+#[derive(PartialEq, Eq, Debug)]
+struct Example {
+ foo: Vec<i64>,
+ bar: i64,
+}
+
+impl ToBencode for Example {
+ const MAX_DEPTH: usize = 2;
+
+ fn encode(&self, encoder: SingleItemEncoder) -> Result<(), EncodingError> {
+ encoder.emit_dict(|mut dict| {
+ dict.emit_pair(b"bar", &self.bar)?;
+ dict.emit_pair(b"foo", &self.foo)
+ })
+ }
+}
+
+impl FromBencode for Example {
+ const EXPECTED_RECURSION_DEPTH: usize = 2;
+
+ fn decode_bencode_object(object: Object) -> Result<Self, DecodingError>
+ where
+ Self: Sized,
+ {
+ let mut foo = None;
+ let mut bar = None;
+
+ let mut dict = object.try_into_dictionary()?;
+ while let Some((key, value)) = dict.next_pair()? {
+ match key {
+ b"foo" => {
+ foo = Vec::decode_bencode_object(value).map(Some)?;
+ },
+ b"bar" => {
+ bar = i64::decode_bencode_object(value).map(Some)?;
+ },
+ _ => (), // ignore unknown keys
+ }
+ }
+
+ Ok(Example {
+ foo: foo.ok_or_else(|| DecodingError::missing_field("foo"))?,
+ bar: bar.ok_or_else(|| DecodingError::missing_field("bar"))?,
+ })
+ }
+}
+
+#[test]
+fn should_encode_struct() {
+ let example = Example {
+ foo: vec![2, 3],
+ bar: 1,
+ };
+ let encoded = example.to_bencode().expect("example encoding is broken");
+
+ assert_eq!(encoded, b"d3:bari1e3:fooli2ei3eee".to_vec(),)
+}
+
+#[test]
+fn should_decode_struct() {
+ let encoded = b"d3:bari1e3:fooli2ei3eee".to_vec();
+ let example = Example::from_bencode(&encoded).expect("example decoding is broken");
+
+ assert_eq!(
+ example,
+ Example {
+ foo: vec![2, 3],
+ bar: 1,
+ }
+ )
+}
+
+#[test]
+fn validate_round_trip() {
+ let example = Example {
+ foo: vec![2, 3],
+ bar: 1,
+ };
+
+ let encoded = example.to_bencode().expect("example encoding is broken");
+ let decoded = Example::from_bencode(&encoded).expect("example decoding is broken");
+
+ assert_eq!(example, decoded);
+}