use multi_base::Base;
use multi_codec::Codec;
use multi_hash::{Builder, Multihash};
use multi_trait::TryDecodeFrom;
use multi_util::{CodecInfo, EncodingInfo};
#[test]
fn test_multicodec_integration() {
use multi_hash::HASH_CODECS;
for &codec in HASH_CODECS.iter() {
let code = codec.code();
let name = codec.as_str();
assert!(code > 0);
assert!(!name.is_empty());
}
}
#[test]
fn test_multibase_integration() {
let bases = vec![
Base::Base16Lower,
Base::Base32Lower,
Base::Base58Btc,
Base::Base64,
];
for base in bases {
let encoded = Builder::new_from_bytes(Codec::Sha2256, b"test data")
.unwrap()
.with_base_encoding(base)
.try_build_encoded()
.unwrap();
let s = encoded.to_string();
assert!(!s.is_empty());
assert_eq!(encoded.encoding(), base);
}
}
#[test]
fn test_multitrait_integration() {
let mh1 = Builder::new_from_bytes(Codec::Sha3256, b"multitrait test")
.unwrap()
.try_build()
.unwrap();
let bytes: Vec<u8> = mh1.clone().into();
let (mh2, remaining) = Multihash::try_decode_from(&bytes).unwrap();
assert_eq!(mh1, mh2);
assert!(remaining.is_empty());
}
#[test]
fn test_multiutil_integration() {
let mh = Builder::new_from_bytes(Codec::Blake3, b"multiutil test")
.unwrap()
.try_build()
.unwrap();
assert_eq!(mh.codec(), Codec::Blake3);
assert_eq!(Multihash::preferred_codec(), Codec::Multihash);
assert_eq!(mh.encoding(), Base::Base16Lower);
assert_eq!(Multihash::preferred_encoding(), Base::Base16Lower);
}
#[test]
fn test_encoded_multihash_type() {
use multi_hash::EncodedMultihash;
let encoded = Builder::new_from_bytes(Codec::Sha2512, b"encoded test")
.unwrap()
.with_base_encoding(Base::Base64)
.try_build_encoded()
.unwrap();
let _: &EncodedMultihash = &encoded;
assert_eq!(encoded.encoding(), Base::Base64);
}
#[test]
fn test_in_collections() {
use std::collections::BTreeMap;
let mh1 = Builder::new_from_bytes(Codec::Sha2256, b"key1")
.unwrap()
.try_build()
.unwrap();
let mh2 = Builder::new_from_bytes(Codec::Sha2256, b"key2")
.unwrap()
.try_build()
.unwrap();
let mut btree = BTreeMap::new();
btree.insert(mh1.clone(), "value1");
btree.insert(mh2.clone(), "value2");
assert_eq!(btree.len(), 2);
let vec = [mh1.clone(), mh2.clone()];
assert_eq!(vec.len(), 2);
}
#[test]
fn test_builder_fluent_api() {
let result = Builder::new(Codec::Sha3384)
.with_hash(vec![0u8; 48])
.with_base_encoding(Base::Base58Btc)
.try_build_encoded();
assert!(result.is_ok());
}
#[test]
fn test_full_workspace_integration() {
let codec = Codec::Sha2256; let base = Base::Base32Lower;
let mh = Builder::new_from_bytes(codec, b"integration")
.unwrap()
.try_build()
.unwrap();
assert_eq!(mh.codec(), codec);
assert_eq!(mh.encoding(), Base::Base16Lower);
let encoded = Builder::new_from_bytes(codec, b"integration")
.unwrap()
.with_base_encoding(base)
.try_build_encoded()
.unwrap();
assert_eq!(encoded.encoding(), base);
let s = encoded.to_string();
assert!(!s.is_empty());
}
#[cfg(feature = "serde")]
mod serde_integration {
use super::*;
use serde::{Deserialize, Serialize};
#[test]
fn test_multihash_in_struct() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Document {
hash: Multihash,
timestamp: u64,
}
let doc = Document {
hash: Builder::new_from_bytes(Codec::Sha2256, b"document")
.unwrap()
.try_build()
.unwrap(),
timestamp: 1234567890,
};
let json = serde_json::to_string(&doc).unwrap();
let decoded: Document = serde_json::from_str(&json).unwrap();
assert_eq!(doc, decoded);
let cbor = serde_cbor::to_vec(&doc).unwrap();
let decoded: Document = serde_cbor::from_slice(&cbor).unwrap();
assert_eq!(doc, decoded);
}
}