"""Original broken examples, reference corrections and independently stated checks."""
import unittest


def broken_total(values):
    result = 0
    for value in values:
        result = value
    return result


def broken_doubled(values):
    result = [value * 2 for value in values]


def broken_average(values):
    return sum(values) / len(values)


def total(values):
    result = 0
    for value in values:
        result += value
    return result


def doubled(values):
    result = [value * 2 for value in values]
    return result


def average(values):
    if not values:
        raise ValueError('at least one value required')
    return sum(values) / len(values)


class DebuggingChecks(unittest.TestCase):
    def test_demonstrations(self):
        self.assertEqual(broken_total([4, 7, 2]), 2)
        self.assertIsNone(broken_doubled([2, 5]))
        with self.assertRaises(ZeroDivisionError):
            broken_average([])

    def test_corrections(self):
        for values, expected in [([4, 7, 2], 13), ([0], 0), ([-2, 5], 3), ([], 0)]:
            self.assertEqual(total(values), expected)
        self.assertEqual(doubled([2, 5]), [4, 10])
        self.assertEqual(doubled([]), [])
        self.assertEqual(average([2, 4, 9]), 5)
        with self.assertRaisesRegex(ValueError, 'at least one value required'):
            average([])


if __name__ == '__main__':
    unittest.main()
