libipld-core 0.16.0

Base traits and definitions used by ipld codecs.
Documentation
#![cfg(feature = "serde-codec")]

extern crate alloc;

use alloc::collections::BTreeMap;
use core::convert::TryFrom;

use serde_test::{assert_de_tokens, Token};

use libipld_core::cid::{serde::CID_SERDE_PRIVATE_IDENTIFIER, Cid};
use libipld_core::ipld::Ipld;

#[test]
fn ipld_deserialize_null() {
    let ipld = Ipld::Null;
    assert_de_tokens(&ipld, &[Token::None]);
}

#[test]
#[should_panic(expected = "invalid type")]
fn ipld_deserialize_null_not_as_unit() {
    let ipld = Ipld::Null;
    assert_de_tokens(&ipld, &[Token::Unit]);
}

#[test]
#[should_panic(expected = "invalid type")]
fn ipld_deserialize_null_not_as_unit_struct() {
    let ipld = Ipld::Null;
    assert_de_tokens(&ipld, &[Token::UnitStruct { name: "foo" }]);
}

#[test]
fn ipld_deserialize_bool() {
    let bool = true;
    let ipld = Ipld::Bool(bool);
    assert_de_tokens(&ipld, &[Token::Bool(bool)]);
}

#[test]
fn ipld_deserialize_integer_u() {
    let integer = 32u8;
    let ipld = Ipld::Integer(integer.into());
    assert_de_tokens(&ipld, &[Token::U8(integer)]);
    assert_de_tokens(&ipld, &[Token::U16(integer.into())]);
    assert_de_tokens(&ipld, &[Token::U32(integer.into())]);
    assert_de_tokens(&ipld, &[Token::U64(integer.into())]);
}

#[test]
fn ipld_deserialize_integer_i() {
    let integer = -32i8;
    let ipld = Ipld::Integer(integer.into());
    assert_de_tokens(&ipld, &[Token::I8(integer)]);
    assert_de_tokens(&ipld, &[Token::I16(integer.into())]);
    assert_de_tokens(&ipld, &[Token::I32(integer.into())]);
    assert_de_tokens(&ipld, &[Token::I64(integer.into())]);
}

#[test]
fn ipld_deserialize_float() {
    let float = 32.41f32;
    let ipld = Ipld::Float(float.into());
    assert_de_tokens(&ipld, &[Token::F32(float)]);
    assert_de_tokens(&ipld, &[Token::F64(float.into())]);
}

#[test]
fn ipld_deserialize_string() {
    let string = "hello";
    let ipld = Ipld::String(string.into());
    assert_de_tokens(&ipld, &[Token::Str(string)]);
    assert_de_tokens(&ipld, &[Token::BorrowedStr(string)]);
    assert_de_tokens(&ipld, &[Token::String(string)]);
}

#[test]
fn ipld_deserialize_string_char() {
    let char = 'h';
    let ipld = Ipld::String(char.into());
    assert_de_tokens(&ipld, &[Token::Char(char)]);
}

#[test]
fn ipld_deserialize_bytes() {
    let bytes = vec![0x68, 0x65, 0x6c, 0x6c, 0x6f];
    let ipld = Ipld::Bytes(bytes);
    assert_de_tokens(&ipld, &[Token::Bytes(b"hello")]);
    assert_de_tokens(&ipld, &[Token::BorrowedBytes(b"hello")]);
    assert_de_tokens(&ipld, &[Token::ByteBuf(b"hello")]);
}

#[test]
fn ipld_deserialize_list() {
    let ipld = Ipld::List(vec![Ipld::Bool(false), Ipld::Float(22.7)]);
    assert_de_tokens(
        &ipld,
        &[
            Token::Seq { len: Some(2) },
            Token::Bool(false),
            Token::F64(22.7),
            Token::SeqEnd,
        ],
    );
}

#[test]
fn ipld_deserialize_map() {
    let ipld = Ipld::Map(BTreeMap::from([
        ("hello".to_string(), Ipld::Bool(true)),
        ("world!".to_string(), Ipld::Bool(false)),
    ]));
    assert_de_tokens(
        &ipld,
        &[
            Token::Map { len: Some(2) },
            Token::Str("hello"),
            Token::Bool(true),
            Token::Str("world!"),
            Token::Bool(false),
            Token::MapEnd,
        ],
    );
}

#[test]
fn ipld_deserialize_link() {
    let cid = Cid::try_from("bafkreie74tgmnxqwojhtumgh5dzfj46gi4mynlfr7dmm7duwzyvnpw7h7m").unwrap();
    let ipld = Ipld::Link(cid);
    assert_de_tokens(
        &ipld,
        &[
            Token::NewtypeStruct {
                name: CID_SERDE_PRIVATE_IDENTIFIER,
            },
            Token::Bytes(&[
                1, 85, 18, 32, 159, 228, 204, 198, 222, 22, 114, 79, 58, 48, 199, 232, 242, 84,
                243, 198, 71, 25, 134, 172, 177, 248, 216, 207, 142, 150, 206, 42, 215, 219, 231,
                251,
            ]),
        ],
    );
}

#[test]
#[should_panic(expected = "assertion failed")]
fn ipld_deserialize_link_not_as_bytes() {
    let cid = Cid::try_from("bafkreie74tgmnxqwojhtumgh5dzfj46gi4mynlfr7dmm7duwzyvnpw7h7m").unwrap();
    let ipld = Ipld::Link(cid);
    assert_de_tokens(
        &ipld,
        &[Token::Bytes(&[
            1, 85, 18, 32, 159, 228, 204, 198, 222, 22, 114, 79, 58, 48, 199, 232, 242, 84, 243,
            198, 71, 25, 134, 172, 177, 248, 216, 207, 142, 150, 206, 42, 215, 219, 231, 251,
        ])],
    );
}