1 """provides unit tests for compat module"""
2
3 from logilab.common.testlib import TestCase, unittest_main
4 import sys
5 import types
6 import __builtin__
7 import pprint
8
10 MODNAMES = {}
11 BUILTINS = []
12 ALTERED_BUILTINS = {}
13
20
22 for modname in self.MODNAMES:
23 del sys.modules[modname]
24 for funcname, func in self.builtins_backup.items():
25 setattr(__builtin__, funcname, func)
26
27 for modname, mod in self.modules_backup.items():
28 sys.modules[modname] = mod
29 try:
30 del sys.modules['logilab.common.compat']
31 except KeyError:
32 pass
33
35 for builtin in self.BUILTINS:
36 func = getattr(__builtin__, builtin, None)
37 if func is not None:
38 self.builtins_backup[builtin] = func
39 delattr(__builtin__, builtin)
40
42 for builtin, func in self.ALTERED_BUILTINS.iteritems():
43 old_func = getattr(__builtin__, builtin, None)
44 if func is not None:
45 self.builtins_backup[builtin] = old_func
46 setattr(__builtin__, builtin, func)
47
48
50 for modname in self.MODNAMES:
51 if modname in sys.modules:
52 self.modules_backup[modname] = sys.modules[modname]
53 sys.modules[modname] = types.ModuleType('faked%s' % modname)
54
56 """tests that builtins are actually uncallable"""
57 for builtin in self.BUILTINS:
58 self.assertRaises(NameError, eval, builtin, {})
59
61 """tests that builtins are actually emtpy"""
62 for modname, funcnames in self.MODNAMES.items():
63 import_stmt = 'from %s import %s' % (modname, ', '.join(funcnames))
64
65 code = compile(import_stmt, 'foo.py', 'exec')
66 self.assertRaises(ImportError, eval, code)
67
68
70 BUILTINS = ('enumerate', 'sum')
71 MODNAMES = {
72 'sets' : ('Set', 'ImmutableSet'),
73 'itertools' : ('izip', 'chain'),
74 }
75
77 from logilab.common.compat import sum
78 self.assertEquals(sum(range(5)), 10)
79 self.assertRaises(TypeError, sum, 'abc')
80
82 from logilab.common.compat import enumerate
83 self.assertEquals(list(enumerate([])), [])
84 self.assertEquals(list(enumerate('abc')),
85 [(0, 'a'), (1, 'b'), (2, 'c')])
86
88 from logilab.common.compat import set
89 s = set('abc')
90 self.assertEquals(len(s), 3)
91 s.remove('a')
92 self.assertEquals(len(s), 2)
93 s.add('a')
94 self.assertEquals(len(s), 3)
95 s.add('a')
96 self.assertEquals(len(s), 3)
97 self.assertRaises(KeyError, s.remove, 'd')
98
100 from logilab.common.compat import set
101 s = set('abc')
102 self.assertEquals(len(s), 3)
103 s.remove('a')
104 self.assertEquals(len(s), 2)
105 s.add('a')
106 self.assertEquals(len(s), 3)
107 s.add('a')
108 self.assertEquals(len(s), 3)
109 self.assertRaises(KeyError, s.remove, 'd')
110 self.assertRaises(TypeError, dict, [(s, 'foo')])
111
112
114 from logilab.common.compat import frozenset
115 s = frozenset('abc')
116 self.assertEquals(len(s), 3)
117 self.assertRaises(AttributeError, getattr, s, 'remove')
118 self.assertRaises(AttributeError, getattr, s, 'add')
119 d = {s : 'foo'}
120 d[s] = 'bar'
121 self.assertEquals(len(d), 1)
122 self.assertEquals(d[s], 'bar')
123
124
126 BUILTINS = ('reversed', 'sorted', 'set', 'frozenset',)
127
129 from logilab.common.compat import sorted
130 l = [3, 1, 2, 5, 4]
131 s = sorted(l)
132 self.assertEquals(s, [1, 2, 3, 4, 5])
133 self.assertEquals(l, [3, 1, 2, 5, 4])
134 self.assertEquals(sorted('FeCBaD'), list('BCDFae'))
135 self.assertEquals(sorted('FeCBaD', key=str.lower), list('aBCDeF'))
136 self.assertEquals(sorted('FeCBaD', key=str.lower, reverse=True), list('FeDCBa'))
137 def strcmp(s1, s2):
138 return cmp(s1.lower(), s2.lower())
139 self.assertEquals(sorted('FeCBaD', cmp=strcmp), list('aBCDeF'))
140
141
143 from logilab.common.compat import reversed
144 l = range(5)
145 r = reversed(l)
146 self.assertEquals(r, [4, 3, 2, 1, 0])
147 self.assertEquals(l, range(5))
148
150 from logilab.common.compat import set
151 s1 = set(range(5))
152 s2 = set(range(2, 6))
153 self.assertEquals(len(s1), 5)
154 self.assertEquals(s1 & s2, set([2, 3, 4]))
155 self.assertEquals(s1 | s2, set(range(6)))
156
157
158
162 - def fake(self,*args,**kargs):
163 if kargs:
164 raise TypeError("max() takes no keyword argument")
165 return self.func(*args)
166
167
169 BUILTINS = ('any', 'all',)
170 ALTERED_BUILTINS = {'max': _MaxFaker(max).fake}
171
173 from logilab.common.compat import any
174 testdata = ([], (), '', 'abc', xrange(0, 10), xrange(0, -10, -1))
175 self.assertEquals(any([]), False)
176 self.assertEquals(any(()), False)
177 self.assertEquals(any(''), False)
178 self.assertEquals(any('abc'), True)
179 self.assertEquals(any(xrange(10)), True)
180 self.assertEquals(any(xrange(0, -10, -1)), True)
181
182 irange = iter(range(10))
183 self.assertEquals(any(irange), True)
184 self.assertEquals(irange.next(), 2)
185
186
188 from logilab.common.compat import all
189 testdata = ([], (), '', 'abc', xrange(0, 10), xrange(0, -10, -1))
190 self.assertEquals(all([]), True)
191 self.assertEquals(all(()), True)
192 self.assertEquals(all(''), True)
193 self.assertEquals(all('abc'), True)
194 self.assertEquals(all(xrange(10)), False)
195 self.assertEquals(all(xrange(0, -10, -1)), False)
196
197 irange = iter(range(10))
198 self.assertEquals(all(irange), False)
199 self.assertEquals(irange.next(), 1)
200
202 from logilab.common.compat import max
203
204
205 self.assertEquals(max("fdjkmhsgmdfhsg"),'s')
206 self.assertEquals(max(1,43,12,45,1337,34,2), 1337)
207 self.assertRaises(TypeError,max)
208 self.assertRaises(TypeError,max,1)
209 self.assertRaises(ValueError,max,[])
210 self.assertRaises(TypeError,max,bob=None)
211
212
213 self.assertEquals(max("shorter","longer",key=len),"shorter")
214 self.assertEquals(max(((1,1),(2,3,5),(8,13,21)),key=len),(2,3,5))
215 self.assertEquals(max(((1,1),(42,),(2,3,5),(8,13,21)),key=max),(42,))
216 self.assertRaises(TypeError,max,key=None)
217 self.assertRaises(TypeError,max,1,key=len)
218 self.assertRaises(ValueError,max,[],key=max)
219 self.assertRaises(TypeError,max,"shorter","longer",key=len,kathy=None)
220
221 if __name__ == '__main__':
222 unittest_main()
223