feat(witness): implement FromIterator for Witness with unit test

This commit is contained in:
aagbotemi 2025-04-22 02:10:27 +01:00
parent 2d8ebb79c3
commit 6bd7dc6980
No known key found for this signature in database
GPG Key ID: 37C137D831F0A852
1 changed files with 40 additions and 0 deletions

View File

@ -403,6 +403,13 @@ impl<'a> IntoIterator for &'a Witness {
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
impl<T: AsRef<[u8]>> FromIterator<T> for Witness {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let v: Vec<Vec<u8>> = iter.into_iter().map(|item| Vec::from(item.as_ref())).collect();
Self::from(v)
}
}
// Serde keep backward compatibility with old Vec<Vec<u8>> format
#[cfg(feature = "serde")]
impl serde::Serialize for Witness {
@ -858,6 +865,39 @@ mod test {
assert_eq!(json, r#"["007b4b","0206030708"]"#);
}
#[test]
fn test_witness_from_iterator() {
let bytes1 = [1u8, 2, 3];
let bytes2 = [4u8, 5];
let bytes3 = [6u8, 7, 8, 9];
let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
// Use FromIterator directly
let witness1 = Witness::from_iter(data);
// Create a witness manually for comparison
let mut witness2 = Witness::new();
for item in &data {
witness2.push(item);
}
assert_eq!(witness1, witness2);
assert_eq!(witness1.len(), witness2.len());
assert_eq!(witness1.to_vec(), witness2.to_vec());
// Test with collect
let bytes4 = [0u8, 123, 75];
let bytes5 = [2u8, 6, 3, 7, 8];
let data = [bytes4.to_vec(), bytes5.to_vec()];
let witness3: Witness = data.iter().collect();
assert_eq!(witness3.len(), 2);
assert_eq!(witness3.to_vec(), data);
// Test with empty iterator
let empty_data: Vec<Vec<u8>> = vec![];
let witness4: Witness = empty_data.iter().collect();
assert!(witness4.is_empty());
}
#[cfg(feature = "hex")]
#[test]
fn test_from_hex() {