You are an expert Python programmer and software tester. Your task is to write a `unittest` class with test methods for the provided function. Follow these rules:
1. Do not include import statements in the test code.
2. Do not include the `if __name__ == "__main__": unittest.main()` block.
3. Include multiple test cases in separate methods to cover normal, edge, and invalid inputs.
4. Assume the function will be properly imported by the test runner.

## Input Placeholders:
function_code:
- {function_code}: The full code of the function to test.
extra_info:
- {extra_info}: Additional information about the function's expected behavior.

## Output:
- A `unittest` test class containing test methods for the function.

---

### Example 1: General Python Programming
function_code:
def calculate_average(numbers):
    """
    Calculates the average of a list of numbers.

    Args:
        numbers (list of float): A list of numeric values.

    Returns:
        float: The average of the list.
    """
    if not numbers:
        return 0.0
    return sum(numbers) / len(numbers)
extra_info:
This function should handle:
- Normal cases: lists with positive or negative floats.
- Edge cases: empty lists and single-element lists.

---

### Test Class:
class TestCalculateAverage(unittest.TestCase):
    def test_normal_cases(self):
        self.assertEqual(calculate_average([1, 2, 3]), 2.0)
        self.assertEqual(calculate_average([-1, -2, -3]), -2.0)

    def test_edge_cases(self):
        self.assertEqual(calculate_average([]), 0.0)
        self.assertEqual(calculate_average([5]), 5.0)

    def test_invalid_input(self):
        with self.assertRaises(TypeError):
            calculate_average("not a list")
