]> Untitled Git - bdk/commitdiff
[#344] Add assert_matches
authorJeremy Mawson <jmawson@squareup.com>
Mon, 12 Dec 2022 21:55:32 +0000 (07:55 +1000)
committerJeremy Mawson <jmawson@squareup.com>
Fri, 23 Dec 2022 12:05:53 +0000 (22:05 +1000)
Replace assert!(matches! with assert_matches! everywhere
Convert assert! to assert_eq! in 2 places

13 files changed:
Cargo.toml
src/blockchain/compact_filters/sync.rs
src/database/sqlite.rs
src/descriptor/checksum.rs
src/descriptor/mod.rs
src/descriptor/policy.rs
src/descriptor/template.rs
src/lib.rs
src/testutils/configurable_blockchain_tests.rs
src/wallet/coin_selection.rs
src/wallet/mod.rs
src/wallet/signer.rs
src/wallet/verify.rs

index 681da7f07f4443f30dfc29505a8a8b240680be99..0557bfe91a158cc54d556a50c4318d7e2b736d1b 100644 (file)
@@ -109,6 +109,7 @@ env_logger = "0.7"
 electrsd = "0.21"
 # Move back to importing from rust-bitcoin once https://github.com/rust-bitcoin/rust-bitcoin/pull/1342 is released
 base64 = "^0.13"
+assert_matches = "1.5.0"
 
 [[example]]
 name = "compact_filters_balance"
index a67b5705f680d1cdef38103de7bee27edc375aab..ba4e004564677714114307df3bef79644d807824 100644 (file)
@@ -136,7 +136,7 @@ impl CfSync {
 
                 let resp = peer.get_cf_headers(0x00, start_height as u32, stop_hash)?;
 
-                assert!(resp.previous_filter_header == checkpoint);
+                assert_eq!(resp.previous_filter_header, checkpoint);
                 status =
                     self.cf_store
                         .advance_to_cf_headers(index, checkpoint, resp.filter_hashes)?;
index 9bcfca832cd81cda1d17357495f08e0864279997..fc71508566cd38918862f060ae7f1ae8e8f86783 100644 (file)
@@ -1137,12 +1137,10 @@ pub mod test {
             let child: u32 = row.get(1).unwrap();
             let count: usize = row.get(2).unwrap();
 
-            assert!(
-                count == 1,
+            assert_eq!(
+                count, 1,
                 "keychain={}, child={}, count={}",
-                keychain,
-                child,
-                count
+                keychain, child, count
             );
         }
     }
index 6be3a2444bc8f5bba6b15fc3e986ed12eb3e3941..b4ba0e8ff78a8ea7e9c71d05d8226d0c8cf372a1 100644 (file)
@@ -133,6 +133,7 @@ pub fn get_checksum(desc: &str) -> Result<String, DescriptorError> {
 mod test {
     use super::*;
     use crate::descriptor::calc_checksum;
+    use assert_matches::assert_matches;
 
     // test calc_checksum() function; it should return the same value as Bitcoin Core
     #[test]
@@ -155,16 +156,16 @@ mod test {
         assert_eq!(calc_checksum(desc).unwrap(), "lasegmfs");
 
         let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#tqz0nc26";
-        assert!(matches!(
-            calc_checksum(desc).err(),
-            Some(DescriptorError::InvalidDescriptorChecksum)
-        ));
+        assert_matches!(
+            calc_checksum(desc),
+            Err(DescriptorError::InvalidDescriptorChecksum)
+        );
 
         let desc = "pkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/44'/1'/0'/0/*)#lasegmsf";
-        assert!(matches!(
-            calc_checksum(desc).err(),
-            Some(DescriptorError::InvalidDescriptorChecksum)
-        ));
+        assert_matches!(
+            calc_checksum(desc),
+            Err(DescriptorError::InvalidDescriptorChecksum)
+        );
     }
 
     #[test]
@@ -172,9 +173,9 @@ mod test {
         let sparkle_heart = unsafe { std::str::from_utf8_unchecked(&[240, 159, 146, 150]) };
         let invalid_desc = format!("wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcL{}fjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)", sparkle_heart);
 
-        assert!(matches!(
-            calc_checksum(&invalid_desc).err(),
-            Some(DescriptorError::InvalidDescriptorCharacter(invalid_char)) if invalid_char == sparkle_heart.as_bytes()[0]
-        ));
+        assert_matches!(
+            calc_checksum(&invalid_desc),
+            Err(DescriptorError::InvalidDescriptorCharacter(invalid_char)) if invalid_char == sparkle_heart.as_bytes()[0]
+        );
     }
 }
index 233e8d19fc29a224a9f87265f1648d905a9ea7fb..b307bbf1c6d0667cea436bf47441216b252f3762 100644 (file)
@@ -581,6 +581,7 @@ impl DescriptorMeta for ExtendedDescriptor {
 mod test {
     use std::str::FromStr;
 
+    use assert_matches::assert_matches;
     use bitcoin::consensus::encode::deserialize;
     use bitcoin::hashes::hex::FromHex;
     use bitcoin::secp256k1::Secp256k1;
@@ -763,17 +764,11 @@ mod test {
 
         let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#67ju93jw"
             .into_wallet_descriptor(&secp, Network::Testnet);
-        assert!(matches!(
-            desc.err(),
-            Some(DescriptorError::InvalidDescriptorChecksum)
-        ));
+        assert_matches!(desc, Err(DescriptorError::InvalidDescriptorChecksum));
 
         let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#67ju93jw"
             .into_wallet_descriptor(&secp, Network::Testnet);
-        assert!(matches!(
-            desc.err(),
-            Some(DescriptorError::InvalidDescriptorChecksum)
-        ));
+        assert_matches!(desc, Err(DescriptorError::InvalidDescriptorChecksum));
     }
 
     // test IntoWalletDescriptor trait from &str with keys from right and wrong network
@@ -807,17 +802,11 @@ mod test {
 
         let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)"
             .into_wallet_descriptor(&secp, Network::Bitcoin);
-        assert!(matches!(
-            desc.err(),
-            Some(DescriptorError::Key(KeyError::InvalidNetwork))
-        ));
+        assert_matches!(desc, Err(DescriptorError::Key(KeyError::InvalidNetwork)));
 
         let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)"
             .into_wallet_descriptor(&secp, Network::Bitcoin);
-        assert!(matches!(
-            desc.err(),
-            Some(DescriptorError::Key(KeyError::InvalidNetwork))
-        ));
+        assert_matches!(desc, Err(DescriptorError::Key(KeyError::InvalidNetwork)));
     }
 
     // test IntoWalletDescriptor trait from the output of the descriptor!() macro
@@ -851,11 +840,7 @@ mod test {
         let descriptor = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/0'/1/2/*)";
         let result = into_wallet_descriptor_checked(descriptor, &secp, Network::Testnet);
 
-        assert!(result.is_err());
-        assert!(matches!(
-            result.unwrap_err(),
-            DescriptorError::HardenedDerivationXpub
-        ));
+        assert_matches!(result, Err(DescriptorError::HardenedDerivationXpub));
 
         let descriptor = "wsh(multi(2,tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/0/*,tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/0/*))";
         let result = into_wallet_descriptor_checked(descriptor, &secp, Network::Testnet);
index 964ec29114bfde7eb7fa2c5b7603cb7fbb7ae638..f481f9888dcc03c4d6f9c4db7b66874082793e7f 100644 (file)
@@ -1139,6 +1139,7 @@ mod test {
     use crate::descriptor::policy::SatisfiableItem::{EcdsaSignature, Multisig, Thresh};
     use crate::keys::{DescriptorKey, IntoDescriptorKey};
     use crate::wallet::signer::SignersContainer;
+    use assert_matches::assert_matches;
     use bitcoin::secp256k1::Secp256k1;
     use bitcoin::util::bip32;
     use bitcoin::Network;
@@ -1182,8 +1183,8 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint));
-        assert!(matches!(&policy.contribution, Satisfaction::None));
+        assert_matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint);
+        assert_matches!(&policy.contribution, Satisfaction::None);
 
         let desc = descriptor!(wpkh(prvkey)).unwrap();
         let (wallet_desc, keymap) = desc
@@ -1195,10 +1196,8 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint));
-        assert!(
-            matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
-        );
+        assert_matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint);
+        assert_matches!(&policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None);
     }
 
     // 2 pub keys descriptor, required 2 prv keys
