@@ -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,112 @@ 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_wildcard_major_duplicate_selection ( ) {
473
+ let reg = registry ( vec ! [
474
+ pkg!( "foo" => [ dep_req( "util" , "0.*" ) ] ) ,
475
+ pkg!( "bar" => [ dep_req( "util" , "0.2" ) ] ) ,
476
+ pkg!( "car" => [ dep_req( "util" , "0.1" ) ] ) ,
477
+ pkg!( ( "util" , "0.1.0" ) ) ,
478
+ pkg!( ( "util" , "0.2.0" ) ) ,
479
+ ] ) ;
480
+
481
+ let res = resolve_with_global_context_raw (
482
+ vec ! [
483
+ dep_req( "foo" , "1.0.0" ) ,
484
+ dep_req( "bar" , "1.0.0" ) ,
485
+ dep_req( "car" , "1.0.0" ) ,
486
+ ] ,
487
+ & reg,
488
+ & GlobalContext :: default ( ) . unwrap ( ) ,
489
+ )
490
+ . unwrap ( ) ;
491
+
492
+ // In this case, both 0.1.0 and 0.2.0 satisfy foo. It should pick the highest
493
+ // version.
494
+ assert_eq ! (
495
+ res. deps( pkg_id( "foo" ) ) . next( ) . unwrap( ) . 0 ,
496
+ ( "util" , "0.2.0" ) . to_pkgid( )
497
+ ) ;
498
+
499
+ let res = res. sort ( ) ;
500
+
501
+ assert_same (
502
+ & res,
503
+ & names ( & [
504
+ ( "root" , "1.0.0" ) ,
505
+ ( "foo" , "1.0.0" ) ,
506
+ ( "bar" , "1.0.0" ) ,
507
+ ( "car" , "1.0.0" ) ,
508
+ ( "util" , "0.1.0" ) ,
509
+ ( "util" , "0.2.0" ) ,
510
+ ] ) ,
511
+ ) ;
512
+ }
513
+
514
+ #[ test]
515
+ fn test_range_major ( ) {
516
+ let reg = registry ( vec ! [
517
+ pkg!( "foo" => [ dep_req( "util" , ">=0.1,<0.3" ) ] ) ,
518
+ pkg!( ( "util" , "0.1.0" ) ) ,
519
+ pkg!( ( "util" , "0.2.0" ) ) ,
520
+ ] ) ;
521
+
522
+ let res = resolve_and_validated (
523
+ vec ! [ dep_req( "foo" , "1.0.0" ) , dep_req( "util" , "0.1.0" ) ] ,
524
+ & reg,
525
+ None ,
526
+ )
527
+ . unwrap ( ) ;
528
+
529
+ assert_same (
530
+ & res,
531
+ & names ( & [ ( "root" , "1.0.0" ) , ( "foo" , "1.0.0" ) , ( "util" , "0.1.0" ) ] ) ,
532
+ ) ;
533
+ }
534
+
428
535
#[ test]
429
536
fn test_resolving_minimum_version_with_transitive_deps ( ) {
430
537
let reg = registry ( vec ! [
@@ -621,6 +728,34 @@ fn resolving_with_sys_crates() {
621
728
622
729
let res = resolve ( vec ! [ dep_req( "d" , "1" ) , dep_req( "r" , "1" ) ] , & reg) . unwrap ( ) ;
623
730
731
+ assert_same (
732
+ & res,
733
+ & names ( & [
734
+ ( "root" , "1.0.0" ) ,
735
+ ( "d" , "1.0.0" ) ,
736
+ ( "r" , "1.0.0" ) ,
737
+ ( "l-sys" , "0.9.1" ) ,
738
+ ( "l" , "0.9.1" ) ,
739
+ ] ) ,
740
+ ) ;
741
+ }
742
+
743
+ #[ test]
744
+ fn resolving_with_sys_crates_duplicates ( ) {
745
+ // This is based on issues/4902
746
+ // With `l` a normal library we get 2copies so everyone gets the newest compatible.
747
+ // But `l-sys` a library with a links attribute we make sure there is only one.
748
+ let reg = registry ( vec ! [
749
+ pkg!( ( "l-sys" , "0.9.1" ) ) ,
750
+ pkg!( ( "l-sys" , "0.10.0" ) ) ,
751
+ pkg!( ( "l" , "0.9.1" ) => [ dep_req( "l-sys" , ">=0.8.0, <=0.10.0" ) ] ) ,
752
+ pkg!( ( "l" , "0.10.0" ) => [ dep_req( "l-sys" , "0.9" ) ] ) ,
753
+ pkg!( ( "d" , "1.0.0" ) => [ dep_req( "l" , "0.10" ) ] ) ,
754
+ pkg!( ( "r" , "1.0.0" ) => [ dep_req( "l" , "0.9" ) ] ) ,
755
+ ] ) ;
756
+
757
+ let res = resolve ( vec ! [ dep_req( "d" , "1" ) , dep_req( "r" , "1" ) ] , & reg) . unwrap ( ) ;
758
+
624
759
assert_same (
625
760
& res,
626
761
& names ( & [
0 commit comments