Skip to content

Commit 24e41d9

Browse files
committed
bitcoin: Add a test for matching on network
Add a test module showing how external users are able to match on `Network` and `Network::Testnet(TestnetVersion)`. This topic is contentious so it helps to show exactly what is possible and what is not.
1 parent 2459cec commit 24e41d9

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

bitcoin/tests/network.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//! Tests what a user can do when pattern matching on `Network` and associated types.
2+
3+
use bitcoin::network::{Network, NetworkKind, TestnetVersion};
4+
5+
#[test]
6+
fn can_match_exhaustively_on_network() {
7+
// Returns true if `n` is mainnet.
8+
fn is_mainnet(n: Network) -> bool {
9+
matches!(n, Network::Bitcoin)
10+
}
11+
12+
assert!(is_mainnet(Network::Bitcoin));
13+
}
14+
15+
#[test]
16+
fn can_match_exhaustively_on_testnet() {
17+
// Returns true if `n` is any testnet.
18+
fn is_testnet(n: Network) -> bool {
19+
matches!(n, Network::Testnet(_))
20+
}
21+
22+
assert!(is_testnet(Network::Testnet(TestnetVersion::V3)));
23+
}
24+
25+
#[test]
26+
fn can_use_network_kind() {
27+
// Returns true if `n` is any mainnet.
28+
fn is_mainnet(n: Network) -> bool {
29+
NetworkKind::from(n).is_mainnet()
30+
}
31+
32+
// Returns true if `n` is a any testnet.
33+
fn is_testnet(n: Network) -> bool {
34+
!NetworkKind::from(n).is_mainnet()
35+
}
36+
37+
assert!(is_mainnet(Network::Bitcoin));
38+
assert!(!is_testnet(Network::Bitcoin));
39+
40+
assert!(is_testnet(Network::Testnet(TestnetVersion::V3)));
41+
assert!(!is_mainnet(Network::Testnet(TestnetVersion::V3)));
42+
43+
}
44+
45+
#[test]
46+
fn can_not_match_exaustively_on_testnet_version() {
47+
// Returns true if `n` is testnet version 3.
48+
fn is_testnet_v3(n: Network) -> bool {
49+
match n {
50+
Network::Testnet(TestnetVersion::V3) => true,
51+
Network::Testnet(TestnetVersion::V4) => false,
52+
// Catchall because of `non_exhaustive` attribute.
53+
Network::Testnet(_) => false,
54+
_ => false,
55+
}
56+
}
57+
58+
assert!(is_testnet_v3(Network::Testnet(TestnetVersion::V3)));
59+
}
60+
61+
#[test]
62+
fn can_match_on_testnet_version_3_only() {
63+
// Returns true if `n` is testnet version 3.
64+
fn is_testnet_v3(n: Network) -> bool {
65+
match n {
66+
Network::Testnet(TestnetVersion::V3) => true,
67+
// Catchall because its logically correct to do so.
68+
Network::Testnet(_) => false,
69+
_ => false,
70+
}
71+
}
72+
73+
assert!(is_testnet_v3(Network::Testnet(TestnetVersion::V3)));
74+
}

0 commit comments

Comments
 (0)