@@ -1217,19 +1216,16 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
+        assert_matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
             && keys[0] == PkOrF::Fingerprint(fingerprint0)
-            && keys[1] == PkOrF::Fingerprint(fingerprint1))
+            && keys[1] == PkOrF::Fingerprint(fingerprint1)
         );
         // TODO should this be "Satisfaction::None" since we have no prv keys?
         // TODO should items and conditions not be empty?
-        assert!(
-            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
+        assert_matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
             && m == &2usize
             && items.is_empty()
             && conditions.is_empty()
-            )
         );
     }
 
@@ -1248,18 +1244,15 @@ mod test {
             .extract_policy(&signers_container, BuildSatisfaction::None, &secp)
             .unwrap()
             .unwrap();
-        assert!(
-            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
+        assert_matches!(&policy.item, Multisig { keys, threshold } if threshold == &2usize
             && keys[0] == PkOrF::Fingerprint(fingerprint0)
-            && keys[1] == PkOrF::Fingerprint(fingerprint1))
+            && keys[1] == PkOrF::Fingerprint(fingerprint1)
         );
 
-        assert!(
-            matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
+        assert_matches!(&policy.contribution, Satisfaction::Partial { n, m, items, conditions, ..} if n == &2usize
              && m == &2usize
              && items.len() == 1
              && conditions.contains_key(&0)
-            )
         );
     }
 
