Package logilab :: Package common :: Package test :: Module unittest_compat
[frames] | no frames]

Source Code for Module logilab.common.test.unittest_compat

  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   
9 -class CompatTCMixIn:
10 MODNAMES = {} 11 BUILTINS = [] 12 ALTERED_BUILTINS = {} 13
14 - def setUp(self):
15 self.builtins_backup = {} 16 self.modules_backup = {} 17 self.remove_builtins() 18 self.alter_builtins() 19 self.remove_modules()
20
21 - def tearDown(self):
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 # delattr(__builtin__, 'builtin_%s' % funcname) 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
34 - def remove_builtins(self):
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 # setattr(__builtin__, 'builtin_%s' % builtin, func)
41 - def alter_builtins(self):
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 # setattr(__builtin__, 'builtin_%s' % builtin, func) 48
49 - def remove_modules(self):
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
55 - def test_removed_builtins(self):
56 """tests that builtins are actually uncallable""" 57 for builtin in self.BUILTINS: 58 self.assertRaises(NameError, eval, builtin, {})
59
60 - def test_removed_modules(self):
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 # FIXME: use __import__ instead 65 code = compile(import_stmt, 'foo.py', 'exec') 66 self.assertRaises(ImportError, eval, code)
67 68
69 -class Py23CompatTC(CompatTCMixIn, TestCase):
70 BUILTINS = ('enumerate', 'sum') 71 MODNAMES = { 72 'sets' : ('Set', 'ImmutableSet'), 73 'itertools' : ('izip', 'chain'), 74 } 75
76 - def test_sum(self):
77 from logilab.common.compat import sum 78 self.assertEquals(sum(range(5)), 10) 79 self.assertRaises(TypeError, sum, 'abc')
80
81 - def test_enumerate(self):
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
87 - def test_basic_set(self):
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
99 - def test_basic_set(self):
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
113 - def test_frozenset(self):
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'} # frozenset should be hashable 120 d[s] = 'bar' 121 self.assertEquals(len(d), 1) 122 self.assertEquals(d[s], 'bar')
123 124
125 -class Py24CompatTC(CompatTCMixIn, TestCase):
126 BUILTINS = ('reversed', 'sorted', 'set', 'frozenset',) 127
128 - def test_sorted(self):
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
142 - def test_reversed(self):
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
149 - def test_set(self):
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
159 -class _MaxFaker(object):
160 - def __init__(self, func):
161 self.func = func
162 - def fake(self,*args,**kargs):
163 if kargs: 164 raise TypeError("max() takes no keyword argument") 165 return self.func(*args)
166 167
168 -class Py25CompatTC(CompatTCMixIn, TestCase):
169 BUILTINS = ('any', 'all',) 170 ALTERED_BUILTINS = {'max': _MaxFaker(max).fake} 171
172 - def test_any(self):
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 # python2.5's any consumes iterables 182 irange = iter(range(10)) 183 self.assertEquals(any(irange), True) 184 self.assertEquals(irange.next(), 2)
185 186
187 - def test_all(self):
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 # python2.5's all consumes iterables 197 irange = iter(range(10)) 198 self.assertEquals(all(irange), False) 199 self.assertEquals(irange.next(), 1)
200
201 - def test_max(self):
202 from logilab.common.compat import max 203 204 # old apy 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 # new apy 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