@@ -8,7 +8,8 @@ use cargo_util::is_ci;
8
8
use resolver_tests:: {
9
9
assert_contains, assert_same, dep, dep_kind, dep_loc, dep_req, loc_names, names, pkg, pkg_id,
10
10
pkg_loc, registry, registry_strategy, remove_dep, resolve, resolve_and_validated,
11
- resolve_with_global_context, PrettyPrintRegistry , SatResolve , ToDep , ToPkgId ,
11
+ resolve_with_global_context, resolve_with_global_context_raw, PrettyPrintRegistry , SatResolve ,
12
+ ToDep , ToPkgId ,
12
13
} ;
13
14
14
15
use proptest:: prelude:: * ;
@@ -425,6 +426,174 @@ fn test_resolving_maximum_version_with_transitive_deps() {
425
426
assert ! ( !res. contains( & ( "util" , "1.1.1" ) . to_pkgid( ) ) ) ;
426
427
}
427
428
429
+ #[ test]
430
+ fn test_wildcard_minor ( ) {
431
+ let reg = registry ( vec ! [
432
+ pkg!( ( "util" , "0.1.0" ) ) ,
433
+ pkg!( ( "util" , "0.1.1" ) ) ,
434
+ pkg!( "foo" => [ dep_req( "util" , "0.1.*" ) ] ) ,
435
+ ] ) ;
436
+
437
+ let res = resolve_and_validated (
438
+ vec ! [ dep_req( "util" , "=0.1.0" ) , dep_req( "foo" , "1.0.0" ) ] ,
439
+ & reg,
440
+ None ,
441
+ )
442
+ . unwrap ( ) ;
443
+
444
+ assert_same (
445
+ & res,
446
+ & names ( & [ ( "root" , "1.0.0" ) , ( "foo" , "1.0.0" ) , ( "util" , "0.1.0" ) ] ) ,
447
+ ) ;
448
+ }
449
+
450
+ #[ test]
451
+ fn test_wildcard_major ( ) {
452
+ let reg = registry ( vec ! [
453
+ pkg!( "foo" => [ dep_req( "util" , "0.*" ) ] ) ,
454
+ pkg!( ( "util" , "0.1.0" ) ) ,
455
+ pkg!( ( "util" , "0.2.0" ) ) ,
456
+ ] ) ;
457
+
458
+ let res = resolve_and_validated (
459
+ vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "=0.1.0" ) ] ,
460
+ & reg,
461
+ None ,
462
+ )
463
+ . unwrap ( ) ;
464
+
465
+ assert_same (
466
+ & res,
467
+ & names ( & [ ( "root" , "1.0.0" ) , ( "foo" , "1.0.0" ) , ( "util" , "0.1.0" ) ] ) ,
468
+ ) ;
469
+ }
470
+
471
+ #[ test]
472
+ fn test_range_major ( ) {
473
+ let reg = registry ( vec ! [
474
+ pkg!( "foo" => [ dep_req( "util" , ">=0.1,<0.3" ) ] ) ,
475
+ pkg!( ( "util" , "0.1.0" ) ) ,
476
+ pkg!( ( "util" , "0.2.0" ) ) ,
477
+ ] ) ;
478
+
479
+ let res = resolve_and_validated (
480
+ vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "0.1.0" ) ] ,
481
+ & reg,
482
+ None ,
483
+ )
484
+ . unwrap ( ) ;
485
+
486
+ assert_same (
487
+ & res,
488
+ & names ( & [ ( "root" , "1.0.0" ) , ( "foo" , "1.0.0" ) , ( "util" , "0.1.0" ) ] ) ,
489
+ ) ;
490
+ }
491
+
492
+ #[ test]
493
+ fn test_wildcard_major_duplicate_selection ( ) {
494
+ let reg = registry ( vec ! [
495
+ pkg!( "foo" => [ dep_req( "util" , "0.*" ) ] ) ,
496
+ pkg!( "bar" => [ dep_req( "util" , "0.2" ) ] ) ,
497
+ pkg!( "car" => [ dep_req( "util" , "0.1" ) ] ) ,
498
+ pkg!( ( "util" , "0.1.0" ) ) ,
499
+ pkg!( ( "util" , "0.2.0" ) ) ,
500
+ ] ) ;
501
+
502
+ let res = resolve_with_global_context_raw (
503
+ vec ! [
504
+ dep_req( "foo" , "1.0.0" ) ,
505
+ dep_req( "bar" , "1.0.0" ) ,
506
+ dep_req( "car" , "1.0.0" ) ,
507
+ ] ,
508
+ & reg,
509
+ & GlobalContext :: default ( ) . unwrap ( ) ,
510
+ )
511
+ . unwrap ( ) ;
512
+
513
+ // In this case, both 0.1.0 and 0.2.0 satisfy foo. It should pick the highest
514
+ // version.
515
+ assert_eq ! (
516
+ res. deps( pkg_id( "foo" ) ) . next( ) . unwrap( ) . 0 ,
517
+ ( "util" , "0.2.0" ) . to_pkgid( )
518
+ ) ;
519
+
520
+ let res = res. sort ( ) ;
521
+
522
+ assert_same (
523
+ & res,
524
+ & names ( & [
525
+ ( "root" , "1.0.0" ) ,
526
+ ( "foo" , "1.0.0" ) ,
527
+ ( "bar" , "1.0.0" ) ,
528
+ ( "car" , "1.0.0" ) ,
529
+ ( "util" , "0.1.0" ) ,
530
+ ( "util" , "0.2.0" ) ,
531
+ ] ) ,
532
+ ) ;
533
+ }
534
+
535
+ #[ test]
536
+ fn test_wildcard_major_coerced_by_subdependency ( ) {
537
+ let reg = registry ( vec ! [
538
+ pkg!( "foo" => [ dep_req( "util" , "0.1" ) ] ) ,
539
+ pkg!( ( "util" , "0.1.0" ) ) ,
540
+ pkg!( ( "util" , "0.2.0" ) ) ,
541
+ ] ) ;
542
+
543
+ let res = resolve ( vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "0.*" ) ] , & reg) . unwrap ( ) ;
544
+
545
+ // In this case, both 0.1.0 and 0.2.0 satisfy root, but it's being coerced
546
+ // by the subdependency of foo.
547
+ assert_same (
548
+ & res,
549
+ & names ( & [ ( "root" , "1.0.0" ) , ( "foo" , "1.0.0" ) , ( "util" , "0.1.0" ) ] ) ,
550
+ ) ;
551
+ }
552
+
553
+ #[ test]
554
+ fn test_wildcard_major_coerced_by_indirect_subdependency ( ) {
555
+ let reg = registry ( vec ! [
556
+ pkg!( "foo" => [ dep_req( "util" , "0.1" ) ] ) ,
557
+ pkg!( "bar" => [ dep_req( "car" , "1.0.0" ) ] ) ,
558
+ pkg!( "car" => [ dep_req( "util" , "0.2" ) ] ) ,
559
+ pkg!( ( "util" , "0.1.0" ) ) ,
560
+ pkg!( ( "util" , "0.2.0" ) ) ,
561
+ pkg!( ( "util" , "0.3.0" ) ) ,
562
+ ] ) ;
563
+
564
+ let res = resolve_with_global_context_raw (
565
+ vec ! [
566
+ dep_req( "foo" , "1.0.0" ) ,
567
+ dep_req( "bar" , "1.0.0" ) ,
568
+ dep_req( "util" , "0.*" ) ,
569
+ ] ,
570
+ & reg,
571
+ & GlobalContext :: default ( ) . unwrap ( ) ,
572
+ )
573
+ . unwrap ( ) ;
574
+
575
+ // In this case, 0.1.0, 0.2.0 and 0.3.0 satisfy root. It should pick the highest
576
+ // version that exists in the dependency tree.
577
+ assert_eq ! (
578
+ res. deps( pkg_id( "root" ) ) . skip( 2 ) . next( ) . unwrap( ) . 0 ,
579
+ ( "util" , "0.2.0" ) . to_pkgid( )
580
+ ) ;
581
+
582
+ let res = res. sort ( ) ;
583
+
584
+ assert_same (
585
+ & res,
586
+ & names ( & [
587
+ ( "root" , "1.0.0" ) ,
588
+ ( "foo" , "1.0.0" ) ,
589
+ ( "bar" , "1.0.0" ) ,
590
+ ( "car" , "1.0.0" ) ,
591
+ ( "util" , "0.1.0" ) ,
592
+ ( "util" , "0.2.0" ) ,
593
+ ] ) ,
594
+ ) ;
595
+ }
596
+
428
597
#[ test]
429
598
fn test_resolving_minimum_version_with_transitive_deps ( ) {
430
599
let reg = registry ( vec ! [
0 commit comments