@@ -1281,18 +1274,15 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
+        assert_matches!(&policy.item, Multisig { keys, threshold } if threshold == &1
             && keys[0] == PkOrF::Fingerprint(fingerprint0)
-            && keys[1] == PkOrF::Fingerprint(fingerprint1))
+            && keys[1] == PkOrF::Fingerprint(fingerprint1)
         );
-        assert!(
-            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
+        assert_matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
              && m == &1
              && items.len() == 2
              && conditions.contains_key(&vec![0])
              && conditions.contains_key(&vec![1])
-            )
         );
     }
 
@@ -1313,18 +1303,15 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(&policy.item, Multisig { keys, threshold } if threshold == &2
+        assert_matches!(&policy.item, Multisig { keys, threshold } if threshold == &2
             && keys[0] == PkOrF::Fingerprint(fingerprint0)
-            && keys[1] == PkOrF::Fingerprint(fingerprint1))
+            && keys[1] == PkOrF::Fingerprint(fingerprint1)
         );
 
-        assert!(
-            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
+        assert_matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &2
              && m == &2
              && items.len() == 2
              && conditions.contains_key(&vec![0,1])
-            )
         );
     }
 
@@ -1345,8 +1332,8 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint));
-        assert!(matches!(&policy.contribution, Satisfaction::None));
+        assert_matches!(&policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == &fingerprint);
+        assert_matches!(&policy.contribution, Satisfaction::None);
 
         let desc = descriptor!(wpkh(prvkey)).unwrap();
         let (wallet_desc, keymap) = desc
@@ -1358,10 +1345,8 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(matches!(policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == fingerprint));
-        assert!(
-            matches!(policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None)
-        );
+        assert_matches!(policy.item, EcdsaSignature(PkOrF::Fingerprint(f)) if f == fingerprint);
+        assert_matches!(policy.contribution, Satisfaction::Complete {condition} if condition.csv == None && condition.timelock == None);
     }
 
     // single key, 1 prv and 1 pub key descriptor, required 1 prv keys
