@@ -386,3 +386,98 @@ fn test_non_wildcard_derivations() {
386
386
1 ,
387
387
) ;
388
388
}
389
+
390
+ /// Check that calling `lookahead_to_target` stores the expected spks.
391
+ #[ test]
392
+ fn lookahead_to_target ( ) {
393
+ #[ derive( Default ) ]
394
+ struct TestCase {
395
+ lookahead : u32 , // Global lookahead value
396
+ external_last_revealed : Option < u32 > , // Last revealed index for external keychain
397
+ internal_last_revealed : Option < u32 > , // Last revealed index for internal keychain
398
+ external_target : Option < u32 > , // Call `lookahead_to_target(External, u32)`
399
+ internal_target : Option < u32 > , // Call `lookahead_to_target(Internal, u32)`
400
+ }
401
+
402
+ let test_cases = & [
403
+ TestCase {
404
+ lookahead : 0 ,
405
+ external_target : Some ( 100 ) ,
406
+ ..Default :: default ( )
407
+ } ,
408
+ TestCase {
409
+ lookahead : 10 ,
410
+ internal_target : Some ( 99 ) ,
411
+ ..Default :: default ( )
412
+ } ,
413
+ TestCase {
414
+ lookahead : 100 ,
415
+ internal_target : Some ( 9 ) ,
416
+ external_target : Some ( 10 ) ,
417
+ ..Default :: default ( )
418
+ } ,
419
+ TestCase {
420
+ lookahead : 12 ,
421
+ external_last_revealed : Some ( 2 ) ,
422
+ internal_last_revealed : Some ( 2 ) ,
423
+ internal_target : Some ( 15 ) ,
424
+ external_target : Some ( 13 ) ,
425
+ } ,
426
+ TestCase {
427
+ lookahead : 13 ,
428
+ external_last_revealed : Some ( 100 ) ,
429
+ internal_last_revealed : Some ( 21 ) ,
430
+ internal_target : Some ( 120 ) ,
431
+ external_target : Some ( 130 ) ,
432
+ } ,
433
+ ] ;
434
+
435
+ for t in test_cases {
436
+ let ( mut index, _, _) = init_txout_index ( t. lookahead ) ;
437
+
438
+ if let Some ( last_revealed) = t. external_last_revealed {
439
+ let _ = index. reveal_to_target ( & TestKeychain :: External , last_revealed) ;
440
+ }
441
+ if let Some ( last_revealed) = t. internal_last_revealed {
442
+ let _ = index. reveal_to_target ( & TestKeychain :: Internal , last_revealed) ;
443
+ }
444
+
445
+ let keychain_test_cases = [
446
+ (
447
+ TestKeychain :: External ,
448
+ t. external_last_revealed ,
449
+ t. external_target ,
450
+ ) ,
451
+ (
452
+ TestKeychain :: Internal ,
453
+ t. internal_last_revealed ,
454
+ t. internal_target ,
455
+ ) ,
456
+ ] ;
457
+ for ( keychain, last_revealed, target) in keychain_test_cases {
458
+ if let Some ( target) = target {
459
+ let original_last_stored_index = match last_revealed {
460
+ Some ( last_revealed) => Some ( last_revealed + t. lookahead ) ,
461
+ None => t. lookahead . checked_sub ( 1 ) ,
462
+ } ;
463
+ let exp_last_stored_index = match original_last_stored_index {
464
+ Some ( original_last_stored_index) => {
465
+ Ord :: max ( target, original_last_stored_index)
466
+ }
467
+ None => target,
468
+ } ;
469
+ index. lookahead_to_target ( & keychain, target) ;
470
+ let keys = index
471
+ . inner ( )
472
+ . all_spks ( )
473
+ . range ( ( keychain. clone ( ) , 0 ) ..=( keychain. clone ( ) , u32:: MAX ) )
474
+ . map ( |( k, _) | k. clone ( ) )
475
+ . collect :: < Vec < _ > > ( ) ;
476
+ let exp_keys = core:: iter:: repeat ( keychain)
477
+ . zip ( 0_u32 ..=exp_last_stored_index)
478
+ . collect :: < Vec < _ > > ( ) ;
479
+ assert_eq ! ( keys, exp_keys) ;
480
+ }
481
+ }
482
+ }
483
+ }
0 commit comments