diff --git a/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java new file mode 100644 index 000000000000..4f5f586557cf --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java @@ -0,0 +1,12 @@ +package com.thealgorithms.others.cn; +public class ComputeHammingHandler extends HammingHandler { + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + int totalErrorBitCount = 0; + for (int i = 0; i < bitsStrA.length(); i++) { + totalErrorBitCount += bitsStrA.charAt(i) == bitsStrB.charAt(i) ? 0 : 1; + } + return totalErrorBitCount; + } +} diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index c8239d53d606..b5563563b49e 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java @@ -1,32 +1,14 @@ package com.thealgorithms.others.cn; public final class HammingDistance { - private HammingDistance() { - } - - private static void checkChar(char inChar) { - if (inChar != '0' && inChar != '1') { - throw new IllegalArgumentException("Input must be a binary string."); - } - } - public static int compute(char charA, char charB) { - checkChar(charA); - checkChar(charB); - return charA == charB ? 0 : 1; + private HammingDistance() { } public static int compute(String bitsStrA, String bitsStrB) { - if (bitsStrA.length() != bitsStrB.length()) { - throw new IllegalArgumentException("Input strings must have the same length."); - } - - int totalErrorBitCount = 0; - - for (int i = 0; i < bitsStrA.length(); i++) { - totalErrorBitCount += compute(bitsStrA.charAt(i), bitsStrB.charAt(i)); - } + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - return totalErrorBitCount; + return (int) chain.handle(bitsStrA, bitsStrB); } } diff --git a/src/main/java/com/thealgorithms/others/cn/HammingHandler.java b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java new file mode 100644 index 000000000000..9d1f833f9a59 --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java @@ -0,0 +1,11 @@ +package com.thealgorithms.others.cn; +public abstract class HammingHandler { + protected HammingHandler next; + + public HammingHandler setNext(HammingHandler next) { + this.next = next; + return next; + } + + public abstract Object handle(String bitsStrA, String bitsStrB); +} diff --git a/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java new file mode 100644 index 000000000000..d9d1884dff21 --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java @@ -0,0 +1,18 @@ +package com.thealgorithms.others.cn; +public class ValidateBinaryHandler extends HammingHandler { + + private void checkBinary(String str) { + for (char c : str.toCharArray()) { + if (c != '0' && c != '1') { + throw new IllegalArgumentException("Input must be a binary string."); + } + } + } + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + checkBinary(bitsStrA); + checkBinary(bitsStrB); + return next.handle(bitsStrA, bitsStrB); + } +} diff --git a/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java b/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java new file mode 100644 index 000000000000..df38ed4f1cec --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java @@ -0,0 +1,11 @@ +package com.thealgorithms.others.cn; +public class ValidateLengthHandler extends HammingHandler { + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + if (bitsStrA.length() != bitsStrB.length()) { + throw new IllegalArgumentException("Input strings must have the same length."); + } + return next.handle(bitsStrA, bitsStrB); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java new file mode 100644 index 000000000000..ceaccef03885 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ComputeHammingHandlerTest { + + private final ComputeHammingHandler handler = new ComputeHammingHandler(); + + @Test + public void testHammingDistanceComputation() { + Object result = handler.handle("1101", "1001"); + Assertions.assertThat(result).isEqualTo(1); + } + + @Test + public void identicalStringsShouldReturnZero() { + Object result = handler.handle("1111", "1111"); + Assertions.assertThat(result).isEqualTo(0); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java b/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java new file mode 100644 index 000000000000..fd49e4952ae8 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java @@ -0,0 +1,13 @@ +package com.thealgorithms.others.cn; +public class MockHammingHandler extends HammingHandler { + private final Object returnValue; + + public MockHammingHandler(Object returnValue) { + this.returnValue = returnValue; + } + + @Override + public Object handle(String a, String b) { + return returnValue; + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java new file mode 100644 index 000000000000..2837d1c8990d --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ValidateBinaryHandlerTest { + + private final ValidateBinaryHandler handler = new ValidateBinaryHandler(); + + @Test + public void validBinaryStringsShouldPass() { + handler.setNext(new MockHammingHandler("PASSED")); + Object result = handler.handle("1010", "0110"); + Assertions.assertThat(result).isEqualTo("PASSED"); + } + + @Test + public void invalidBinaryShouldThrowException() { + Assertions.assertThatThrownBy(() -> handler.handle("10A0", "0110")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("binary string"); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java new file mode 100644 index 000000000000..45bf65c82dc5 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ValidateLengthHandlerTest { + + private final ValidateLengthHandler handler = new ValidateLengthHandler(); + + @Test + public void validLengthShouldPass() { + handler.setNext(new MockHammingHandler("LENGTH_OK")); + Object result = handler.handle("1010", "0110"); + Assertions.assertThat(result).isEqualTo("LENGTH_OK"); + } + + @Test + public void mismatchedLengthShouldThrowException() { + Assertions.assertThatThrownBy(() -> handler.handle("101", "10")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("same length"); + } +}