@@ -1382,18 +1367,15 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(policy.item, Multisig { keys, threshold } if threshold == 1
+        assert_matches!(policy.item, Multisig { keys, threshold } if threshold == 1
             && keys[0] == PkOrF::Fingerprint(fingerprint0)
-            && keys[1] == PkOrF::Fingerprint(fingerprint1))
+            && keys[1] == PkOrF::Fingerprint(fingerprint1)
         );
-        assert!(
-            matches!(policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == 2
+        assert_matches!(policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == 2
              && m == 1
              && items.len() == 2
              && conditions.contains_key(&vec![0])
              && conditions.contains_key(&vec![1])
-            )
         );
     }
 
@@ -1425,18 +1407,14 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(&policy.item, Thresh { items, threshold } if items.len() == 3 && threshold == &2)
-        );
+        assert_matches!(&policy.item, Thresh { items, threshold } if items.len() == 3 && threshold == &2);
 
-        assert!(
-            matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &3
+        assert_matches!(&policy.contribution, Satisfaction::PartialComplete { n, m, items, conditions, .. } if n == &3
              && m == &2
              && items.len() == 3
              && conditions.get(&vec![0,1]).unwrap().iter().next().unwrap().csv.is_none()
              && conditions.get(&vec![0,2]).unwrap().iter().next().unwrap().csv == Some(Sequence(sequence))
              && conditions.get(&vec![1,2]).unwrap().iter().next().unwrap().csv == Some(Sequence(sequence))
-            )
         );
     }
 
