6
6
import unittest
7
7
from itertools import *
8
8
9
+
9
10
class CombinationsTests (unittest .TestCase ):
10
11
11
12
def test_combinations_with_replacement (self ):
@@ -24,3 +25,76 @@ def test_combinations_with_replacement(self):
24
25
compare += a ;
25
26
self .assertEqual (result ,compare )
26
27
28
+
29
+ def test_groupby (self ):
30
+ # Check whether it accepts arguments correctly
31
+ self .assertEqual ([], list (groupby ([])))
32
+ self .assertEqual ([], list (groupby ([], key = id )))
33
+ self .assertRaises (TypeError , list , groupby ('abc' , []))
34
+ self .assertRaises (TypeError , groupby , None )
35
+ self .assertRaises (TypeError , groupby , 'abc' , lambda x :x , 10 )
36
+
37
+ # Check normal input
38
+ s = [(0 , 10 , 20 ), (0 , 11 ,21 ), (0 ,12 ,21 ), (1 ,13 ,21 ), (1 ,14 ,22 ),
39
+ (2 ,15 ,22 ), (3 ,16 ,23 ), (3 ,17 ,23 )]
40
+ dup = []
41
+ for k , g in groupby (s , lambda r :r [0 ]):
42
+ for elem in g :
43
+ self .assertEqual (k , elem [0 ])
44
+ dup .append (elem )
45
+ self .assertEqual (s , dup )
46
+
47
+ # Exercise pipes and filters style
48
+ s = 'abracadabra'
49
+ # sort s | uniq
50
+ r = [k for k , g in groupby (sorted (s ))]
51
+ self .assertEqual (r , ['a' , 'b' , 'c' , 'd' , 'r' ])
52
+ # sort s | uniq -d
53
+ r = [k for k , g in groupby (sorted (s )) if list (islice (g ,1 ,2 ))]
54
+ self .assertEqual (r , ['a' , 'b' , 'r' ])
55
+ # sort s | uniq -c
56
+ r = [(len (list (g )), k ) for k , g in groupby (sorted (s ))]
57
+ self .assertEqual (r , [(5 , 'a' ), (2 , 'b' ), (1 , 'c' ), (1 , 'd' ), (2 , 'r' )])
58
+ # sort s | uniq -c | sort -rn | head -3
59
+ r = sorted ([(len (list (g )) , k ) for k , g in groupby (sorted (s ))], reverse = True )[:3 ]
60
+ self .assertEqual (r , [(5 , 'a' ), (2 , 'r' ), (2 , 'b' )])
61
+
62
+ # iter.__next__ failure
63
+ class ExpectedError (Exception ):
64
+ pass
65
+ def delayed_raise (n = 0 ):
66
+ for i in range (n ):
67
+ yield 'yo'
68
+ raise ExpectedError
69
+ def gulp (iterable , keyp = None , func = list ):
70
+ return [func (g ) for k , g in groupby (iterable , keyp )]
71
+
72
+ # iter.__next__ failure on outer object
73
+ self .assertRaises (ExpectedError , gulp , delayed_raise (0 ))
74
+ # iter.__next__ failure on inner object
75
+ self .assertRaises (ExpectedError , gulp , delayed_raise (1 ))
76
+
77
+ # __eq__ failure
78
+ class DummyCmp :
79
+ def __eq__ (self , dst ):
80
+ raise ExpectedError
81
+ s = [DummyCmp (), DummyCmp (), None ]
82
+
83
+ # __eq__ failure on outer object
84
+ self .assertRaises (ExpectedError , gulp , s , func = id )
85
+ # __eq__ failure on inner object
86
+ self .assertRaises (ExpectedError , gulp , s )
87
+
88
+ # keyfunc failure
89
+ def keyfunc (obj ):
90
+ if keyfunc .skip > 0 :
91
+ keyfunc .skip -= 1
92
+ return obj
93
+ else :
94
+ raise ExpectedError
95
+
96
+ # keyfunc failure on outer object
97
+ keyfunc .skip = 0
98
+ self .assertRaises (ExpectedError , gulp , [None ], keyfunc )
99
+ keyfunc .skip = 1
100
+ self .assertRaises (ExpectedError , gulp , [None , None ], keyfunc )
0 commit comments