@@ -8,7 +8,8 @@ use cargo_util::is_ci;
88use  resolver_tests:: { 
99    assert_contains,  assert_same,  dep,  dep_kind,  dep_loc,  dep_req,  loc_names,  names,  pkg,  pkg_id, 
1010    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 , 
1213} ; 
1314
1415use  proptest:: prelude:: * ; 
@@ -425,6 +426,190 @@ fn test_resolving_maximum_version_with_transitive_deps() {
425426    assert ! ( !res. contains( & ( "util" ,  "1.1.1" ) . to_pkgid( ) ) ) ; 
426427} 
427428
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+ 
428613#[ test]  
429614fn  test_resolving_minimum_version_with_transitive_deps ( )  { 
430615    let  reg = registry ( vec ! [ 
@@ -605,6 +790,35 @@ fn resolving_with_deep_backtracking() {
605790    ) ; 
606791} 
607792
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+ 
608822#[ test]  
609823fn  resolving_with_sys_crates ( )  { 
610824    // This is based on issues/4902 
0 commit comments