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, Revision, Uitem,
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 items = iter::empty()
30            .chain(tv.p2pkh_bytes.map(|b| Uitem::Data(Receiver::P2pkh(b))))
31            .chain(tv.p2sh_bytes.map(|b| Uitem::Data(Receiver::P2sh(b))))
32            .chain(
33                tv.sapling_raw_addr
34                    .map(|b| Uitem::Data(Receiver::Sapling(b))),
35            )
36            .chain(
37                tv.orchard_raw_addr
38                    .map(|b| Uitem::Data(Receiver::Orchard(b))),
39            )
40            .chain(unknown_tc.and_then(|typecode| {
41                unknown_bytes.map(move |data| {
42                    Uitem::Data(Receiver::Unknown {
43                        typecode,
44                        data: data.to_vec(),
45                    })
46                })
47            }))
48            .collect();
49
50        let expected_addr = ZcashAddress::from_unified(
51            NetworkType::Main,
52            unified::Address {
53                revision: Revision::R0,
54                items,
55            },
56        );
57
58        // Test parsing
59        let addr: ZcashAddress = tv.unified_addr.parse().unwrap();
60        assert_eq!(addr, expected_addr);
61
62        // Test serialization
63        assert_eq!(expected_addr.to_string(), tv.unified_addr.to_string());
64    }
65}