mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
refactor: Enhance docs, code, add tests in HarshadNumber (#6745)
This commit is contained in:
@@ -1,25 +1,135 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class HarshadNumberTest {
|
||||
/**
|
||||
* Test class for {@link HarshadNumber}.
|
||||
* Tests various scenarios including positive cases, edge cases, and exception
|
||||
* handling.
|
||||
*/
|
||||
class HarshadNumberTest {
|
||||
|
||||
@Test
|
||||
public void harshadNumber() {
|
||||
void testValidHarshadNumbers() {
|
||||
// Single digit Harshad numbers (all single digits except 0 are Harshad numbers)
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(1));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(2));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(3));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(4));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(5));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(6));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(7));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(8));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(9));
|
||||
|
||||
assertTrue(HarshadNumber.isHarshad(18));
|
||||
assertFalse(HarshadNumber.isHarshad(-18));
|
||||
assertFalse(HarshadNumber.isHarshad(19));
|
||||
assertTrue(HarshadNumber.isHarshad(999999999));
|
||||
assertFalse(HarshadNumber.isHarshad(0));
|
||||
// Two digit Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(10)); // 10 / (1 + 0) = 10
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(12)); // 12 / (1 + 2) = 4
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(18)); // 18 / (1 + 8) = 2
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(20)); // 20 / (2 + 0) = 10
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(21)); // 21 / (2 + 1) = 7
|
||||
|
||||
assertTrue(HarshadNumber.isHarshad("18"));
|
||||
assertFalse(HarshadNumber.isHarshad("-18"));
|
||||
assertFalse(HarshadNumber.isHarshad("19"));
|
||||
assertTrue(HarshadNumber.isHarshad("999999999"));
|
||||
assertTrue(HarshadNumber.isHarshad("99999999999100"));
|
||||
// Three digit Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(100)); // 100 / (1 + 0 + 0) = 100
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(102)); // 102 / (1 + 0 + 2) = 34
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(108)); // 108 / (1 + 0 + 8) = 12
|
||||
|
||||
// Large Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(1000)); // 1000 / (1 + 0 + 0 + 0) = 1000
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(1002)); // 1002 / (1 + 0 + 0 + 2) = 334
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad(999999999)); // 999999999 / (9*9) = 12345679
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInvalidHarshadNumbers() {
|
||||
// Numbers that are not Harshad numbers
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(11)); // 11 / (1 + 1) = 5.5
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(13)); // 13 / (1 + 3) = 3.25
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(17)); // 17 / (1 + 7) = 2.125
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(19)); // 19 / (1 + 9) = 1.9
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(23)); // 23 / (2 + 3) = 4.6
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad(101)); // 101 / (1 + 0 + 1) = 50.5
|
||||
}
|
||||
|
||||
@Test
|
||||
void testZeroThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNegativeNumbersThrowException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(-1));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(-18));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(-100));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidHarshadNumbersWithString() {
|
||||
// Single digit Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("1"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("2"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("9"));
|
||||
|
||||
// Two digit Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("10"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("12"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("18"));
|
||||
|
||||
// Large Harshad numbers
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("1000"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("999999999"));
|
||||
Assertions.assertTrue(HarshadNumber.isHarshad("99999999999100"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInvalidHarshadNumbersWithString() {
|
||||
// Numbers that are not Harshad numbers
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad("11"));
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad("13"));
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad("19"));
|
||||
Assertions.assertFalse(HarshadNumber.isHarshad("23"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testStringWithZeroThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testStringWithNegativeNumbersThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("-1"));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("-18"));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("-100"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNullStringThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testEmptyStringThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(""));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInvalidStringThrowsException() {
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("abc"));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("12.5"));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad("12a"));
|
||||
Assertions.assertThrows(IllegalArgumentException.class, () -> HarshadNumber.isHarshad(" 12 "));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMaxLongValue() {
|
||||
// Test with a large number close to Long.MAX_VALUE
|
||||
long largeHarshadCandidate = 9223372036854775800L;
|
||||
// This specific number may or may not be Harshad, just testing it doesn't crash
|
||||
try {
|
||||
HarshadNumber.isHarshad(largeHarshadCandidate);
|
||||
} catch (Exception e) {
|
||||
Assertions.fail("Should not throw exception for valid large numbers");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user