diff --git a/solutions/largest_number.py b/solutions/largest_number.py new file mode 100644 index 000000000..2e45b6dc3 --- /dev/null +++ b/solutions/largest_number.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +A module for finding the largest number. + +Module contents: + - largest_number: Extracts the largest number from a list of integers. + +Created on 11-01-2025 +@author: Azza +""" + + +def largest_number(list_numbers: list) -> int: + """Extract the largest number from the given list of integers. + + Args: + list_numbers (list): A list of integers. + + Returns: + int: The largest number in the list. + + Raises: + TypeError: If the input is not a list or contains non-integer elements. + ValueError: If the input list is empty. + + Examples: + >>> largest_number([0, 1, 9, 2, 6, 4]) + 9 + >>> largest_number([12]) + 12 + >>> largest_number([8, -1, -8, 5]) + 8 + >>> largest_number([-9, -1, -6, -5]) + -1 + >>> largest_number([0, 0]) + 0 + >>> largest_number([]) # Raises ValueError + Traceback (most recent call last): + ... + ValueError: The list must not be empty. + >>> largest_number(["-5", 5, "0"]) # Raises TypeError + Traceback (most recent call last): + ... + TypeError: All elements in the list must be integers. + >>> largest_number(42) # Raises TypeError + Traceback (most recent call last): + ... + TypeError: The input must be a list. + >>> largest_number([2**32, 2**16, 2**8, 1]) + 4294967296 + """ + + # Ensure the input is a list of integers + if not isinstance(list_numbers, list): + raise TypeError("The input must be a list.") + if not list_numbers: + raise ValueError("The list must not be empty.") + if not all(isinstance(i, int) for i in list_numbers): + raise TypeError("All elements in the list must be integers.") + + return max(list_numbers) diff --git a/solutions/tests/test_largest_number.py b/solutions/tests/test_largest_number.py new file mode 100644 index 000000000..d855b6241 --- /dev/null +++ b/solutions/tests/test_largest_number.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Unit tests for the largest_number function. + +Test categories: +Standard cases: Typical lists with positive, negative, and mixed integers. +Edge cases: Empty lists, lists with a single element, lists with duplicate values. +Defensive tests: Non-list inputs (e.g., integers, strings), lists with non-integer elements, +assertions for invalid inputs. + +Created on 2025-01-11 +Author: Azza +""" + +import unittest + +from ..largest_number import largest_number + + +class TestLargestNumber(unittest.TestCase): + """Unit tests for the largest_number function.""" + + def test_standard_list(self): + """It should return 9 for [0, 1, 9, 2, 6, 4].""" + self.assertEqual(largest_number([0, 1, 9, 2, 6, 4]), 9) + + def test_single_element(self): + """It should return 12 for [12].""" + self.assertEqual(largest_number([12]), 12) + + def test_mixed_positive_and_negative(self): + """It should return 8 for [8, -1, -8, 5].""" + self.assertEqual(largest_number([8, -1, -8, 5]), 8) + + def test_all_negative_numbers(self): + """It should return -1 for [-9, -1, -6, -5].""" + self.assertEqual(largest_number([-9, -1, -6, -5]), -1) + + def test_all_zeros(self): + """It should return 0 for [0, 0].""" + self.assertEqual(largest_number([0, 0]), 0) + + def test_large_numbers(self): + """It should return 4294967296 for [2**32, 2**16, 2**8, 1].""" + self.assertEqual(largest_number([2**32, 2**16, 2**8, 1]), 2**32) + + def test_empty_list(self): + """It should raise ValueError for an empty list.""" + with self.assertRaises(ValueError): + largest_number([]) + + def test_non_list_input(self): + """It should raise TypeError for non-list input, e.g., 42.""" + with self.assertRaises(TypeError): + largest_number(42) + + def test_list_with_non_integer(self): + """It should raise TypeError for a list with non-integer elements.""" + with self.assertRaises(TypeError): + largest_number(["-5", 5, "0"]) + + +if __name__ == "__main__": + unittest.main()