@@ -216,6 +216,7 @@ impl CoinSelectionAlgorithm for LargestFirstCoinSelection {
216216 let mut pool = selector. unselected ( ) . collect :: < Vec < _ > > ( ) ;
217217 pool. sort_unstable_by_key ( |( _, candidate) | candidate. value ) ;
218218 pool. reverse ( ) ;
219+ println ! ( "pool: {:?}" , pool) ;
219220 pool
220221 } ;
221222
@@ -384,6 +385,7 @@ mod test {
384385 use bitcoin:: { OutPoint , Script , TxOut } ;
385386
386387 use super :: * ;
388+ use crate :: bdk_core:: CoinSelectorOpt ;
387389 // use crate::database::{BatchOperations, MemoryDatabase};
388390 use crate :: types:: * ;
389391 // use crate::wallet::WeightUnits;
@@ -419,12 +421,25 @@ mod test {
419421 }
420422 }
421423
422- fn get_test_utxos ( ) -> Vec < WeightedUtxo > {
423- vec ! [
424+ fn get_test_utxos ( ) -> ( Vec < WeightedUtxo > , Vec < bdk_core :: WeightedValue > ) {
425+ let utxos = vec ! [
424426 utxo( 100_000 , 0 ) ,
425427 utxo( FEE_AMOUNT as u64 - 40 , 1 ) ,
426428 utxo( 200_000 , 2 ) ,
427- ]
429+ ] ;
430+
431+ let candidates = utxos
432+ . iter ( )
433+ . map ( |utxo| {
434+ bdk_core:: WeightedValue :: new (
435+ utxo. utxo . txout ( ) . value ,
436+ utxo. satisfaction_weight as u32 ,
437+ utxo. utxo . txout ( ) . script_pubkey . is_witness_program ( ) ,
438+ )
439+ } )
440+ . collect :: < Vec < _ > > ( ) ;
441+
442+ ( utxos, candidates)
428443 }
429444
430445 fn setup_database_and_get_oldest_first_test_utxos < D : Database > (
@@ -531,46 +546,60 @@ mod test {
531546 . map ( |u| u. utxo . txout ( ) . value )
532547 . sum ( )
533548 }
534- // fn test_largest_first_coin_selection_success() {
535- // let utxos = get_test_utxos();
536- // let drain_script = Script::default();
537- // let target_amount = 250_000 + FEE_AMOUNT;
538549
539- // let result = LargestFirstCoinSelection::default()
540- // .coin_select(
541- // utxos,
542- // vec![],
543- // FeeRate::from_sat_per_vb(1.0),
544- // target_amount,
545- // &drain_script,
546- // )
547- // .unwrap();
550+ fn new_opts ( target_value : u64 , feerate : f32 , drain_script : Script ) -> CoinSelectorOpt {
551+ CoinSelectorOpt {
552+ target_feerate : feerate,
553+ ..CoinSelectorOpt :: fund_outputs (
554+ & [ TxOut {
555+ value : target_value,
556+ script_pubkey : Script :: default ( ) ,
557+ } ] ,
558+ & TxOut {
559+ value : 0 ,
560+ script_pubkey : drain_script,
561+ } ,
562+ 0 ,
563+ )
564+ }
565+ }
548566
549- // assert_eq!(result.selected.len(), 3);
550- // assert_eq!(result.selected_amount(), 300_010);
551- // assert_eq!(result.fee_amount, 204)
552- // }
567+ # [ test ]
568+ fn test_largest_first_coin_selection_success ( ) {
569+ let ( utxos , candidates ) = get_test_utxos ( ) ;
570+ let target_amount = 250_000 + FEE_AMOUNT ;
553571
554- // #[test]
555- // fn test_largest_first_coin_selection_use_all() {
556- // let utxos = get_test_utxos();
557- // let drain_script = Script::default();
558- // let target_amount = 20_000 + FEE_AMOUNT;
572+ let opts = new_opts ( target_amount, 0.25 , Script :: default ( ) ) ;
573+ let selector = bdk_core:: CoinSelector :: new ( & candidates, & opts) ;
559574
560- // let result = LargestFirstCoinSelection::default()
561- // .coin_select(
562- // utxos,
563- // vec![],
564- // FeeRate::from_sat_per_vb(1.0),
565- // target_amount,
566- // &drain_script,
567- // )
568- // .unwrap();
575+ let result = LargestFirstCoinSelection :: default ( )
576+ . coin_select ( & utxos, selector)
577+ . unwrap ( ) ;
578+ let ( strategy_kind, strategy) = result. best_strategy ( ) ;
579+ println ! ( "strategy_kind: {}" , strategy_kind) ;
569580
570- // assert_eq!(result.selected.len(), 3);
571- // assert_eq!(result.selected_amount(), 300_010);
572- // assert_eq!(result.fee_amount, 204);
573- // }
581+ assert_eq ! ( result. selected. len( ) , 2 ) ;
582+ assert_eq ! ( strategy. fee, 164 ) ;
583+ }
584+
585+ #[ test]
586+ fn test_largest_first_coin_selection_use_all ( ) {
587+ let ( utxos, candidates) = get_test_utxos ( ) ;
588+ let target_amount = 20_000 + FEE_AMOUNT ;
589+
590+ let opts = new_opts ( target_amount, 0.25 , Script :: default ( ) ) ;
591+ let mut selector = bdk_core:: CoinSelector :: new ( & candidates, & opts) ;
592+ selector. select_all ( ) ;
593+
594+ let result = LargestFirstCoinSelection :: default ( )
595+ . coin_select ( & utxos, selector)
596+ . unwrap ( ) ;
597+ let ( _, strategy) = result. best_strategy ( ) ;
598+
599+ assert_eq ! ( result. selected. len( ) , 3 ) ;
600+ // assert_eq!(result.selected_amount(), 300_010);
601+ assert_eq ! ( strategy. fee, 232 ) ;
602+ }
574603
575604 // #[test]
576605 // fn test_largest_first_coin_selection_use_only_necessary() {
0 commit comments