From a8b84207161bf33358d899abd278f447890cf3f9 Mon Sep 17 00:00:00 2001 From: Hardik Pawar <97388607+Hardvan@users.noreply.github.com> Date: Sat, 26 Oct 2024 23:25:18 +0530 Subject: [PATCH] =?UTF-8?q?Enhance=20docs,=20remove=20`main`.=20add=20more?= =?UTF-8?q?=20tests=20in=20`HexaDecimal=E2=80=A6=20(#5923)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conversions/HexaDecimalToDecimal.java | 50 +++++++++++-------- .../conversions/HexaDecimalToDecimalTest.java | 33 ++++++++++-- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java b/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java index 003781da9..2cf6024d9 100644 --- a/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java +++ b/src/main/java/com/thealgorithms/conversions/HexaDecimalToDecimal.java @@ -1,39 +1,45 @@ package com.thealgorithms.conversions; -import java.util.Scanner; - +/** + * Utility class for converting a hexadecimal string to its decimal representation. + *

+ * A hexadecimal number uses the base-16 numeral system, with the following characters: + *

+ * Each character represents a power of 16. For example: + *
+ *   Hexadecimal "A1" = 10*16^1 + 1*16^0 = 161 (decimal)
+ * 
+ * + *

This class provides a method to perform the conversion without using built-in Java utilities.

+ */ public final class HexaDecimalToDecimal { private HexaDecimalToDecimal() { } - // convert hexadecimal to decimal + /** + * Converts a hexadecimal string to its decimal integer equivalent. + *

The input string is case-insensitive, and must contain valid hexadecimal characters [0-9, A-F].

+ * + * @param hex the hexadecimal string to convert + * @return the decimal integer representation of the input hexadecimal string + * @throws IllegalArgumentException if the input string contains invalid characters + */ public static int getHexaToDec(String hex) { String digits = "0123456789ABCDEF"; hex = hex.toUpperCase(); int val = 0; + for (int i = 0; i < hex.length(); i++) { int d = digits.indexOf(hex.charAt(i)); + if (d == -1) { + throw new IllegalArgumentException("Invalid hexadecimal character: " + hex.charAt(i)); + } val = 16 * val + d; } + return val; } - - // Main method gets the hexadecimal input from user and converts it into Decimal output. - public static void main(String[] args) { - String hexaInput; - int decOutput; - Scanner scan = new Scanner(System.in); - - System.out.print("Enter Hexadecimal Number : "); - hexaInput = scan.nextLine(); - - // convert hexadecimal to decimal - decOutput = getHexaToDec(hexaInput); - /* - Pass the string to the getHexaToDec function - and it returns the decimal form in the variable decOutput. - */ - System.out.println("Number in Decimal: " + decOutput); - scan.close(); - } } diff --git a/src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java b/src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java index c9c2ab216..d0d6b400e 100644 --- a/src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java +++ b/src/test/java/com/thealgorithms/conversions/HexaDecimalToDecimalTest.java @@ -1,14 +1,37 @@ package com.thealgorithms.conversions; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class HexaDecimalToDecimalTest { - @Test - public void testhexaDecimalToDecimal() { - assertEquals(161, HexaDecimalToDecimal.getHexaToDec("A1")); - assertEquals(428, HexaDecimalToDecimal.getHexaToDec("1ac")); + @ParameterizedTest + @CsvSource({ + "A1, 161", // Simple case with two characters + "1AC, 428", // Mixed-case input + "0, 0", // Single zero + "F, 15", // Single digit + "10, 16", // Power of 16 + "FFFF, 65535", // Max 4-character hex + "7FFFFFFF, 2147483647" // Max positive int value + }) + public void + testValidHexaToDecimal(String hexInput, int expectedDecimal) { + assertEquals(expectedDecimal, HexaDecimalToDecimal.getHexaToDec(hexInput)); + } + + @ParameterizedTest + @CsvSource({ + "G", // Invalid character + "1Z", // Mixed invalid input + "123G", // Valid prefix with invalid character + "#$%" // Non-hexadecimal symbols + }) + public void + testInvalidHexaToDecimal(String invalidHex) { + assertThrows(IllegalArgumentException.class, () -> HexaDecimalToDecimal.getHexaToDec(invalidHex)); } }