(self)
| 1035 | |
| 1036 | class TestReduce: |
| 1037 | def test_reduce(self): |
| 1038 | class Squares: |
| 1039 | def __init__(self, max): |
| 1040 | self.max = max |
| 1041 | self.sofar = [] |
| 1042 | |
| 1043 | def __len__(self): |
| 1044 | return len(self.sofar) |
| 1045 | |
| 1046 | def __getitem__(self, i): |
| 1047 | if not 0 <= i < self.max: raise IndexError |
| 1048 | n = len(self.sofar) |
| 1049 | while n <= i: |
| 1050 | self.sofar.append(n*n) |
| 1051 | n += 1 |
| 1052 | return self.sofar[i] |
| 1053 | def add(x, y): |
| 1054 | return x + y |
| 1055 | self.assertEqual(self.reduce(add, ['a', 'b', 'c'], ''), 'abc') |
| 1056 | self.assertEqual( |
| 1057 | self.reduce(add, [['a', 'c'], [], ['d', 'w']], []), |
| 1058 | ['a','c','d','w'] |
| 1059 | ) |
| 1060 | self.assertEqual(self.reduce(lambda x, y: x*y, range(2,8), 1), 5040) |
| 1061 | self.assertEqual( |
| 1062 | self.reduce(lambda x, y: x*y, range(2,21), 1), |
| 1063 | 2432902008176640000 |
| 1064 | ) |
| 1065 | self.assertEqual(self.reduce(add, Squares(10)), 285) |
| 1066 | self.assertEqual(self.reduce(add, Squares(10), 0), 285) |
| 1067 | self.assertEqual(self.reduce(add, Squares(0), 0), 0) |
| 1068 | self.assertRaises(TypeError, self.reduce) |
| 1069 | self.assertRaises(TypeError, self.reduce, 42, 42) |
| 1070 | self.assertRaises(TypeError, self.reduce, 42, 42, 42) |
| 1071 | self.assertEqual(self.reduce(42, "1"), "1") # func is never called with one item |
| 1072 | self.assertEqual(self.reduce(42, "", "1"), "1") # func is never called with one item |
| 1073 | self.assertRaises(TypeError, self.reduce, 42, (42, 42)) |
| 1074 | self.assertRaises(TypeError, self.reduce, add, []) # arg 2 must not be empty sequence with no initial value |
| 1075 | self.assertRaises(TypeError, self.reduce, add, "") |
| 1076 | self.assertRaises(TypeError, self.reduce, add, ()) |
| 1077 | self.assertRaises(TypeError, self.reduce, add, object()) |
| 1078 | |
| 1079 | class TestFailingIter: |
| 1080 | def __iter__(self): |
| 1081 | raise RuntimeError |
| 1082 | self.assertRaises(RuntimeError, self.reduce, add, TestFailingIter()) |
| 1083 | |
| 1084 | self.assertEqual(self.reduce(add, [], None), None) |
| 1085 | self.assertEqual(self.reduce(add, [], 42), 42) |
| 1086 | |
| 1087 | class BadSeq: |
| 1088 | def __getitem__(self, index): |
| 1089 | raise ValueError |
| 1090 | self.assertRaises(ValueError, self.reduce, 42, BadSeq()) |
| 1091 | |
| 1092 | # Test reduce()'s use of iterators. |
| 1093 | def test_iterator_usage(self): |
nothing calls this directly
no test coverage detected