blob: 6254091e78fec46cd01f44b8955a40b4fbd28cc3 [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')
Serhiy Storchakac2a2a752016-04-23 10:51:39 +0300321 self.assertRaises(TypeError, f)
322 self.assertRaises(TypeError, f, a, 'dent')
323 self.assertRaises(TypeError, f, a, surname='dent')
Raymond Hettinger166958b2003-12-01 13:18:39 +0000324 f = operator.attrgetter('rank')
325 self.assertRaises(AttributeError, f, a)
Antoine Pitroue9745712010-10-31 15:26:04 +0000326 self.assertRaises(TypeError, operator.attrgetter, 2)
Raymond Hettinger166958b2003-12-01 13:18:39 +0000327 self.assertRaises(TypeError, operator.attrgetter)
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000328
329 # multiple gets
330 record = A()
331 record.x = 'X'
332 record.y = 'Y'
333 record.z = 'Z'
334 self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
Antoine Pitroue9745712010-10-31 15:26:04 +0000335 self.assertRaises(TypeError, operator.attrgetter, ('x', (), 'y'))
Raymond Hettinger166958b2003-12-01 13:18:39 +0000336
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000337 class C(object):
Christian Heimes9bd667a2008-01-20 15:14:11 +0000338 def __getattr__(self, name):
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000339 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000340 self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000341
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000342 # recursive gets
343 a = A()
344 a.name = 'arthur'
345 a.child = A()
346 a.child.name = 'thomas'
347 f = operator.attrgetter('child.name')
348 self.assertEqual(f(a), 'thomas')
349 self.assertRaises(AttributeError, f, a.child)
350 f = operator.attrgetter('name', 'child.name')
351 self.assertEqual(f(a), ('arthur', 'thomas'))
352 f = operator.attrgetter('name', 'child.name', 'child.child.name')
353 self.assertRaises(AttributeError, f, a)
Antoine Pitroue9745712010-10-31 15:26:04 +0000354 f = operator.attrgetter('child.')
355 self.assertRaises(AttributeError, f, a)
356 f = operator.attrgetter('.child')
357 self.assertRaises(AttributeError, f, a)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000358
359 a.child.child = A()
360 a.child.child.name = 'johnson'
361 f = operator.attrgetter('child.child.name')
362 self.assertEqual(f(a), 'johnson')
363 f = operator.attrgetter('name', 'child.name', 'child.child.name')
364 self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
365
Raymond Hettinger166958b2003-12-01 13:18:39 +0000366 def test_itemgetter(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200367 operator = self.module
Raymond Hettinger166958b2003-12-01 13:18:39 +0000368 a = 'ABCDE'
369 f = operator.itemgetter(2)
370 self.assertEqual(f(a), 'C')
Serhiy Storchakac2a2a752016-04-23 10:51:39 +0300371 self.assertRaises(TypeError, f)
372 self.assertRaises(TypeError, f, a, 3)
373 self.assertRaises(TypeError, f, a, size=3)
Raymond Hettinger166958b2003-12-01 13:18:39 +0000374 f = operator.itemgetter(10)
375 self.assertRaises(IndexError, f, a)
376
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000377 class C(object):
Christian Heimes9bd667a2008-01-20 15:14:11 +0000378 def __getitem__(self, name):
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000379 raise SyntaxError
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000380 self.assertRaises(SyntaxError, operator.itemgetter(42), C())
Walter Dörwaldbb9c7392004-11-01 17:10:19 +0000381
Raymond Hettinger166958b2003-12-01 13:18:39 +0000382 f = operator.itemgetter('name')
383 self.assertRaises(TypeError, f, a)
384 self.assertRaises(TypeError, operator.itemgetter)
Raymond Hettinger166958b2003-12-01 13:18:39 +0000385
386 d = dict(key='val')
387 f = operator.itemgetter('key')
388 self.assertEqual(f(d), 'val')
389 f = operator.itemgetter('nonkey')
390 self.assertRaises(KeyError, f, d)
391
392 # example used in the docs
393 inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
394 getcount = operator.itemgetter(1)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000395 self.assertEqual(list(map(getcount, inventory)), [3, 2, 5, 1])
Raymond Hettinger64958a12003-12-17 20:43:33 +0000396 self.assertEqual(sorted(inventory, key=getcount),
Raymond Hettinger166958b2003-12-01 13:18:39 +0000397 [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
398
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000399 # multiple gets
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000400 data = list(map(str, range(20)))
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000401 self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
402 self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
Fred Drake2e2be372001-09-20 21:33:42 +0000403
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000404 def test_methodcaller(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200405 operator = self.module
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000406 self.assertRaises(TypeError, operator.methodcaller)
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300407 self.assertRaises(TypeError, operator.methodcaller, 12)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000408 class A:
409 def foo(self, *args, **kwds):
410 return args[0] + args[1]
411 def bar(self, f=42):
412 return f
Antoine Pitroua85017f2013-04-20 19:21:44 +0200413 def baz(*args, **kwds):
414 return kwds['name'], kwds['self']
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000415 a = A()
416 f = operator.methodcaller('foo')
417 self.assertRaises(IndexError, f, a)
418 f = operator.methodcaller('foo', 1, 2)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000419 self.assertEqual(f(a), 3)
Serhiy Storchakac2a2a752016-04-23 10:51:39 +0300420 self.assertRaises(TypeError, f)
421 self.assertRaises(TypeError, f, a, 3)
422 self.assertRaises(TypeError, f, a, spam=3)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000423 f = operator.methodcaller('bar')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000424 self.assertEqual(f(a), 42)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000425 self.assertRaises(TypeError, f, a, a)
426 f = operator.methodcaller('bar', f=5)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000427 self.assertEqual(f(a), 5)
Antoine Pitroua85017f2013-04-20 19:21:44 +0200428 f = operator.methodcaller('baz', name='spam', self='eggs')
429 self.assertEqual(f(a), ('spam', 'eggs'))
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000430
Armin Rigof5bd3b42005-12-29 16:50:42 +0000431 def test_inplace(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200432 operator = self.module
Armin Rigof5bd3b42005-12-29 16:50:42 +0000433 class C(object):
434 def __iadd__ (self, other): return "iadd"
435 def __iand__ (self, other): return "iand"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000436 def __ifloordiv__(self, other): return "ifloordiv"
437 def __ilshift__ (self, other): return "ilshift"
438 def __imod__ (self, other): return "imod"
439 def __imul__ (self, other): return "imul"
Benjamin Petersond51374e2014-04-09 23:55:56 -0400440 def __imatmul__ (self, other): return "imatmul"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000441 def __ior__ (self, other): return "ior"
442 def __ipow__ (self, other): return "ipow"
443 def __irshift__ (self, other): return "irshift"
444 def __isub__ (self, other): return "isub"
445 def __itruediv__ (self, other): return "itruediv"
446 def __ixor__ (self, other): return "ixor"
447 def __getitem__(self, other): return 5 # so that C is a sequence
448 c = C()
449 self.assertEqual(operator.iadd (c, 5), "iadd")
450 self.assertEqual(operator.iand (c, 5), "iand")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000451 self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
452 self.assertEqual(operator.ilshift (c, 5), "ilshift")
453 self.assertEqual(operator.imod (c, 5), "imod")
454 self.assertEqual(operator.imul (c, 5), "imul")
Benjamin Petersond51374e2014-04-09 23:55:56 -0400455 self.assertEqual(operator.imatmul (c, 5), "imatmul")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000456 self.assertEqual(operator.ior (c, 5), "ior")
457 self.assertEqual(operator.ipow (c, 5), "ipow")
458 self.assertEqual(operator.irshift (c, 5), "irshift")
459 self.assertEqual(operator.isub (c, 5), "isub")
460 self.assertEqual(operator.itruediv (c, 5), "itruediv")
461 self.assertEqual(operator.ixor (c, 5), "ixor")
462 self.assertEqual(operator.iconcat (c, c), "iadd")
Fred Drake2e2be372001-09-20 21:33:42 +0000463
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200464 def test_length_hint(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200465 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200466 class X(object):
467 def __init__(self, value):
468 self.value = value
469
470 def __length_hint__(self):
471 if type(self.value) is type:
472 raise self.value
473 else:
474 return self.value
475
476 self.assertEqual(operator.length_hint([], 2), 0)
477 self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
478
479 self.assertEqual(operator.length_hint(X(2)), 2)
480 self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
481 self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
482 with self.assertRaises(TypeError):
483 operator.length_hint(X("abc"))
484 with self.assertRaises(ValueError):
485 operator.length_hint(X(-2))
486 with self.assertRaises(LookupError):
487 operator.length_hint(X(LookupError))
488
Antoine Pitroua85017f2013-04-20 19:21:44 +0200489 def test_dunder_is_original(self):
490 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200491
Antoine Pitroua85017f2013-04-20 19:21:44 +0200492 names = [name for name in dir(operator) if not name.startswith('_')]
493 for name in names:
494 orig = getattr(operator, name)
495 dunder = getattr(operator, '__' + name.strip('_') + '__', None)
496 if dunder:
497 self.assertIs(dunder, orig)
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000498
Antoine Pitroua85017f2013-04-20 19:21:44 +0200499class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
500 module = py_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000501
Antoine Pitroua85017f2013-04-20 19:21:44 +0200502@unittest.skipUnless(c_operator, 'requires _operator')
503class COperatorTestCase(OperatorTestCase, unittest.TestCase):
504 module = c_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000505
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300506
507class OperatorPickleTestCase:
508 def copy(self, obj, proto):
509 with support.swap_item(sys.modules, 'operator', self.module):
510 pickled = pickle.dumps(obj, proto)
511 with support.swap_item(sys.modules, 'operator', self.module2):
512 return pickle.loads(pickled)
513
514 def test_attrgetter(self):
515 attrgetter = self.module.attrgetter
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300516 class A:
517 pass
518 a = A()
519 a.x = 'X'
520 a.y = 'Y'
521 a.z = 'Z'
522 a.t = A()
523 a.t.u = A()
524 a.t.u.v = 'V'
525 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
526 with self.subTest(proto=proto):
527 f = attrgetter('x')
528 f2 = self.copy(f, proto)
529 self.assertEqual(repr(f2), repr(f))
530 self.assertEqual(f2(a), f(a))
531 # multiple gets
532 f = attrgetter('x', 'y', 'z')
533 f2 = self.copy(f, proto)
534 self.assertEqual(repr(f2), repr(f))
535 self.assertEqual(f2(a), f(a))
536 # recursive gets
537 f = attrgetter('t.u.v')
538 f2 = self.copy(f, proto)
539 self.assertEqual(repr(f2), repr(f))
540 self.assertEqual(f2(a), f(a))
541
542 def test_itemgetter(self):
543 itemgetter = self.module.itemgetter
544 a = 'ABCDE'
545 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
546 with self.subTest(proto=proto):
547 f = itemgetter(2)
548 f2 = self.copy(f, proto)
549 self.assertEqual(repr(f2), repr(f))
550 self.assertEqual(f2(a), f(a))
551 # multiple gets
552 f = itemgetter(2, 0, 4)
553 f2 = self.copy(f, proto)
554 self.assertEqual(repr(f2), repr(f))
555 self.assertEqual(f2(a), f(a))
556
557 def test_methodcaller(self):
558 methodcaller = self.module.methodcaller
559 class A:
560 def foo(self, *args, **kwds):
561 return args[0] + args[1]
562 def bar(self, f=42):
563 return f
564 def baz(*args, **kwds):
565 return kwds['name'], kwds['self']
566 a = A()
567 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
568 with self.subTest(proto=proto):
569 f = methodcaller('bar')
570 f2 = self.copy(f, proto)
571 self.assertEqual(repr(f2), repr(f))
572 self.assertEqual(f2(a), f(a))
573 # positional args
574 f = methodcaller('foo', 1, 2)
575 f2 = self.copy(f, proto)
576 self.assertEqual(repr(f2), repr(f))
577 self.assertEqual(f2(a), f(a))
578 # keyword args
579 f = methodcaller('bar', f=5)
580 f2 = self.copy(f, proto)
581 self.assertEqual(repr(f2), repr(f))
582 self.assertEqual(f2(a), f(a))
583 f = methodcaller('baz', self='eggs', name='spam')
584 f2 = self.copy(f, proto)
585 # Can't test repr consistently with multiple keyword args
586 self.assertEqual(f2(a), f(a))
587
588class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
589 module = py_operator
590 module2 = py_operator
591
592@unittest.skipUnless(c_operator, 'requires _operator')
593class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
594 module = py_operator
595 module2 = c_operator
596
597@unittest.skipUnless(c_operator, 'requires _operator')
598class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
599 module = c_operator
600 module2 = py_operator
601
602@unittest.skipUnless(c_operator, 'requires _operator')
603class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
604 module = c_operator
605 module2 = c_operator
606
607
Fred Drake2e2be372001-09-20 21:33:42 +0000608if __name__ == "__main__":
Antoine Pitroua85017f2013-04-20 19:21:44 +0200609 unittest.main()