(self)
| 971 | |
| 972 | class TestReduce: |
| 973 | def test_reduce(self): |
| 974 | class Squares: |
| 975 | def __init__(self, max): |
| 976 | self.max = max |
| 977 | self.sofar = [] |
| 978 | |
| 979 | def __len__(self): |
| 980 | return len(self.sofar) |
| 981 | |
| 982 | def __getitem__(self, i): |
| 983 | if not 0 <= i < self.max: raise IndexError |
| 984 | n = len(self.sofar) |
| 985 | while n <= i: |
| 986 | self.sofar.append(n*n) |
| 987 | n += 1 |
| 988 | return self.sofar[i] |
| 989 | def add(x, y): |
| 990 | return x + y |
| 991 | self.assertEqual(self.reduce(add, ['a', 'b', 'c'], ''), 'abc') |
| 992 | self.assertEqual( |
| 993 | self.reduce(add, [['a', 'c'], [], ['d', 'w']], []), |
| 994 | ['a','c','d','w'] |
| 995 | ) |
| 996 | self.assertEqual(self.reduce(lambda x, y: x*y, range(2,8), 1), 5040) |
| 997 | self.assertEqual( |
| 998 | self.reduce(lambda x, y: x*y, range(2,21), 1), |
| 999 | 2432902008176640000 |
| 1000 | ) |
| 1001 | self.assertEqual(self.reduce(add, Squares(10)), 285) |
| 1002 | self.assertEqual(self.reduce(add, Squares(10), 0), 285) |
| 1003 | self.assertEqual(self.reduce(add, Squares(0), 0), 0) |
| 1004 | self.assertRaises(TypeError, self.reduce) |
| 1005 | self.assertRaises(TypeError, self.reduce, 42, 42) |
| 1006 | self.assertRaises(TypeError, self.reduce, 42, 42, 42) |
| 1007 | self.assertEqual(self.reduce(42, "1"), "1") # func is never called with one item |
| 1008 | self.assertEqual(self.reduce(42, "", "1"), "1") # func is never called with one item |
| 1009 | self.assertRaises(TypeError, self.reduce, 42, (42, 42)) |
| 1010 | self.assertRaises(TypeError, self.reduce, add, []) # arg 2 must not be empty sequence with no initial value |
| 1011 | self.assertRaises(TypeError, self.reduce, add, "") |
| 1012 | self.assertRaises(TypeError, self.reduce, add, ()) |
| 1013 | self.assertRaises(TypeError, self.reduce, add, object()) |
| 1014 | |
| 1015 | class TestFailingIter: |
| 1016 | def __iter__(self): |
| 1017 | raise RuntimeError |
| 1018 | self.assertRaises(RuntimeError, self.reduce, add, TestFailingIter()) |
| 1019 | |
| 1020 | self.assertEqual(self.reduce(add, [], None), None) |
| 1021 | self.assertEqual(self.reduce(add, [], 42), 42) |
| 1022 | |
| 1023 | class BadSeq: |
| 1024 | def __getitem__(self, index): |
| 1025 | raise ValueError |
| 1026 | self.assertRaises(ValueError, self.reduce, 42, BadSeq()) |
| 1027 | |
| 1028 | # Test reduce()'s use of iterators. |
| 1029 | def test_iterator_usage(self): |
nothing calls this directly
no test coverage detected