diff --git a/src/main/java/com/phalanx/calc/MathOps.java b/src/main/java/com/phalanx/calc/MathOps.java index 16d072d..1f8909f 100644 --- a/src/main/java/com/phalanx/calc/MathOps.java +++ b/src/main/java/com/phalanx/calc/MathOps.java @@ -29,4 +29,22 @@ public static double divide(double a, double b) { } return a / b; } + + public static double percentage(double part, double whole) { + if (whole == 0) { + throw new ArithmeticException("cannot compute percentage of zero"); + } + return (part / whole) * 100; + } + + public static double average(double[] values) { + if (values.length == 0) { + throw new IllegalArgumentException("cannot average an empty list"); + } + double sum = 0; + for (double v : values) { + sum += v; + } + return sum / values.length; + } } diff --git a/src/test/java/com/phalanx/calc/MathOpsTest.java b/src/test/java/com/phalanx/calc/MathOpsTest.java index 7b7c7c1..1e48267 100644 --- a/src/test/java/com/phalanx/calc/MathOpsTest.java +++ b/src/test/java/com/phalanx/calc/MathOpsTest.java @@ -61,4 +61,48 @@ void divideFractions() { void divideByZeroThrows() { assertThrows(ArithmeticException.class, () -> MathOps.divide(1, 0)); } + + // --- percentage --- + + @Test + void percentageHalf() { + assertEquals(50.0, MathOps.percentage(1, 2)); + } + + @Test + void percentageHundred() { + assertEquals(100.0, MathOps.percentage(5, 5)); + } + + @Test + void percentageSmall() { + assertEquals(25.0, MathOps.percentage(1, 4)); + } + + @Test + void percentageOfZeroThrows() { + assertThrows(ArithmeticException.class, () -> MathOps.percentage(5, 0)); + } + + // --- average --- + + @Test + void averageSingleValue() { + assertEquals(7.0, MathOps.average(new double[]{7})); + } + + @Test + void averageMultipleValues() { + assertEquals(3.0, MathOps.average(new double[]{1, 2, 3, 4, 5})); + } + + @Test + void averageWithNegatives() { + assertEquals(0.0, MathOps.average(new double[]{-1, 0, 1})); + } + + @Test + void averageEmptyThrows() { + assertThrows(IllegalArgumentException.class, () -> MathOps.average(new double[]{})); + } }