Skip to main content

zcash_address/
test_vectors.rs

1/// Export test vectors for reuse by implementers of address parsing libraries.
2pub use crate::unified::address::test_vectors::TEST_VECTORS as UNIFIED;
3
4#[cfg(test)]
5use {
6    crate::{
7        ToAddress, ZcashAddress,
8        unified::{
9            self,
10            address::{Receiver, test_vectors::TEST_VECTORS},
11        },
12    },
13    alloc::string::ToString,
14    core::iter,
15    zcash_protocol::consensus::NetworkType,
16};
17
18#[test]
19fn unified() {
20    for tv in TEST_VECTORS {
21        // Double-check test vectors match requirements:
22        // - Only one of P2PKH and P2SH.
23        assert!(tv.p2pkh_bytes.is_none() || tv.p2sh_bytes.is_none());
24        // - At least one shielded receiver.
25        assert!(tv.sapling_raw_addr.is_some() || tv.orchard_raw_addr.is_some());
26
27        let unknown_tc = tv.unknown_typecode;
28        let unknown_bytes = tv.unknown_bytes;
29        let receivers = iter::empty()
30            .chain(tv.p2pkh_bytes.map(Receiver::P2pkh))
31            .chain(tv.p2sh_bytes.map(Receiver::P2sh))
32            .chain(tv.sapling_raw_addr.map(Receiver::Sapling))
33            .chain(tv.orchard_raw_addr.map(Receiver::Orchard))
34            .chain(unknown_tc.and_then(|typecode| {
35                unknown_bytes.map(move |data| Receiver::Unknown {
36                    typecode,
37                    data: data.to_vec(),
38                })
39            }))
40            .collect();
41
42        let expected_addr =
43            ZcashAddress::from_unified(NetworkType::Main, unified::Address(receivers));
44
45        // Test parsing
46        let addr: ZcashAddress = tv.unified_addr.parse().unwrap();
47        assert_eq!(addr, expected_addr);
48
49        // Test serialization
50        assert_eq!(expected_addr.to_string(), tv.unified_addr.to_string());
51    }
52}