@@ -1599,11 +1577,9 @@ mod test {
             .unwrap();
         //println!("{}", serde_json::to_string(&policy_alice_psbt).unwrap());
 
-        assert!(
-            matches!(&policy_alice_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
+        assert_matches!(&policy_alice_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
              && m == &2
              && items == &vec![0]
-            )
         );
 
         let psbt = Psbt::from_str(BOB_SIGNED_PSBT).unwrap();
@@ -1613,11 +1589,9 @@ mod test {
             .unwrap();
         //println!("{}", serde_json::to_string(&policy_bob_psbt).unwrap());
 
-        assert!(
-            matches!(&policy_bob_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
+        assert_matches!(&policy_bob_psbt.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &2
              && m == &2
              && items == &vec![1]
-            )
         );
 
         let psbt = Psbt::from_str(ALICE_BOB_SIGNED_PSBT).unwrap();
@@ -1625,11 +1599,9 @@ mod test {
             .extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
             .unwrap()
             .unwrap();
-        assert!(
-            matches!(&policy_alice_bob_psbt.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &2
+        assert_matches!(&policy_alice_bob_psbt.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &2
              && m == &2
              && items == &vec![0, 1]
-            )
         );
     }
 
@@ -1673,11 +1645,9 @@ mod test {
             .extract_policy(&signers_container, build_sat, &secp)
             .unwrap()
             .unwrap();
-        assert!(
-            matches!(&policy.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
+        assert_matches!(&policy.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
              && m == &2
              && items.is_empty()
-            )
         );
         //println!("{}", serde_json::to_string(&policy).unwrap());
 
@@ -1691,11 +1661,9 @@ mod test {
             .extract_policy(&signers_container, build_sat_expired, &secp)
             .unwrap()
             .unwrap();
-        assert!(
-            matches!(&policy_expired.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
+        assert_matches!(&policy_expired.satisfaction, Satisfaction::Partial { n, m, items, .. } if n == &3
              && m == &2
              && items == &vec![0]
-            )
         );
         //println!("{}", serde_json::to_string(&policy_expired).unwrap());
 
@@ -1711,11 +1679,9 @@ mod test {
             .extract_policy(&signers_container, build_sat_expired_signed, &secp)
             .unwrap()
             .unwrap();
-        assert!(
-            matches!(&policy_expired_signed.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &3
+        assert_matches!(&policy_expired_signed.satisfaction, Satisfaction::PartialComplete { n, m, items, .. } if n == &3
              && m == &2
              && items == &vec![0, 1]
-            )
         );
         //println!("{}", serde_json::to_string(&policy_expired_signed).unwrap());
     }
@@ -1790,12 +1756,8 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(policy.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
-        );
-        assert!(
-            matches!(policy.contribution, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![1])
-        );
+        assert_matches!(policy.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2);
+        assert_matches!(policy.contribution, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![1]);
 
         let alice_sig = SatisfiableItem::SchnorrSignature(PkOrF::Fingerprint(alice_fing));
         let bob_sig = SatisfiableItem::SchnorrSignature(PkOrF::Fingerprint(bob_fing));
@@ -1887,19 +1849,11 @@ mod test {
             .unwrap()
             .unwrap();
 
-        assert!(
-            matches!(policy_unsigned.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
-        );
-        assert!(
-            matches!(policy_unsigned.satisfaction, Satisfaction::Partial { n: 2, m: 1, items, .. } if items.is_empty())
-        );
+        assert_matches!(policy_unsigned.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2);
+        assert_matches!(policy_unsigned.satisfaction, Satisfaction::Partial { n: 2, m: 1, items, .. } if items.is_empty());
 
-        assert!(
-            matches!(policy_signed.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
-        );
-        assert!(
-            matches!(policy_signed.satisfaction, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![0, 1])
-        );
+        assert_matches!(policy_signed.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2);
+        assert_matches!(policy_signed.satisfaction, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![0, 1]);
 
         let satisfied_items = match policy_signed.item {
             SatisfiableItem::Thresh { items, .. } => items,
index ddf5795273ca9658414dc714f111d7402df9910e..3bd2c59e30ff123757ab8b2fbb5a3866fa9edcd9 100644 (file)
@@ -483,6 +483,7 @@ mod test {
     use super::*;
     use crate::descriptor::{DescriptorError, DescriptorMeta};
     use crate::keys::ValidNetworks;
+    use assert_matches::assert_matches;
     use bitcoin::network::constants::Network::Regtest;
     use miniscript::descriptor::{DescriptorPublicKey, KeyMap};
     use miniscript::Descriptor;
@@ -501,9 +502,9 @@ mod test {
         if let ExtendedDescriptor::Pkh(pkh) = xdesc.0 {
             let path: Vec<ChildNumber> = pkh.into_inner().full_derivation_path().into();
             let purpose = path.get(0).unwrap();
-            assert!(matches!(purpose, Hardened { index: 44 }));
+            assert_matches!(purpose, Hardened { index: 44 });
             let coin_type = path.get(1).unwrap();
-            assert!(matches!(coin_type, Hardened { index: 0 }));
+            assert_matches!(coin_type, Hardened { index: 0 });
         }
 
         let tprvkey = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap();
@@ -515,9 +516,9 @@ mod test {
         if let ExtendedDescriptor::Pkh(pkh) = tdesc.0 {
             let path: Vec<ChildNumber> = pkh.into_inner().full_derivation_path().into();
             let purpose = path.get(0).unwrap();
-            assert!(matches!(purpose, Hardened { index: 44 }));
+            assert_matches!(purpose, Hardened { index: 44 });
             let coin_type = path.get(1).unwrap();
-            assert!(matches!(coin_type, Hardened { index: 1 }));
+            assert_matches!(coin_type, Hardened { index: 1 });
         }
     }
 
index 1a644ebde0c4d7d5c6158e9a69ff4f57aa5f06df..23c4e34dce597b1b9ffbd38e642ab7c886d6cb8a 100644 (file)
@@ -256,6 +256,9 @@ pub extern crate rusqlite;
 #[macro_use]
 pub mod testutils;
 
+#[cfg(test)]
+extern crate assert_matches;
+
 #[allow(unused_imports)]
 #[macro_use]
 pub(crate) mod error;
index 8662844dd6a744f5a8163d95c496664307361aaf..423c55d06606df58e5a7e53622e268b7818bac57 100644 (file)
@@ -23,7 +23,7 @@ pub trait ConfigurableBlockchainTester<B: ConfigurableBlockchain>: Sized {
         None
     }
 
-    /// Runs all avaliable tests.
+    /// Runs all available tests.
     fn run(&self) {
         let test_client = &mut TestClient::default();
 
index 30d07c1551dd234dd4a6f25b82bf9bc890d84608..8482f96a9de20fdc8d11f3d9b577750d1a6bdcaf 100644 (file)
@@ -102,11 +102,11 @@ use crate::{error::Error, Utxo};
 use bitcoin::consensus::encode::serialize;
 use bitcoin::Script;
 
+#[cfg(test)]
+use assert_matches::assert_matches;
 use rand::seq::SliceRandom;
 #[cfg(not(test))]
 use rand::thread_rng;
-#[cfg(test)]
-use rand::{rngs::StdRng, SeedableRng};
 use std::collections::HashMap;
 use std::convert::TryInto;
 
@@ -671,6 +671,7 @@ impl BranchAndBoundCoinSelection {
         optional_utxos.shuffle(&mut thread_rng());
         #[cfg(test)]
         {
+            use rand::{rngs::StdRng, SeedableRng};
             let seed = [0; 32];
             let mut rng: StdRng = SeedableRng::from_seed(seed);
             optional_utxos.shuffle(&mut rng);
@@ -1522,24 +1523,22 @@ mod test {
         let database = MemoryDatabase::default();
         let drain_script = Script::default();
 
-        let err = BranchAndBoundCoinSelection::default()
-            .coin_select(
-                &database,
-                vec![],
-                utxos,
-                FeeRate::from_sat_per_vb(10.0),
-                500_000,
-                &drain_script,
-            )
-            .unwrap_err();
+        let selection = BranchAndBoundCoinSelection::default().coin_select(
+            &database,
+            vec![],
+            utxos,
+            FeeRate::from_sat_per_vb(10.0),
+            500_000,
+            &drain_script,
+        );
 
-        assert!(matches!(
-            err,
-            Error::InsufficientFunds {
+        assert_matches!(
+            selection,
+            Err(Error::InsufficientFunds {
                 available: 300_000,
                 ..
-            }
-        ));
+            })
+        );
     }
 
     #[test]
@@ -1552,24 +1551,22 @@ mod test {
             .into_iter()
             .partition(|u| matches!(u, WeightedUtxo { utxo, .. } if utxo.txout().value < 1000));
 
-        let err = BranchAndBoundCoinSelection::default()
-            .coin_select(
-                &database,
-                required,
-                optional,
-                FeeRate::from_sat_per_vb(10.0),
-                500_000,
-                &drain_script,
-            )
-            .unwrap_err();
+        let selection = BranchAndBoundCoinSelection::default().coin_select(
+            &database,
+            required,
+            optional,
+            FeeRate::from_sat_per_vb(10.0),
+            500_000,
+            &drain_script,
+        );
 
-        assert!(matches!(
-            err,
-            Error::InsufficientFunds {
+        assert_matches!(
+            selection,
+            Err(Error::InsufficientFunds {
                 available: 300_010,
                 ..
-            }
-        ));
+            })
+        );
     }
 
     #[test]
@@ -1578,23 +1575,21 @@ mod test {
         let database = MemoryDatabase::default();
         let drain_script = Script::default();
 
-        let err = BranchAndBoundCoinSelection::default()
-            .coin_select(
-                &database,
-                utxos,
-                vec![],
-                FeeRate::from_sat_per_vb(10_000.0),
-                500_000,
-                &drain_script,
-            )
-            .unwrap_err();
+        let selection = BranchAndBoundCoinSelection::default().coin_select(
+            &database,
+            utxos,
+            vec![],
+            FeeRate::from_sat_per_vb(10_000.0),
+            500_000,
+            &drain_script,
+        );
 
-        assert!(matches!(
-            err,
-            Error::InsufficientFunds {
+        assert_matches!(
+            selection,
+            Err(Error::InsufficientFunds {
                 available: 300_010,
                 ..
-            }
-        ));
+            })
+        );
     }
 }
index c400c5a4daff781951a3958553f9cc4c6bcb3efa..9819c890e06e25f05085484d58c580d2ac329b21 100644 (file)
@@ -1851,6 +1851,7 @@ pub fn get_funded_wallet(
 
 #[cfg(test)]
 pub(crate) mod test {
+    use assert_matches::assert_matches;
     use bitcoin::{util::psbt, Network, PackedLockTime, Sequence};
 
     use crate::database::Database;
@@ -4425,11 +4426,9 @@ pub(crate) mod test {
             result.is_err(),
             "Signing should have failed because the TX uses non-standard sighashes"
         );
-        assert!(
-            matches!(
-                result.unwrap_err(),
-                Error::Signer(SignerError::NonStandardSighash)
-            ),
+        assert_matches!(
+            result,
+            Err(Error::Signer(SignerError::NonStandardSighash)),
             "Signing failed with the wrong error type"
         );
 
@@ -4912,16 +4911,10 @@ pub(crate) mod test {
                 ..Default::default()
             },
         );
-        assert!(
-            result.is_err(),
-            "Signing should have failed because the witness_utxo is missing"
-        );
-        assert!(
-            matches!(
-                result.unwrap_err(),
-                Error::Signer(SignerError::MissingWitnessUtxo)
-            ),
-            "Signing failed with the wrong error type"
+        assert_matches!(
+            result,
+            Err(Error::Signer(SignerError::MissingWitnessUtxo)),
+            "Signing should have failed with the correct error because the witness_utxo is missing"
         );
 
         // restore the witness_utxo
@@ -4935,9 +4928,9 @@ pub(crate) mod test {
             },
         );
 
-        assert!(result.is_ok(), "Signing should have worked");
-        assert!(
-            result.unwrap(),
+        assert_matches!(
+            result,
+            Ok(true),
             "Should finalize the input since we can produce signatures"
         );
     }
@@ -5262,11 +5255,9 @@ pub(crate) mod test {
             result.is_err(),
             "Signing should have failed because the TX uses non-standard sighashes"
         );
-        assert!(
-            matches!(
-                result.unwrap_err(),
-                Error::Signer(SignerError::NonStandardSighash)
-            ),
+        assert_matches!(
+            result,
+            Err(Error::Signer(SignerError::NonStandardSighash)),
             "Signing failed with the wrong error type"
         );
 
@@ -5282,11 +5273,9 @@ pub(crate) mod test {
             result.is_err(),
             "Signing should have failed because the witness_utxo is missing"
         );
-        assert!(
-            matches!(
-                result.unwrap_err(),
-                Error::Signer(SignerError::MissingWitnessUtxo)
-            ),
+        assert_matches!(
+            result,
+            Err(Error::Signer(SignerError::MissingWitnessUtxo)),
             "Signing failed with the wrong error type"
         );
 
@@ -5367,26 +5356,26 @@ pub(crate) mod test {
         builder
             .add_recipient(addr.script_pubkey(), balance.immature / 2)
             .current_height(confirmation_time);
-        assert!(matches!(
-            builder.finish().unwrap_err(),
-            Error::InsufficientFunds {
+        assert_matches!(
+            builder.finish(),
+            Err(Error::InsufficientFunds {
                 needed: _,
                 available: 0
-            }
-        ));
+            })
+        );
 
         // Still unspendable...
         let mut builder = wallet.build_tx();
         builder
             .add_recipient(addr.script_pubkey(), balance.immature / 2)
             .current_height(not_yet_mature_time);
-        assert!(matches!(
-            builder.finish().unwrap_err(),
-            Error::InsufficientFunds {
+        assert_matches!(
+            builder.finish(),
+            Err(Error::InsufficientFunds {
                 needed: _,
                 available: 0
-            }
-        ));
+            })
+        );
 
         // ...Now the coinbase is mature :)
         let sync_time = SyncTime {
@@ -5428,10 +5417,7 @@ pub(crate) mod test {
 
         builder.add_recipient(addr.script_pubkey(), 0);
 
-        assert!(matches!(
-            builder.finish().unwrap_err(),
-            Error::OutputBelowDustLimit(0)
-        ));
+        assert_matches!(builder.finish(), Err(Error::OutputBelowDustLimit(0)));
 
         let mut builder = wallet.build_tx();
 
index 84d38826a940d092c3dc2807c66e451f67966365..ab6c435586e11a347bec1e6cf0bbd79d6167139b 100644 (file)
@@ -998,6 +998,7 @@ mod signers_container_tests {
     use crate::descriptor;
     use crate::descriptor::IntoWalletDescriptor;
     use crate::keys::{DescriptorKey, IntoDescriptorKey};
+    use assert_matches::assert_matches;
     use bitcoin::secp256k1::{All, Secp256k1};
     use bitcoin::util::bip32;
     use bitcoin::Network;
@@ -1067,17 +1068,17 @@ mod signers_container_tests {
         signers.add_external(id2.clone(), SignerOrdering(2), signer2.clone());
         signers.add_external(id3.clone(), SignerOrdering(3), signer3.clone());
 
-        assert!(matches!(signers.find(id1), Some(signer) if is_equal(signer, &signer1)));
-        assert!(matches!(signers.find(id2), Some(signer) if is_equal(signer, &signer2)));
-        assert!(matches!(signers.find(id3.clone()), Some(signer) if is_equal(signer, &signer3)));
+        assert_matches!(signers.find(id1), Some(signer) if is_equal(signer, &signer1));
+        assert_matches!(signers.find(id2), Some(signer) if is_equal(signer, &signer2));
+        assert_matches!(signers.find(id3.clone()), Some(signer) if is_equal(signer, &signer3));
 
         // The `signer4` has the same ID as `signer3` but lower ordering.
         // It should be found by `id3` instead of `signer3`.
         signers.add_external(id3.clone(), SignerOrdering(2), signer4.clone());
-        assert!(matches!(signers.find(id3), Some(signer) if is_equal(signer, &signer4)));
+        assert_matches!(signers.find(id3), Some(signer) if is_equal(signer, &signer4));
 
         // Can't find anything with ID that doesn't exist
-        assert!(matches!(signers.find(id_nonexistent), None));
+        assert_matches!(signers.find(id_nonexistent), None);
     }
 
     #[derive(Debug, Clone, Copy)]
index 084388b91aef6a4e1c595610b759afe5737cdfe9..2fd865a12954d98e1f6cf6dd052563d4a5fd5995 100644 (file)
@@ -108,6 +108,7 @@ impl_error!(bitcoinconsensus::Error, Consensus, VerifyError);
 mod test {
     use super::*;
     use crate::database::{BatchOperations, MemoryDatabase};
+    use assert_matches::assert_matches;
     use bitcoin::consensus::encode::deserialize;
     use bitcoin::hashes::hex::FromHex;
     use bitcoin::{Transaction, Txid};
@@ -137,9 +138,7 @@ mod test {
         }
 
         let result = verify_tx(&signed_tx, &database, &blockchain);
-        assert!(result.is_err(), "Should fail with missing input tx");
-        assert!(
-            matches!(result, Err(VerifyError::MissingInputTx(txid)) if txid == prev_tx.txid()),
+        assert_matches!(result, Err(VerifyError::MissingInputTx(txid)) if txid == prev_tx.txid(),
             "Error should be a `MissingInputTx` error"
         );
 
@@ -147,9 +146,9 @@ mod test {
         database.set_raw_tx(&prev_tx).unwrap();
 
         let result = verify_tx(&unsigned_tx, &database, &blockchain);
-        assert!(result.is_err(), "Should fail since the TX is unsigned");
-        assert!(
-            matches!(result, Err(VerifyError::Consensus(_))),
+        assert_matches!(
+            result,
+            Err(VerifyError::Consensus(_)),
             "Error should be a `Consensus` error"
         );