@@ -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,190 @@ 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 ( & [
468
+ ( "root" , "1.0.0" ) ,
469
+ ( "foo" , "1.0.0" ) ,
470
+ ( "util" , "0.1.0" ) ,
471
+ ( "util" , "0.2.0" ) ,
472
+ ] ) ,
473
+ ) ;
474
+ }
475
+
476
+ #[ test]
477
+ fn test_range_major ( ) {
478
+ let reg = registry ( vec ! [
479
+ pkg!( "foo" => [ dep_req( "util" , ">=0.1,<0.3" ) ] ) ,
480
+ pkg!( ( "util" , "0.1.0" ) ) ,
481
+ pkg!( ( "util" , "0.2.0" ) ) ,
482
+ ] ) ;
483
+
484
+ let res = resolve_and_validated (
485
+ vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "0.1.0" ) ] ,
486
+ & reg,
487
+ None ,
488
+ )
489
+ . unwrap ( ) ;
490
+
491
+ assert_same (
492
+ & res,
493
+ & names ( & [
494
+ ( "root" , "1.0.0" ) ,
495
+ ( "foo" , "1.0.0" ) ,
496
+ ( "util" , "0.1.0" ) ,
497
+ ( "util" , "0.2.0" ) ,
498
+ ] ) ,
499
+ ) ;
500
+ }
501
+
502
+ #[ test]
503
+ fn test_wildcard_major_duplicate_selection ( ) {
504
+ let reg = registry ( vec ! [
505
+ pkg!( "foo" => [ dep_req( "util" , "0.*" ) ] ) ,
506
+ pkg!( "bar" => [ dep_req( "util" , "0.2" ) ] ) ,
507
+ pkg!( "car" => [ dep_req( "util" , "0.1" ) ] ) ,
508
+ pkg!( ( "util" , "0.1.0" ) ) ,
509
+ pkg!( ( "util" , "0.2.0" ) ) ,
510
+ ] ) ;
511
+
512
+ let res = resolve_with_global_context_raw (
513
+ vec ! [
514
+ dep_req( "foo" , "1.0.0" ) ,
515
+ dep_req( "bar" , "1.0.0" ) ,
516
+ dep_req( "car" , "1.0.0" ) ,
517
+ ] ,
518
+ & reg,
519
+ & GlobalContext :: default ( ) . unwrap ( ) ,
520
+ )
521
+ . unwrap ( ) ;
522
+
523
+ // In this case, both 0.1.0 and 0.2.0 satisfy foo. It should pick the highest
524
+ // version.
525
+ assert_eq ! (
526
+ res. deps( pkg_id( "foo" ) ) . next( ) . unwrap( ) . 0 ,
527
+ ( "util" , "0.2.0" ) . to_pkgid( )
528
+ ) ;
529
+
530
+ let res = res. sort ( ) ;
531
+
532
+ assert_same (
533
+ & res,
534
+ & names ( & [
535
+ ( "root" , "1.0.0" ) ,
536
+ ( "foo" , "1.0.0" ) ,
537
+ ( "bar" , "1.0.0" ) ,
538
+ ( "car" , "1.0.0" ) ,
539
+ ( "util" , "0.1.0" ) ,
540
+ ( "util" , "0.2.0" ) ,
541
+ ] ) ,
542
+ ) ;
543
+ }
544
+
545
+ #[ test]
546
+ fn test_wildcard_major_coerced_by_subdependency ( ) {
547
+ let reg = registry ( vec ! [
548
+ pkg!( "foo" => [ dep_req( "util" , "0.1" ) ] ) ,
549
+ pkg!( ( "util" , "0.1.0" ) ) ,
550
+ pkg!( ( "util" , "0.2.0" ) ) ,
551
+ ] ) ;
552
+
553
+ let res = resolve ( vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "0.*" ) ] , & reg) . unwrap ( ) ;
554
+
555
+ // In this case, both 0.1.0 and 0.2.0 satisfy root, but it's being coerced
556
+ // by the subdependency of foo.
557
+ assert_same (
558
+ & res,
559
+ & names ( & [
560
+ ( "root" , "1.0.0" ) ,
561
+ ( "foo" , "1.0.0" ) ,
562
+ ( "util" , "0.1.0" ) ,
563
+ ( "util" , "0.2.0" ) ,
564
+ ] ) ,
565
+ ) ;
566
+ }
567
+
568
+ #[ test]
569
+ fn test_wildcard_major_coerced_by_indirect_subdependency ( ) {
570
+ let reg = registry ( vec ! [
571
+ pkg!( "foo" => [ dep_req( "util" , "0.1" ) ] ) ,
572
+ pkg!( "bar" => [ dep_req( "car" , "1.0.0" ) ] ) ,
573
+ pkg!( "car" => [ dep_req( "util" , "0.2" ) ] ) ,
574
+ pkg!( ( "util" , "0.1.0" ) ) ,
575
+ pkg!( ( "util" , "0.2.0" ) ) ,
576
+ pkg!( ( "util" , "0.3.0" ) ) ,
577
+ ] ) ;
578
+
579
+ let res = resolve_with_global_context_raw (
580
+ vec ! [
581
+ dep_req( "foo" , "1.0.0" ) ,
582
+ dep_req( "bar" , "1.0.0" ) ,
583
+ dep_req( "util" , "0.*" ) ,
584
+ ] ,
585
+ & reg,
586
+ & GlobalContext :: default ( ) . unwrap ( ) ,
587
+ )
588
+ . unwrap ( ) ;
589
+
590
+ // In this case, 0.1.0, 0.2.0 and 0.3.0 satisfy root. It should pick the highest
591
+ // version that exists in the dependency tree.
592
+ assert_eq ! (
593
+ res. deps( pkg_id( "root" ) ) . skip( 2 ) . next( ) . unwrap( ) . 0 ,
594
+ ( "util" , "0.3.0" ) . to_pkgid( )
595
+ ) ;
596
+
597
+ let res = res. sort ( ) ;
598
+
599
+ assert_same (
600
+ & res,
601
+ & names ( & [
602
+ ( "root" , "1.0.0" ) ,
603
+ ( "foo" , "1.0.0" ) ,
604
+ ( "bar" , "1.0.0" ) ,
605
+ ( "car" , "1.0.0" ) ,
606
+ ( "util" , "0.1.0" ) ,
607
+ ( "util" , "0.2.0" ) ,
608
+ ( "util" , "0.3.0" ) ,
609
+ ] ) ,
610
+ ) ;
611
+ }
612
+
428
613
#[ test]
429
614
fn test_resolving_minimum_version_with_transitive_deps ( ) {
430
615
let reg = registry ( vec ! [
@@ -605,6 +790,35 @@ fn resolving_with_deep_backtracking() {
605
790
) ;
606
791
}
607
792
793
+ #[ test]
794
+ fn resolving_with_sys_crates_duplicates ( ) {
795
+ // This is based on issues/4902
796
+ // With `l` a normal library we get 2copies so everyone gets the newest compatible.
797
+ // But `l-sys` a library with a links attribute we make sure there is only one.
798
+ let reg = registry ( vec ! [
799
+ pkg!( ( "l-sys" , "0.9.1" ) ) ,
800
+ pkg!( ( "l-sys" , "0.10.0" ) ) ,
801
+ pkg!( ( "l" , "0.9.1" ) => [ dep_req( "l-sys" , ">=0.8.0, <=0.10.0" ) ] ) ,
802
+ pkg!( ( "l" , "0.10.0" ) => [ dep_req( "l-sys" , "0.9" ) ] ) ,
803
+ pkg!( ( "d" , "1.0.0" ) => [ dep_req( "l" , "0.10" ) ] ) ,
804
+ pkg!( ( "r" , "1.0.0" ) => [ dep_req( "l" , "0.9" ) ] ) ,
805
+ ] ) ;
806
+
807
+ let res = resolve ( vec ! [ dep_req( "d" , "1" ) , dep_req( "r" , "1" ) ] , & reg) . unwrap ( ) ;
808
+
809
+ assert_same (
810
+ & res,
811
+ & names ( & [
812
+ ( "root" , "1.0.0" ) ,
813
+ ( "d" , "1.0.0" ) ,
814
+ ( "r" , "1.0.0" ) ,
815
+ ( "l-sys" , "0.9.1" ) ,
816
+ ( "l" , "0.9.1" ) ,
817
+ ( "l" , "0.10.0" ) ,
818
+ ] ) ,
819
+ ) ;
820
+ }
821
+
608
822
#[ test]
609
823
fn resolving_with_sys_crates ( ) {
610
824
// This is based on issues/4902
0 commit comments