@@ -1586,5 +1586,111 @@ def test_cloned_func_with_converter_exception_message(self):
15861586self .assertEqual (func (),name )
15871587
15881588
1589+ class PermutationTests (unittest .TestCase ):
1590+ """Test permutation support functions."""
1591+
1592+ def test_permute_left_option_groups (self ):
1593+ expected = (
1594+ (),
1595+ (3 ,),
1596+ (2 ,3 ),
1597+ (1 ,2 ,3 ),
1598+ )
1599+ data = list (zip ([1 ,2 ,3 ]))# Generate a list of 1-tuples.
1600+ actual = tuple (clinic .permute_left_option_groups (data ))
1601+ self .assertEqual (actual ,expected )
1602+
1603+ def test_permute_right_option_groups (self ):
1604+ expected = (
1605+ (),
1606+ (1 ,),
1607+ (1 ,2 ),
1608+ (1 ,2 ,3 ),
1609+ )
1610+ data = list (zip ([1 ,2 ,3 ]))# Generate a list of 1-tuples.
1611+ actual = tuple (clinic .permute_right_option_groups (data ))
1612+ self .assertEqual (actual ,expected )
1613+
1614+ def test_permute_optional_groups (self ):
1615+ empty = {
1616+ "left" : (),"required" : (),"right" : (),
1617+ "expected" : ((),),
1618+ }
1619+ noleft1 = {
1620+ "left" : (),"required" : ("b" ,),"right" : ("c" ,),
1621+ "expected" : (
1622+ ("b" ,),
1623+ ("b" ,"c" ),
1624+ ),
1625+ }
1626+ noleft2 = {
1627+ "left" : (),"required" : ("b" ,"c" ,),"right" : ("d" ,),
1628+ "expected" : (
1629+ ("b" ,"c" ),
1630+ ("b" ,"c" ,"d" ),
1631+ ),
1632+ }
1633+ noleft3 = {
1634+ "left" : (),"required" : ("b" ,"c" ,),"right" : ("d" ,"e" ),
1635+ "expected" : (
1636+ ("b" ,"c" ),
1637+ ("b" ,"c" ,"d" ),
1638+ ("b" ,"c" ,"d" ,"e" ),
1639+ ),
1640+ }
1641+ noright1 = {
1642+ "left" : ("a" ,),"required" : ("b" ,),"right" : (),
1643+ "expected" : (
1644+ ("b" ,),
1645+ ("a" ,"b" ),
1646+ ),
1647+ }
1648+ noright2 = {
1649+ "left" : ("a" ,),"required" : ("b" ,"c" ),"right" : (),
1650+ "expected" : (
1651+ ("b" ,"c" ),
1652+ ("a" ,"b" ,"c" ),
1653+ ),
1654+ }
1655+ noright3 = {
1656+ "left" : ("a" ,"b" ),"required" : ("c" ,),"right" : (),
1657+ "expected" : (
1658+ ("c" ,),
1659+ ("b" ,"c" ),
1660+ ("a" ,"b" ,"c" ),
1661+ ),
1662+ }
1663+ leftandright1 = {
1664+ "left" : ("a" ,),"required" : ("b" ,),"right" : ("c" ,),
1665+ "expected" : (
1666+ ("b" ,),
1667+ ("a" ,"b" ),# Prefer left.
1668+ ("a" ,"b" ,"c" ),
1669+ ),
1670+ }
1671+ leftandright2 = {
1672+ "left" : ("a" ,"b" ),"required" : ("c" ,"d" ),"right" : ("e" ,"f" ),
1673+ "expected" : (
1674+ ("c" ,"d" ),
1675+ ("b" ,"c" ,"d" ),# Prefer left.
1676+ ("a" ,"b" ,"c" ,"d" ),# Prefer left.
1677+ ("a" ,"b" ,"c" ,"d" ,"e" ),
1678+ ("a" ,"b" ,"c" ,"d" ,"e" ,"f" ),
1679+ ),
1680+ }
1681+ dataset = (
1682+ empty ,
1683+ noleft1 ,noleft2 ,noleft3 ,
1684+ noright1 ,noright2 ,noright3 ,
1685+ leftandright1 ,leftandright2 ,
1686+ )
1687+ for params in dataset :
1688+ with self .subTest (** params ):
1689+ left ,required ,right ,expected = params .values ()
1690+ permutations = clinic .permute_optional_groups (left ,required ,right )
1691+ actual = tuple (permutations )
1692+ self .assertEqual (actual ,expected )
1693+
1694+
15891695if __name__ == "__main__" :
15901696unittest .main ()