blob: 27501c246698bc41b65861aebee10f1b548ba433 [file] [log] [blame]
Fred Drakecd112f52001-08-11 03:21:35 +00001import unittest
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +03002import pickle
3import sys
Barry Warsawa09ec191996-12-18 19:56:22 +00004
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Barry Warsawa09ec191996-12-18 19:56:22 +00006
Antoine Pitroua85017f2013-04-20 19:21:44 +02007py_operator = support.import_fresh_module('operator', blocked=['_operator'])
8c_operator = support.import_fresh_module('operator', fresh=['_operator'])
9
Armin Rigofd163f92005-12-29 15:59:19 +000010class Seq1:
11 def __init__(self, lst):
12 self.lst = lst
13 def __len__(self):
14 return len(self.lst)
15 def __getitem__(self, i):
16 return self.lst[i]
17 def __add__(self, other):
18 return self.lst + other.lst
19 def __mul__(self, other):
20 return self.lst * other
21 def __rmul__(self, other):
22 return other * self.lst
23
24class Seq2(object):
25 def __init__(self, lst):
26 self.lst = lst
27 def __len__(self):
28 return len(self.lst)
29 def __getitem__(self, i):
30 return self.lst[i]
31 def __add__(self, other):
32 return self.lst + other.lst
33 def __mul__(self, other):
34 return self.lst * other
35 def __rmul__(self, other):
36 return other * self.lst
37
Barry Warsawa09ec191996-12-18 19:56:22 +000038
Antoine Pitroua85017f2013-04-20 19:21:44 +020039class OperatorTestCase:
Fred Drakecd112f52001-08-11 03:21:35 +000040 def test_lt(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +020041 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000042 self.assertRaises(TypeError, operator.lt)
43 self.assertRaises(TypeError, operator.lt, 1j, 2j)
44 self.assertFalse(operator.lt(1, 0))
45 self.assertFalse(operator.lt(1, 0.0))
46 self.assertFalse(operator.lt(1, 1))
47 self.assertFalse(operator.lt(1, 1.0))
48 self.assertTrue(operator.lt(1, 2))
49 self.assertTrue(operator.lt(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +000050
51 def test_le(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +020052 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000053 self.assertRaises(TypeError, operator.le)
54 self.assertRaises(TypeError, operator.le, 1j, 2j)
55 self.assertFalse(operator.le(1, 0))
56 self.assertFalse(operator.le(1, 0.0))
57 self.assertTrue(operator.le(1, 1))
58 self.assertTrue(operator.le(1, 1.0))
59 self.assertTrue(operator.le(1, 2))
60 self.assertTrue(operator.le(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +000061
62 def test_eq(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +020063 operator = self.module
Walter Dörwaldbb9c7392004-11-01 17:10:19 +000064 class C(object):
65 def __eq__(self, other):
66 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000067 self.assertRaises(TypeError, operator.eq)
68 self.assertRaises(SyntaxError, operator.eq, C(), C())
69 self.assertFalse(operator.eq(1, 0))
70 self.assertFalse(operator.eq(1, 0.0))
71 self.assertTrue(operator.eq(1, 1))
72 self.assertTrue(operator.eq(1, 1.0))
73 self.assertFalse(operator.eq(1, 2))
74 self.assertFalse(operator.eq(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +000075
76 def test_ne(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +020077 operator = self.module
Walter Dörwaldbb9c7392004-11-01 17:10:19 +000078 class C(object):
79 def __ne__(self, other):
80 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000081 self.assertRaises(TypeError, operator.ne)
82 self.assertRaises(SyntaxError, operator.ne, C(), C())
83 self.assertTrue(operator.ne(1, 0))
84 self.assertTrue(operator.ne(1, 0.0))
85 self.assertFalse(operator.ne(1, 1))
86 self.assertFalse(operator.ne(1, 1.0))
87 self.assertTrue(operator.ne(1, 2))
88 self.assertTrue(operator.ne(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +000089
90 def test_ge(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +020091 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000092 self.assertRaises(TypeError, operator.ge)
93 self.assertRaises(TypeError, operator.ge, 1j, 2j)
94 self.assertTrue(operator.ge(1, 0))
95 self.assertTrue(operator.ge(1, 0.0))
96 self.assertTrue(operator.ge(1, 1))
97 self.assertTrue(operator.ge(1, 1.0))
98 self.assertFalse(operator.ge(1, 2))
99 self.assertFalse(operator.ge(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +0000100
101 def test_gt(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200102 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000103 self.assertRaises(TypeError, operator.gt)
104 self.assertRaises(TypeError, operator.gt, 1j, 2j)
105 self.assertTrue(operator.gt(1, 0))
106 self.assertTrue(operator.gt(1, 0.0))
107 self.assertFalse(operator.gt(1, 1))
108 self.assertFalse(operator.gt(1, 1.0))
109 self.assertFalse(operator.gt(1, 2))
110 self.assertFalse(operator.gt(1, 2.0))
Fred Drakecd112f52001-08-11 03:21:35 +0000111
112 def test_abs(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200113 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000114 self.assertRaises(TypeError, operator.abs)
115 self.assertRaises(TypeError, operator.abs, None)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000116 self.assertEqual(operator.abs(-1), 1)
117 self.assertEqual(operator.abs(1), 1)
Fred Drakecd112f52001-08-11 03:21:35 +0000118
119 def test_add(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200120 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000121 self.assertRaises(TypeError, operator.add)
122 self.assertRaises(TypeError, operator.add, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200123 self.assertEqual(operator.add(3, 4), 7)
Fred Drakecd112f52001-08-11 03:21:35 +0000124
125 def test_bitwise_and(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200126 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000127 self.assertRaises(TypeError, operator.and_)
128 self.assertRaises(TypeError, operator.and_, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200129 self.assertEqual(operator.and_(0xf, 0xa), 0xa)
Fred Drakecd112f52001-08-11 03:21:35 +0000130
131 def test_concat(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200132 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000133 self.assertRaises(TypeError, operator.concat)
134 self.assertRaises(TypeError, operator.concat, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200135 self.assertEqual(operator.concat('py', 'thon'), 'python')
136 self.assertEqual(operator.concat([1, 2], [3, 4]), [1, 2, 3, 4])
137 self.assertEqual(operator.concat(Seq1([5, 6]), Seq1([7])), [5, 6, 7])
138 self.assertEqual(operator.concat(Seq2([5, 6]), Seq2([7])), [5, 6, 7])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000139 self.assertRaises(TypeError, operator.concat, 13, 29)
Fred Drakecd112f52001-08-11 03:21:35 +0000140
141 def test_countOf(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200142 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000143 self.assertRaises(TypeError, operator.countOf)
144 self.assertRaises(TypeError, operator.countOf, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200145 self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
146 self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
Fred Drakecd112f52001-08-11 03:21:35 +0000147
148 def test_delitem(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200149 operator = self.module
Fred Drakecd112f52001-08-11 03:21:35 +0000150 a = [4, 3, 2, 1]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000151 self.assertRaises(TypeError, operator.delitem, a)
152 self.assertRaises(TypeError, operator.delitem, a, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200153 self.assertIsNone(operator.delitem(a, 1))
154 self.assertEqual(a, [4, 2, 1])
Fred Drakecd112f52001-08-11 03:21:35 +0000155
Fred Drakecd112f52001-08-11 03:21:35 +0000156 def test_floordiv(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200157 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000158 self.assertRaises(TypeError, operator.floordiv, 5)
159 self.assertRaises(TypeError, operator.floordiv, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200160 self.assertEqual(operator.floordiv(5, 2), 2)
Fred Drakecd112f52001-08-11 03:21:35 +0000161
162 def test_truediv(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200163 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000164 self.assertRaises(TypeError, operator.truediv, 5)
165 self.assertRaises(TypeError, operator.truediv, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200166 self.assertEqual(operator.truediv(5, 2), 2.5)
Fred Drakecd112f52001-08-11 03:21:35 +0000167
168 def test_getitem(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200169 operator = self.module
Fred Drakecd112f52001-08-11 03:21:35 +0000170 a = range(10)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000171 self.assertRaises(TypeError, operator.getitem)
172 self.assertRaises(TypeError, operator.getitem, a, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200173 self.assertEqual(operator.getitem(a, 2), 2)
Fred Drakecd112f52001-08-11 03:21:35 +0000174
Fred Drakecd112f52001-08-11 03:21:35 +0000175 def test_indexOf(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200176 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000177 self.assertRaises(TypeError, operator.indexOf)
178 self.assertRaises(TypeError, operator.indexOf, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200179 self.assertEqual(operator.indexOf([4, 3, 2, 1], 3), 1)
Fred Drakecd112f52001-08-11 03:21:35 +0000180 self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
181
182 def test_invert(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200183 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000184 self.assertRaises(TypeError, operator.invert)
185 self.assertRaises(TypeError, operator.invert, None)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000186 self.assertEqual(operator.inv(4), -5)
Fred Drakecd112f52001-08-11 03:21:35 +0000187
Fred Drakecd112f52001-08-11 03:21:35 +0000188 def test_lshift(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200189 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000190 self.assertRaises(TypeError, operator.lshift)
191 self.assertRaises(TypeError, operator.lshift, None, 42)
Antoine Pitrou870db902015-07-26 13:11:49 +0200192 self.assertEqual(operator.lshift(5, 1), 10)
193 self.assertEqual(operator.lshift(5, 0), 5)
Fred Drakecd112f52001-08-11 03:21:35 +0000194 self.assertRaises(ValueError, operator.lshift, 2, -1)
195
196 def test_mod(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200197 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000198 self.assertRaises(TypeError, operator.mod)
199 self.assertRaises(TypeError, operator.mod, None, 42)
Antoine Pitrou870db902015-07-26 13:11:49 +0200200 self.assertEqual(operator.mod(5, 2), 1)
Fred Drakecd112f52001-08-11 03:21:35 +0000201
202 def test_mul(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200203 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000204 self.assertRaises(TypeError, operator.mul)
205 self.assertRaises(TypeError, operator.mul, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200206 self.assertEqual(operator.mul(5, 2), 10)
Fred Drakecd112f52001-08-11 03:21:35 +0000207
Benjamin Petersond51374e2014-04-09 23:55:56 -0400208 def test_matmul(self):
209 operator = self.module
210 self.assertRaises(TypeError, operator.matmul)
211 self.assertRaises(TypeError, operator.matmul, 42, 42)
212 class M:
213 def __matmul__(self, other):
214 return other - 1
215 self.assertEqual(M() @ 42, 41)
216
Fred Drakecd112f52001-08-11 03:21:35 +0000217 def test_neg(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200218 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000219 self.assertRaises(TypeError, operator.neg)
220 self.assertRaises(TypeError, operator.neg, None)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000221 self.assertEqual(operator.neg(5), -5)
222 self.assertEqual(operator.neg(-5), 5)
223 self.assertEqual(operator.neg(0), 0)
224 self.assertEqual(operator.neg(-0), 0)
Fred Drakecd112f52001-08-11 03:21:35 +0000225
226 def test_bitwise_or(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200227 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000228 self.assertRaises(TypeError, operator.or_)
229 self.assertRaises(TypeError, operator.or_, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200230 self.assertEqual(operator.or_(0xa, 0x5), 0xf)
Fred Drakecd112f52001-08-11 03:21:35 +0000231
232 def test_pos(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200233 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000234 self.assertRaises(TypeError, operator.pos)
235 self.assertRaises(TypeError, operator.pos, None)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000236 self.assertEqual(operator.pos(5), 5)
237 self.assertEqual(operator.pos(-5), -5)
238 self.assertEqual(operator.pos(0), 0)
239 self.assertEqual(operator.pos(-0), 0)
Fred Drakecd112f52001-08-11 03:21:35 +0000240
Raymond Hettinger5959c552002-08-19 03:19:09 +0000241 def test_pow(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200242 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000243 self.assertRaises(TypeError, operator.pow)
244 self.assertRaises(TypeError, operator.pow, None, None)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000245 self.assertEqual(operator.pow(3,5), 3**5)
Raymond Hettinger5959c552002-08-19 03:19:09 +0000246 self.assertRaises(TypeError, operator.pow, 1)
247 self.assertRaises(TypeError, operator.pow, 1, 2, 3)
248
Fred Drakecd112f52001-08-11 03:21:35 +0000249 def test_rshift(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200250 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000251 self.assertRaises(TypeError, operator.rshift)
252 self.assertRaises(TypeError, operator.rshift, None, 42)
Antoine Pitrou870db902015-07-26 13:11:49 +0200253 self.assertEqual(operator.rshift(5, 1), 2)
254 self.assertEqual(operator.rshift(5, 0), 5)
Fred Drakecd112f52001-08-11 03:21:35 +0000255 self.assertRaises(ValueError, operator.rshift, 2, -1)
256
257 def test_contains(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200258 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000259 self.assertRaises(TypeError, operator.contains)
260 self.assertRaises(TypeError, operator.contains, None, None)
261 self.assertTrue(operator.contains(range(4), 2))
262 self.assertFalse(operator.contains(range(4), 5))
Fred Drakecd112f52001-08-11 03:21:35 +0000263
264 def test_setitem(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200265 operator = self.module
Guido van Rossum805365e2007-05-07 22:24:25 +0000266 a = list(range(3))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000267 self.assertRaises(TypeError, operator.setitem, a)
268 self.assertRaises(TypeError, operator.setitem, a, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200269 self.assertIsNone(operator.setitem(a, 0, 2))
270 self.assertEqual(a, [2, 1, 2])
Fred Drakecd112f52001-08-11 03:21:35 +0000271 self.assertRaises(IndexError, operator.setitem, a, 4, 2)
272
Fred Drakecd112f52001-08-11 03:21:35 +0000273 def test_sub(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200274 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertRaises(TypeError, operator.sub)
276 self.assertRaises(TypeError, operator.sub, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200277 self.assertEqual(operator.sub(5, 2), 3)
Fred Drakecd112f52001-08-11 03:21:35 +0000278
279 def test_truth(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200280 operator = self.module
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000281 class C(object):
Jack Diederich4dafcc42006-11-28 19:15:13 +0000282 def __bool__(self):
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000283 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000284 self.assertRaises(TypeError, operator.truth)
285 self.assertRaises(SyntaxError, operator.truth, C())
286 self.assertTrue(operator.truth(5))
287 self.assertTrue(operator.truth([0]))
288 self.assertFalse(operator.truth(0))
289 self.assertFalse(operator.truth([]))
Fred Drakecd112f52001-08-11 03:21:35 +0000290
291 def test_bitwise_xor(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200292 operator = self.module
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(TypeError, operator.xor)
294 self.assertRaises(TypeError, operator.xor, None, None)
Antoine Pitrou870db902015-07-26 13:11:49 +0200295 self.assertEqual(operator.xor(0xb, 0xc), 0x7)
Fred Drakecd112f52001-08-11 03:21:35 +0000296
Raymond Hettinger9543b342003-01-18 23:22:20 +0000297 def test_is(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200298 operator = self.module
Raymond Hettinger9543b342003-01-18 23:22:20 +0000299 a = b = 'xyzpdq'
300 c = a[:3] + b[3:]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000301 self.assertRaises(TypeError, operator.is_)
302 self.assertTrue(operator.is_(a, b))
303 self.assertFalse(operator.is_(a,c))
Raymond Hettinger9543b342003-01-18 23:22:20 +0000304
305 def test_is_not(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200306 operator = self.module
Raymond Hettinger9543b342003-01-18 23:22:20 +0000307 a = b = 'xyzpdq'
308 c = a[:3] + b[3:]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000309 self.assertRaises(TypeError, operator.is_not)
310 self.assertFalse(operator.is_not(a, b))
311 self.assertTrue(operator.is_not(a,c))
Fred Drakecd112f52001-08-11 03:21:35 +0000312
Raymond Hettinger166958b2003-12-01 13:18:39 +0000313 def test_attrgetter(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200314 operator = self.module
Raymond Hettinger166958b2003-12-01 13:18:39 +0000315 class A:
316 pass
317 a = A()
318 a.name = 'arthur'
319 f = operator.attrgetter('name')
320 self.assertEqual(f(a), 'arthur')
321 f = operator.attrgetter('rank')
322 self.assertRaises(AttributeError, f, a)
Antoine Pitroue9745712010-10-31 15:26:04 +0000323 self.assertRaises(TypeError, operator.attrgetter, 2)
Raymond Hettinger166958b2003-12-01 13:18:39 +0000324 self.assertRaises(TypeError, operator.attrgetter)
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000325
326 # multiple gets
327 record = A()
328 record.x = 'X'
329 record.y = 'Y'
330 record.z = 'Z'
331 self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
Antoine Pitroue9745712010-10-31 15:26:04 +0000332 self.assertRaises(TypeError, operator.attrgetter, ('x', (), 'y'))
Raymond Hettinger166958b2003-12-01 13:18:39 +0000333
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000334 class C(object):
Christian Heimes9bd667a2008-01-20 15:14:11 +0000335 def __getattr__(self, name):
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000336 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000337 self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000338
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000339 # recursive gets
340 a = A()
341 a.name = 'arthur'
342 a.child = A()
343 a.child.name = 'thomas'
344 f = operator.attrgetter('child.name')
345 self.assertEqual(f(a), 'thomas')
346 self.assertRaises(AttributeError, f, a.child)
347 f = operator.attrgetter('name', 'child.name')
348 self.assertEqual(f(a), ('arthur', 'thomas'))
349 f = operator.attrgetter('name', 'child.name', 'child.child.name')
350 self.assertRaises(AttributeError, f, a)
Antoine Pitroue9745712010-10-31 15:26:04 +0000351 f = operator.attrgetter('child.')
352 self.assertRaises(AttributeError, f, a)
353 f = operator.attrgetter('.child')
354 self.assertRaises(AttributeError, f, a)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000355
356 a.child.child = A()
357 a.child.child.name = 'johnson'
358 f = operator.attrgetter('child.child.name')
359 self.assertEqual(f(a), 'johnson')
360 f = operator.attrgetter('name', 'child.name', 'child.child.name')
361 self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
362
Raymond Hettinger166958b2003-12-01 13:18:39 +0000363 def test_itemgetter(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200364 operator = self.module
Raymond Hettinger166958b2003-12-01 13:18:39 +0000365 a = 'ABCDE'
366 f = operator.itemgetter(2)
367 self.assertEqual(f(a), 'C')
368 f = operator.itemgetter(10)
369 self.assertRaises(IndexError, f, a)
370
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000371 class C(object):
Christian Heimes9bd667a2008-01-20 15:14:11 +0000372 def __getitem__(self, name):
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000373 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000374 self.assertRaises(SyntaxError, operator.itemgetter(42), C())
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000375
Raymond Hettinger166958b2003-12-01 13:18:39 +0000376 f = operator.itemgetter('name')
377 self.assertRaises(TypeError, f, a)
378 self.assertRaises(TypeError, operator.itemgetter)
Raymond Hettinger166958b2003-12-01 13:18:39 +0000379
380 d = dict(key='val')
381 f = operator.itemgetter('key')
382 self.assertEqual(f(d), 'val')
383 f = operator.itemgetter('nonkey')
384 self.assertRaises(KeyError, f, d)
385
386 # example used in the docs
387 inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
388 getcount = operator.itemgetter(1)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000389 self.assertEqual(list(map(getcount, inventory)), [3, 2, 5, 1])
Raymond Hettinger64958a12003-12-17 20:43:33 +0000390 self.assertEqual(sorted(inventory, key=getcount),
Raymond Hettinger166958b2003-12-01 13:18:39 +0000391 [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
392
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000393 # multiple gets
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000394 data = list(map(str, range(20)))
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000395 self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
396 self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
Fred Drake2e2be372001-09-20 21:33:42 +0000397
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000398 def test_methodcaller(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200399 operator = self.module
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000400 self.assertRaises(TypeError, operator.methodcaller)
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300401 self.assertRaises(TypeError, operator.methodcaller, 12)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000402 class A:
403 def foo(self, *args, **kwds):
404 return args[0] + args[1]
405 def bar(self, f=42):
406 return f
Antoine Pitroua85017f2013-04-20 19:21:44 +0200407 def baz(*args, **kwds):
408 return kwds['name'], kwds['self']
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000409 a = A()
410 f = operator.methodcaller('foo')
411 self.assertRaises(IndexError, f, a)
412 f = operator.methodcaller('foo', 1, 2)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000413 self.assertEqual(f(a), 3)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000414 f = operator.methodcaller('bar')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000415 self.assertEqual(f(a), 42)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000416 self.assertRaises(TypeError, f, a, a)
417 f = operator.methodcaller('bar', f=5)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000418 self.assertEqual(f(a), 5)
Antoine Pitroua85017f2013-04-20 19:21:44 +0200419 f = operator.methodcaller('baz', name='spam', self='eggs')
420 self.assertEqual(f(a), ('spam', 'eggs'))
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000421
Armin Rigof5bd3b42005-12-29 16:50:42 +0000422 def test_inplace(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200423 operator = self.module
Armin Rigof5bd3b42005-12-29 16:50:42 +0000424 class C(object):
425 def __iadd__ (self, other): return "iadd"
426 def __iand__ (self, other): return "iand"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000427 def __ifloordiv__(self, other): return "ifloordiv"
428 def __ilshift__ (self, other): return "ilshift"
429 def __imod__ (self, other): return "imod"
430 def __imul__ (self, other): return "imul"
Benjamin Petersond51374e2014-04-09 23:55:56 -0400431 def __imatmul__ (self, other): return "imatmul"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000432 def __ior__ (self, other): return "ior"
433 def __ipow__ (self, other): return "ipow"
434 def __irshift__ (self, other): return "irshift"
435 def __isub__ (self, other): return "isub"
436 def __itruediv__ (self, other): return "itruediv"
437 def __ixor__ (self, other): return "ixor"
438 def __getitem__(self, other): return 5 # so that C is a sequence
439 c = C()
440 self.assertEqual(operator.iadd (c, 5), "iadd")
441 self.assertEqual(operator.iand (c, 5), "iand")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000442 self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
443 self.assertEqual(operator.ilshift (c, 5), "ilshift")
444 self.assertEqual(operator.imod (c, 5), "imod")
445 self.assertEqual(operator.imul (c, 5), "imul")
Benjamin Petersond51374e2014-04-09 23:55:56 -0400446 self.assertEqual(operator.imatmul (c, 5), "imatmul")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000447 self.assertEqual(operator.ior (c, 5), "ior")
448 self.assertEqual(operator.ipow (c, 5), "ipow")
449 self.assertEqual(operator.irshift (c, 5), "irshift")
450 self.assertEqual(operator.isub (c, 5), "isub")
451 self.assertEqual(operator.itruediv (c, 5), "itruediv")
452 self.assertEqual(operator.ixor (c, 5), "ixor")
453 self.assertEqual(operator.iconcat (c, c), "iadd")
Fred Drake2e2be372001-09-20 21:33:42 +0000454
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200455 def test_length_hint(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200456 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200457 class X(object):
458 def __init__(self, value):
459 self.value = value
460
461 def __length_hint__(self):
462 if type(self.value) is type:
463 raise self.value
464 else:
465 return self.value
466
467 self.assertEqual(operator.length_hint([], 2), 0)
468 self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
469
470 self.assertEqual(operator.length_hint(X(2)), 2)
471 self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
472 self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
473 with self.assertRaises(TypeError):
474 operator.length_hint(X("abc"))
475 with self.assertRaises(ValueError):
476 operator.length_hint(X(-2))
477 with self.assertRaises(LookupError):
478 operator.length_hint(X(LookupError))
479
Antoine Pitroua85017f2013-04-20 19:21:44 +0200480 def test_dunder_is_original(self):
481 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200482
Antoine Pitroua85017f2013-04-20 19:21:44 +0200483 names = [name for name in dir(operator) if not name.startswith('_')]
484 for name in names:
485 orig = getattr(operator, name)
486 dunder = getattr(operator, '__' + name.strip('_') + '__', None)
487 if dunder:
488 self.assertIs(dunder, orig)
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000489
Antoine Pitroua85017f2013-04-20 19:21:44 +0200490class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
491 module = py_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000492
Antoine Pitroua85017f2013-04-20 19:21:44 +0200493@unittest.skipUnless(c_operator, 'requires _operator')
494class COperatorTestCase(OperatorTestCase, unittest.TestCase):
495 module = c_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000496
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300497
498class OperatorPickleTestCase:
499 def copy(self, obj, proto):
500 with support.swap_item(sys.modules, 'operator', self.module):
501 pickled = pickle.dumps(obj, proto)
502 with support.swap_item(sys.modules, 'operator', self.module2):
503 return pickle.loads(pickled)
504
505 def test_attrgetter(self):
506 attrgetter = self.module.attrgetter
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300507 class A:
508 pass
509 a = A()
510 a.x = 'X'
511 a.y = 'Y'
512 a.z = 'Z'
513 a.t = A()
514 a.t.u = A()
515 a.t.u.v = 'V'
516 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
517 with self.subTest(proto=proto):
518 f = attrgetter('x')
519 f2 = self.copy(f, proto)
520 self.assertEqual(repr(f2), repr(f))
521 self.assertEqual(f2(a), f(a))
522 # multiple gets
523 f = attrgetter('x', 'y', 'z')
524 f2 = self.copy(f, proto)
525 self.assertEqual(repr(f2), repr(f))
526 self.assertEqual(f2(a), f(a))
527 # recursive gets
528 f = attrgetter('t.u.v')
529 f2 = self.copy(f, proto)
530 self.assertEqual(repr(f2), repr(f))
531 self.assertEqual(f2(a), f(a))
532
533 def test_itemgetter(self):
534 itemgetter = self.module.itemgetter
535 a = 'ABCDE'
536 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
537 with self.subTest(proto=proto):
538 f = itemgetter(2)
539 f2 = self.copy(f, proto)
540 self.assertEqual(repr(f2), repr(f))
541 self.assertEqual(f2(a), f(a))
542 # multiple gets
543 f = itemgetter(2, 0, 4)
544 f2 = self.copy(f, proto)
545 self.assertEqual(repr(f2), repr(f))
546 self.assertEqual(f2(a), f(a))
547
548 def test_methodcaller(self):
549 methodcaller = self.module.methodcaller
550 class A:
551 def foo(self, *args, **kwds):
552 return args[0] + args[1]
553 def bar(self, f=42):
554 return f
555 def baz(*args, **kwds):
556 return kwds['name'], kwds['self']
557 a = A()
558 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
559 with self.subTest(proto=proto):
560 f = methodcaller('bar')
561 f2 = self.copy(f, proto)
562 self.assertEqual(repr(f2), repr(f))
563 self.assertEqual(f2(a), f(a))
564 # positional args
565 f = methodcaller('foo', 1, 2)
566 f2 = self.copy(f, proto)
567 self.assertEqual(repr(f2), repr(f))
568 self.assertEqual(f2(a), f(a))
569 # keyword args
570 f = methodcaller('bar', f=5)
571 f2 = self.copy(f, proto)
572 self.assertEqual(repr(f2), repr(f))
573 self.assertEqual(f2(a), f(a))
574 f = methodcaller('baz', self='eggs', name='spam')
575 f2 = self.copy(f, proto)
576 # Can't test repr consistently with multiple keyword args
577 self.assertEqual(f2(a), f(a))
578
579class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
580 module = py_operator
581 module2 = py_operator
582
583@unittest.skipUnless(c_operator, 'requires _operator')
584class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
585 module = py_operator
586 module2 = c_operator
587
588@unittest.skipUnless(c_operator, 'requires _operator')
589class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
590 module = c_operator
591 module2 = py_operator
592
593@unittest.skipUnless(c_operator, 'requires _operator')
594class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
595 module = c_operator
596 module2 = c_operator
597
598
Raymond Hettinger47d159f2015-08-16 19:43:34 -0700599class SubscriptTestCase:
600 def test_subscript(self):
601 subscript = self.module.subscript
602 self.assertIsNone(subscript[None])
603 self.assertEqual(subscript[0], 0)
604 self.assertEqual(subscript[0:1:2], slice(0, 1, 2))
605 self.assertEqual(
606 subscript[0, ..., :2, ...],
607 (0, Ellipsis, slice(2), Ellipsis),
608 )
609
610 def test_pickle(self):
611 from operator import subscript
612 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
613 with self.subTest(proto=proto):
614 self.assertIs(
615 pickle.loads(pickle.dumps(subscript, proto)),
616 subscript,
617 )
618
619 def test_singleton(self):
620 with self.assertRaises(TypeError):
621 type(self.module.subscript)()
622
623 def test_immutable(self):
624 with self.assertRaises(AttributeError):
625 self.module.subscript.attr = None
626
627
628class PySubscriptTestCase(SubscriptTestCase, PyOperatorTestCase):
629 pass
630
631
Fred Drake2e2be372001-09-20 21:33:42 +0000632if __name__ == "__main__":
Antoine Pitroua85017f2013-04-20 19:21:44 +0200633 unittest.main()