From 734e1df0b6b79cbb624dc680c01f9026c4fb650b Mon Sep 17 00:00:00 2001 From: Marc Al Darazi Date: Sat, 11 Jan 2025 10:57:18 +0300 Subject: [PATCH] hex_to_binary challenge i have done with the second challenge hex_to_binary and it's ready to be reviewed --- solutions/hex_to_binary.py | 41 +++++++++++++++++++++ solutions/tests/test_hex_to_binary.py | 52 +++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 solutions/hex_to_binary.py create mode 100644 solutions/tests/test_hex_to_binary.py diff --git a/solutions/hex_to_binary.py b/solutions/hex_to_binary.py new file mode 100644 index 000000000..32b2a323a --- /dev/null +++ b/solutions/hex_to_binary.py @@ -0,0 +1,41 @@ +""" +hex_to_binary.py + +This module provides a utility function to convert a hexadecimal string +to its binary representation. + +Functions: +- hex_to_binary: Converts a hexadecimal string to its binary equivalent. +""" + +def hex_to_binary(hex_string): + """ + Convert a hexadecimal string to its binary representation. + + Parameters: + hex_string (str): A string representing a hexadecimal number. + It can include a leading '0x' prefix or not. + + Returns: + str: A binary string representation of the given hexadecimal number, + with leading zeros preserved. + + Raises: + ValueError: If the input string is not a valid hexadecimal number. + + Example: + >>> hex_to_binary("1A") + '11010' + >>> hex_to_binary("0xFF") + '11111111' + """ + # Remove '0x' prefix if present + if hex_string.startswith("0x"): + hex_string = hex_string[2:] + + try: + # Convert to integer, then to binary + binary_string = bin(int(hex_string, 16))[2:] # Remove '0b' prefix + return binary_string + except ValueError: + raise ValueError("Invalid hexadecimal string") diff --git a/solutions/tests/test_hex_to_binary.py b/solutions/tests/test_hex_to_binary.py new file mode 100644 index 000000000..e3ea6d603 --- /dev/null +++ b/solutions/tests/test_hex_to_binary.py @@ -0,0 +1,52 @@ +import unittest +from hex_to_binary import hex_to_binary + +class TestHexToBinary(unittest.TestCase): + """ + Unit tests for the hex_to_binary function. + + These tests validate that the hex_to_binary function correctly converts + hexadecimal strings to binary strings, handling both cases with and + without the '0x' prefix and invalid inputs. + """ + + def test_valid_hex_without_prefix(self): + """ + Test converting a valid hexadecimal string without the '0x' prefix. + """ + self.assertEqual(hex_to_binary("1A"), "11010") + + def test_valid_hex_with_prefix(self): + """ + Test converting a valid hexadecimal string with the '0x' prefix. + """ + self.assertEqual(hex_to_binary("0xFF"), "11111111") + + def test_single_digit_hex(self): + """ + Test converting a single digit hexadecimal string. + """ + self.assertEqual(hex_to_binary("9"), "1001") + + def test_hex_with_lowercase_letters(self): + """ + Test converting a hexadecimal string with lowercase letters. + """ + self.assertEqual(hex_to_binary("a"), "1010") + + def test_invalid_hex_with_non_hex_characters(self): + """ + Test an invalid hexadecimal string with non-hex characters. + """ + with self.assertRaises(ValueError): + hex_to_binary("G1") + + def test_empty_string(self): + """ + Test an empty string as input, which should raise a ValueError. + """ + with self.assertRaises(ValueError): + hex_to_binary("") + +if __name__ == "_main_": + unittest.main()