@@ -1679,6 +1679,53 @@ fn test_conditional_requirements_multiple_versions_met() {
1679
1679
"### ) ;
1680
1680
}
1681
1681
1682
+ #[ test]
1683
+ fn test_conditional_requirements_conflict ( ) {
1684
+ let mut provider = BundleBoxProvider :: new ( ) ;
1685
+
1686
+ // Add multiple versions of package b
1687
+ provider. add_package ( "b" , 1 . into ( ) , & [ ] , & [ ] ) ;
1688
+ provider. add_package ( "b" , 2 . into ( ) , & [ ] , & [ ] ) ;
1689
+ provider. add_package ( "b" , 3 . into ( ) , & [ ] , & [ ] ) ;
1690
+
1691
+ // Package c has two versions with different dependencies
1692
+ provider. add_package ( "c" , 1 . into ( ) , & [ "d 1" ] , & [ ] ) ; // c v1 requires d v1
1693
+ provider. add_package ( "c" , 2 . into ( ) , & [ "d 2" ] , & [ ] ) ; // c v2 requires d v2
1694
+
1695
+ // Package d has incompatible versions
1696
+ provider. add_package ( "d" , 1 . into ( ) , & [ ] , & [ ] ) ;
1697
+ provider. add_package ( "d" , 2 . into ( ) , & [ ] , & [ ] ) ;
1698
+
1699
+ provider. add_package ( "a" , 1 . into ( ) , & [ "b 1" , "c 1; if b 1" , "d 2" , "c 2; if b 2" ] , & [ ] ) ;
1700
+
1701
+ let requirements = provider. requirements ( & [
1702
+ "a" , // Require package a
1703
+ ] ) ;
1704
+
1705
+ let mut solver = Solver :: new ( provider) ;
1706
+ let problem = Problem :: new ( ) . requirements ( requirements) ;
1707
+
1708
+ // This should fail to solve because:
1709
+ // 1. When b=1 is chosen, it triggers the conditional requirement for c 1
1710
+ // 2. c 1 requires d 1, but a requires d 2
1711
+ // 3. d 1 and d 2 cannot be installed together
1712
+
1713
+ let solved = solver. solve ( problem) ;
1714
+ assert ! ( solved. is_err( ) ) ;
1715
+
1716
+ let conflict = solved. unwrap_err ( ) ;
1717
+ match conflict {
1718
+ UnsolvableOrCancelled :: Unsolvable ( conflict) => {
1719
+ let graph = conflict. graph ( & solver) ;
1720
+ let mut output = stderr ( ) ;
1721
+ graph
1722
+ . graphviz ( & mut output, solver. provider ( ) , true )
1723
+ . unwrap ( ) ;
1724
+ }
1725
+ _ => panic ! ( "Expected a conflict" ) ,
1726
+ }
1727
+ }
1728
+
1682
1729
/// In this test, the resolver installs the highest available version of b which is b 2
1683
1730
/// However, the conditional requirement is that if b 1..2 is installed, require c
1684
1731
/// Since b 2 is installed, c should not be installed
0 commit comments