blob: f46d94a226717ad75aac38ed9a269842edb62480 [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
Raymond Hettinger2d53bed2019-01-07 09:38:41 -0700404 # interesting indices
405 t = tuple('abcde')
406 self.assertEqual(operator.itemgetter(-1)(t), 'e')
407 self.assertEqual(operator.itemgetter(slice(2, 4))(t), ('c', 'd'))
408
409 # interesting sequences
410 class T(tuple):
411 'Tuple subclass'
412 pass
413 self.assertEqual(operator.itemgetter(0)(T('abc')), 'a')
414 self.assertEqual(operator.itemgetter(0)(['a', 'b', 'c']), 'a')
415 self.assertEqual(operator.itemgetter(0)(range(100, 200)), 100)
416
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000417 def test_methodcaller(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200418 operator = self.module
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000419 self.assertRaises(TypeError, operator.methodcaller)
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300420 self.assertRaises(TypeError, operator.methodcaller, 12)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000421 class A:
422 def foo(self, *args, **kwds):
423 return args[0] + args[1]
424 def bar(self, f=42):
425 return f
Antoine Pitroua85017f2013-04-20 19:21:44 +0200426 def baz(*args, **kwds):
427 return kwds['name'], kwds['self']
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000428 a = A()
429 f = operator.methodcaller('foo')
430 self.assertRaises(IndexError, f, a)
431 f = operator.methodcaller('foo', 1, 2)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000432 self.assertEqual(f(a), 3)
Serhiy Storchakac2a2a752016-04-23 10:51:39 +0300433 self.assertRaises(TypeError, f)
434 self.assertRaises(TypeError, f, a, 3)
435 self.assertRaises(TypeError, f, a, spam=3)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000436 f = operator.methodcaller('bar')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000437 self.assertEqual(f(a), 42)
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000438 self.assertRaises(TypeError, f, a, a)
439 f = operator.methodcaller('bar', f=5)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000440 self.assertEqual(f(a), 5)
Antoine Pitroua85017f2013-04-20 19:21:44 +0200441 f = operator.methodcaller('baz', name='spam', self='eggs')
442 self.assertEqual(f(a), ('spam', 'eggs'))
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000443
Armin Rigof5bd3b42005-12-29 16:50:42 +0000444 def test_inplace(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200445 operator = self.module
Armin Rigof5bd3b42005-12-29 16:50:42 +0000446 class C(object):
447 def __iadd__ (self, other): return "iadd"
448 def __iand__ (self, other): return "iand"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000449 def __ifloordiv__(self, other): return "ifloordiv"
450 def __ilshift__ (self, other): return "ilshift"
451 def __imod__ (self, other): return "imod"
452 def __imul__ (self, other): return "imul"
Benjamin Petersond51374e2014-04-09 23:55:56 -0400453 def __imatmul__ (self, other): return "imatmul"
Armin Rigof5bd3b42005-12-29 16:50:42 +0000454 def __ior__ (self, other): return "ior"
455 def __ipow__ (self, other): return "ipow"
456 def __irshift__ (self, other): return "irshift"
457 def __isub__ (self, other): return "isub"
458 def __itruediv__ (self, other): return "itruediv"
459 def __ixor__ (self, other): return "ixor"
460 def __getitem__(self, other): return 5 # so that C is a sequence
461 c = C()
462 self.assertEqual(operator.iadd (c, 5), "iadd")
463 self.assertEqual(operator.iand (c, 5), "iand")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000464 self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
465 self.assertEqual(operator.ilshift (c, 5), "ilshift")
466 self.assertEqual(operator.imod (c, 5), "imod")
467 self.assertEqual(operator.imul (c, 5), "imul")
Benjamin Petersond51374e2014-04-09 23:55:56 -0400468 self.assertEqual(operator.imatmul (c, 5), "imatmul")
Armin Rigof5bd3b42005-12-29 16:50:42 +0000469 self.assertEqual(operator.ior (c, 5), "ior")
470 self.assertEqual(operator.ipow (c, 5), "ipow")
471 self.assertEqual(operator.irshift (c, 5), "irshift")
472 self.assertEqual(operator.isub (c, 5), "isub")
473 self.assertEqual(operator.itruediv (c, 5), "itruediv")
474 self.assertEqual(operator.ixor (c, 5), "ixor")
475 self.assertEqual(operator.iconcat (c, c), "iadd")
Fred Drake2e2be372001-09-20 21:33:42 +0000476
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200477 def test_length_hint(self):
Antoine Pitroua85017f2013-04-20 19:21:44 +0200478 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200479 class X(object):
480 def __init__(self, value):
481 self.value = value
482
483 def __length_hint__(self):
484 if type(self.value) is type:
485 raise self.value
486 else:
487 return self.value
488
489 self.assertEqual(operator.length_hint([], 2), 0)
490 self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
491
492 self.assertEqual(operator.length_hint(X(2)), 2)
493 self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
494 self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
495 with self.assertRaises(TypeError):
496 operator.length_hint(X("abc"))
497 with self.assertRaises(ValueError):
498 operator.length_hint(X(-2))
499 with self.assertRaises(LookupError):
500 operator.length_hint(X(LookupError))
501
Antoine Pitroua85017f2013-04-20 19:21:44 +0200502 def test_dunder_is_original(self):
503 operator = self.module
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200504
Antoine Pitroua85017f2013-04-20 19:21:44 +0200505 names = [name for name in dir(operator) if not name.startswith('_')]
506 for name in names:
507 orig = getattr(operator, name)
508 dunder = getattr(operator, '__' + name.strip('_') + '__', None)
509 if dunder:
510 self.assertIs(dunder, orig)
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000511
Antoine Pitroua85017f2013-04-20 19:21:44 +0200512class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
513 module = py_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000514
Antoine Pitroua85017f2013-04-20 19:21:44 +0200515@unittest.skipUnless(c_operator, 'requires _operator')
516class COperatorTestCase(OperatorTestCase, unittest.TestCase):
517 module = c_operator
Raymond Hettinger984f9bb2005-03-09 16:38:48 +0000518
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300519
520class OperatorPickleTestCase:
521 def copy(self, obj, proto):
522 with support.swap_item(sys.modules, 'operator', self.module):
523 pickled = pickle.dumps(obj, proto)
524 with support.swap_item(sys.modules, 'operator', self.module2):
525 return pickle.loads(pickled)
526
527 def test_attrgetter(self):
528 attrgetter = self.module.attrgetter
Serhiy Storchaka35ac5f82015-05-20 18:29:18 +0300529 class A:
530 pass
531 a = A()
532 a.x = 'X'
533 a.y = 'Y'
534 a.z = 'Z'
535 a.t = A()
536 a.t.u = A()
537 a.t.u.v = 'V'
538 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
539 with self.subTest(proto=proto):
540 f = attrgetter('x')
541 f2 = self.copy(f, proto)
542 self.assertEqual(repr(f2), repr(f))
543 self.assertEqual(f2(a), f(a))
544 # multiple gets
545 f = attrgetter('x', 'y', 'z')
546 f2 = self.copy(f, proto)
547 self.assertEqual(repr(f2), repr(f))
548 self.assertEqual(f2(a), f(a))
549 # recursive gets
550 f = attrgetter('t.u.v')
551 f2 = self.copy(f, proto)
552 self.assertEqual(repr(f2), repr(f))
553 self.assertEqual(f2(a), f(a))
554
555 def test_itemgetter(self):
556 itemgetter = self.module.itemgetter
557 a = 'ABCDE'
558 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
559 with self.subTest(proto=proto):
560 f = itemgetter(2)
561 f2 = self.copy(f, proto)
562 self.assertEqual(repr(f2), repr(f))
563 self.assertEqual(f2(a), f(a))
564 # multiple gets
565 f = itemgetter(2, 0, 4)
566 f2 = self.copy(f, proto)
567 self.assertEqual(repr(f2), repr(f))
568 self.assertEqual(f2(a), f(a))
569
570 def test_methodcaller(self):
571 methodcaller = self.module.methodcaller
572 class A:
573 def foo(self, *args, **kwds):
574 return args[0] + args[1]
575 def bar(self, f=42):
576 return f
577 def baz(*args, **kwds):
578 return kwds['name'], kwds['self']
579 a = A()
580 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
581 with self.subTest(proto=proto):
582 f = methodcaller('bar')
583 f2 = self.copy(f, proto)
584 self.assertEqual(repr(f2), repr(f))
585 self.assertEqual(f2(a), f(a))
586 # positional args
587 f = methodcaller('foo', 1, 2)
588 f2 = self.copy(f, proto)
589 self.assertEqual(repr(f2), repr(f))
590 self.assertEqual(f2(a), f(a))
591 # keyword args
592 f = methodcaller('bar', f=5)
593 f2 = self.copy(f, proto)
594 self.assertEqual(repr(f2), repr(f))
595 self.assertEqual(f2(a), f(a))
596 f = methodcaller('baz', self='eggs', name='spam')
597 f2 = self.copy(f, proto)
598 # Can't test repr consistently with multiple keyword args
599 self.assertEqual(f2(a), f(a))
600
601class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
602 module = py_operator
603 module2 = py_operator
604
605@unittest.skipUnless(c_operator, 'requires _operator')
606class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
607 module = py_operator
608 module2 = c_operator
609
610@unittest.skipUnless(c_operator, 'requires _operator')
611class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
612 module = c_operator
613 module2 = py_operator
614
615@unittest.skipUnless(c_operator, 'requires _operator')
616class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
617 module = c_operator
618 module2 = c_operator
619
620
Fred Drake2e2be372001-09-20 21:33:42 +0000621if __name__ == "__main__":
Antoine Pitroua85017f2013-04-20 19:21:44 +0200622 unittest.main()