use multi_codec::Codec;
use multi_trait::{Null, TryDecodeFrom};
#[test]
fn test_identity_codec() {
let codec = Codec::try_from(0x00u64).unwrap();
assert_eq!(codec, Codec::Identity);
assert_eq!(codec.code(), 0x00);
assert_eq!(codec.as_str(), "identity");
assert_eq!(codec, Codec::default());
assert_eq!(codec, Codec::null());
assert!(codec.is_null());
}
#[test]
fn test_maximum_codec_values() {
let result = Codec::try_from(u64::MAX);
assert!(result.is_err());
let result = Codec::try_from(0xFFFFFFFFu64);
assert!(result.is_err());
}
#[test]
fn test_minimum_unsigned_values() {
assert!(Codec::try_from(0u8).is_ok());
assert!(Codec::try_from(0u16).is_ok());
assert!(Codec::try_from(0u32).is_ok());
assert!(Codec::try_from(0u64).is_ok());
}
#[test]
fn test_maximum_small_unsigned_values() {
let _ = Codec::try_from(u8::MAX); let _ = Codec::try_from(u16::MAX); let _ = Codec::try_from(u32::MAX); }
#[test]
fn test_zero_signed_values() {
assert_eq!(Codec::try_from(0i8).unwrap(), Codec::Identity);
assert_eq!(Codec::try_from(0i16).unwrap(), Codec::Identity);
assert_eq!(Codec::try_from(0i32).unwrap(), Codec::Identity);
assert_eq!(Codec::try_from(0i64).unwrap(), Codec::Identity);
}
#[test]
fn test_minimum_signed_values() {
assert!(Codec::try_from(i8::MIN).is_err());
assert!(Codec::try_from(i16::MIN).is_err());
assert!(Codec::try_from(i32::MIN).is_err());
assert!(Codec::try_from(i64::MIN).is_err());
}
#[test]
fn test_maximum_signed_values() {
let _ = Codec::try_from(i8::MAX); let _ = Codec::try_from(i16::MAX); let _ = Codec::try_from(i32::MAX); let _ = Codec::try_from(i64::MAX); }
#[test]
fn test_empty_string() {
let result = Codec::try_from("");
assert!(result.is_err());
}
#[test]
fn test_whitespace_strings() {
assert!(Codec::try_from(" ").is_err());
assert!(Codec::try_from(" ").is_err());
assert!(Codec::try_from("\t").is_err());
assert!(Codec::try_from("\n").is_err());
}
#[test]
fn test_case_sensitivity() {
assert!(Codec::try_from("ed25519-pub").is_ok());
assert!(Codec::try_from("ED25519-PUB").is_err());
assert!(Codec::try_from("Ed25519-Pub").is_err());
assert!(Codec::try_from("Ed25519-pub").is_err());
}
#[test]
fn test_special_characters() {
assert!(Codec::try_from("ed25519-pub").is_ok());
assert!(Codec::try_from("ed25519_pub").is_err());
assert!(Codec::try_from("ed25519.pub").is_err());
assert!(Codec::try_from("ed25519/pub").is_err());
}
#[test]
fn test_identity_encoding() {
let codec = Codec::Identity;
let encoded: Vec<u8> = codec.into();
assert_eq!(encoded, vec![0x00]);
let (decoded, remaining) = Codec::try_decode_from(&encoded).unwrap();
assert_eq!(decoded, Codec::Identity);
assert!(remaining.is_empty());
}
#[test]
fn test_decode_exact_length() {
let codec = Codec::Ed25519Pub;
let encoded: Vec<u8> = codec.into();
let (decoded, remaining) = Codec::try_decode_from(&encoded).unwrap();
assert_eq!(decoded, codec);
assert!(remaining.is_empty());
assert_eq!(remaining.len(), 0);
}
#[test]
fn test_decode_with_trailing() {
let codec = Codec::Ed25519Pub;
let mut encoded: Vec<u8> = codec.into();
encoded.extend_from_slice(&[0xAA, 0xBB, 0xCC]);
let (decoded, remaining) = Codec::try_decode_from(&encoded).unwrap();
assert_eq!(decoded, codec);
assert_eq!(remaining, &[0xAA, 0xBB, 0xCC]);
assert_eq!(remaining.len(), 3);
}
#[test]
fn test_null_trait() {
let null_codec = Codec::null();
assert_eq!(null_codec, Codec::Identity);
assert!(null_codec.is_null());
let other = Codec::Ed25519Pub;
assert!(!other.is_null());
}
#[test]
fn test_default_trait() {
let default_codec = Codec::default();
assert_eq!(default_codec, Codec::Identity);
assert_eq!(default_codec, Codec::null());
}
#[test]
fn test_equality_reflexive() {
let codec = Codec::Ed25519Pub;
assert_eq!(codec, codec);
}
#[test]
fn test_equality_symmetric() {
let c1 = Codec::Ed25519Pub;
let c2 = Codec::Ed25519Pub;
assert_eq!(c1, c2);
assert_eq!(c2, c1);
}
#[test]
fn test_equality_transitive() {
let c1 = Codec::Ed25519Pub;
let c2 = Codec::try_from(0xED).unwrap();
let c3 = Codec::try_from("ed25519-pub").unwrap();
assert_eq!(c1, c2);
assert_eq!(c2, c3);
assert_eq!(c1, c3);
}
#[test]
fn test_ordering_consistent() {
let c1 = Codec::Identity; let c2 = Codec::Sha2256; let c3 = Codec::Ed25519Pub;
assert!(c1 < c2);
assert!(c2 < c3);
assert!(c1 < c3);
assert!(c3 > c2);
assert!(c2 > c1);
assert!(c3 > c1); }
#[test]
fn test_copy_semantics() {
let c1 = Codec::Ed25519Pub;
let c2 = c1;
assert_eq!(c1.code(), 0xED);
assert_eq!(c2.code(), 0xED);
assert_eq!(c1, c2);
}
#[test]
fn test_clone_equals_copy() {
let c1 = Codec::Ed25519Pub;
let c2 = c1;
assert_eq!(c1, c2);
assert_eq!(c1.code(), c2.code());
assert_eq!(c1.as_str(), c2.as_str());
}
#[cfg(feature = "serde")]
mod serde_edge_cases {
use super::*;
#[test]
fn test_serde_identity() {
let codec = Codec::Identity;
let json = serde_json::to_string(&codec).unwrap();
assert_eq!(json, "\"identity\"");
let decoded: Codec = serde_json::from_str(&json).unwrap();
assert_eq!(decoded, Codec::Identity);
let bytes = serde_cbor::to_vec(&codec).unwrap();
let decoded: Codec = serde_cbor::from_slice(&bytes).unwrap();
assert_eq!(decoded, Codec::Identity);
}
#[test]
fn test_serde_various_codecs() {
let codecs = vec![Codec::Identity, Codec::Sha2256, Codec::Ed25519Pub];
for codec in codecs {
let json = serde_json::to_string(&codec).unwrap();
let decoded: Codec = serde_json::from_str(&json).unwrap();
assert_eq!(decoded, codec);
let bytes = serde_cbor::to_vec(&codec).unwrap();
let decoded: Codec = serde_cbor::from_slice(&bytes).unwrap();
assert_eq!(decoded, codec);
}
}
}