diff --git a/src/main/java/com/ezylang/evalex/functions/AbstractFunction.java b/src/main/java/com/ezylang/evalex/functions/AbstractFunction.java index a6b96d0..646defd 100644 --- a/src/main/java/com/ezylang/evalex/functions/AbstractFunction.java +++ b/src/main/java/com/ezylang/evalex/functions/AbstractFunction.java @@ -15,6 +15,8 @@ */ package com.ezylang.evalex.functions; +import static java.math.BigDecimal.valueOf; + import com.ezylang.evalex.EvaluationException; import com.ezylang.evalex.data.EvaluationValue; import com.ezylang.evalex.parser.Token; @@ -28,6 +30,7 @@ import java.util.List; */ public abstract class AbstractFunction implements FunctionIfc { + protected static final BigDecimal MINUS_ONE = valueOf(-1); private final List functionParameterDefinitions = new ArrayList<>(); private final boolean hasVarArgs; diff --git a/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosFunction.java b/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosFunction.java index 05926f5..a89a97a 100644 --- a/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosFunction.java +++ b/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosFunction.java @@ -15,20 +15,34 @@ */ package com.ezylang.evalex.functions.trigonometric; +import static java.math.BigDecimal.ONE; + +import com.ezylang.evalex.EvaluationException; import com.ezylang.evalex.Expression; import com.ezylang.evalex.data.EvaluationValue; import com.ezylang.evalex.functions.AbstractFunction; import com.ezylang.evalex.functions.FunctionParameter; import com.ezylang.evalex.parser.Token; +import java.math.BigDecimal; /** Returns the arc-cosine (in degrees). */ @FunctionParameter(name = "value") public class AcosFunction extends AbstractFunction { @Override public EvaluationValue evaluate( - Expression expression, Token functionToken, EvaluationValue... parameterValues) { + Expression expression, Token functionToken, EvaluationValue... parameterValues) + throws EvaluationException { + + BigDecimal parameterValue = parameterValues[0].getNumberValue(); - return expression.convertDoubleValue( - Math.toDegrees(Math.acos(parameterValues[0].getNumberValue().doubleValue()))); + if (parameterValue.compareTo(ONE) > 0) { + throw new EvaluationException( + functionToken, "Illegal acos(x) for x > 1: x = " + parameterValue); + } + if (parameterValue.compareTo(MINUS_ONE) < 0) { + throw new EvaluationException( + functionToken, "Illegal acos(x) for x < -1: x = " + parameterValue); + } + return expression.convertDoubleValue(Math.toDegrees(Math.acos(parameterValue.doubleValue()))); } } diff --git a/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosRFunction.java b/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosRFunction.java index 0951227..1b57ca4 100644 --- a/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosRFunction.java +++ b/src/main/java/com/ezylang/evalex/functions/trigonometric/AcosRFunction.java @@ -15,20 +15,35 @@ */ package com.ezylang.evalex.functions.trigonometric; +import static java.math.BigDecimal.ONE; + +import com.ezylang.evalex.EvaluationException; import com.ezylang.evalex.Expression; import com.ezylang.evalex.data.EvaluationValue; import com.ezylang.evalex.functions.AbstractFunction; import com.ezylang.evalex.functions.FunctionParameter; import com.ezylang.evalex.parser.Token; +import java.math.BigDecimal; /** Returns the arc-cosine (in radians). */ @FunctionParameter(name = "cosine") public class AcosRFunction extends AbstractFunction { @Override public EvaluationValue evaluate( - Expression expression, Token functionToken, EvaluationValue... parameterValues) { + Expression expression, Token functionToken, EvaluationValue... parameterValues) + throws EvaluationException { + + BigDecimal parameterValue = parameterValues[0].getNumberValue(); + + if (parameterValue.compareTo(ONE) > 0) { + throw new EvaluationException( + functionToken, "Illegal acosr(x) for x > 1: x = " + parameterValue); + } + if (parameterValue.compareTo(MINUS_ONE) < 0) { + throw new EvaluationException( + functionToken, "Illegal acosr(x) for x < -1: x = " + parameterValue); + } - return expression.convertDoubleValue( - Math.acos(parameterValues[0].getNumberValue().doubleValue())); + return expression.convertDoubleValue(Math.acos(parameterValue.doubleValue())); } } diff --git a/src/main/java/com/ezylang/evalex/functions/trigonometric/AsinFunction.java b/src/main/java/com/ezylang/evalex/functions/trigonometric/AsinFunction.java index c77cee8..bf47bbd 100644 --- a/src/main/java/com/ezylang/evalex/functions/trigonometric/AsinFunction.java +++ b/src/main/java/com/ezylang/evalex/functions/trigonometric/AsinFunction.java @@ -16,7 +16,6 @@ package com.ezylang.evalex.functions.trigonometric; import static java.math.BigDecimal.ONE; -import static java.math.BigDecimal.valueOf; import com.ezylang.evalex.EvaluationException; import com.ezylang.evalex.Expression; @@ -30,8 +29,6 @@ import java.math.BigDecimal; @FunctionParameter(name = "value") public class AsinFunction extends AbstractFunction { - private static final BigDecimal MINUS_ONE = valueOf(-1); - @Override public EvaluationValue evaluate( Expression expression, Token functionToken, EvaluationValue... parameterValues) diff --git a/src/test/java/com/ezylang/evalex/functions/trigonometric/TrigonometricFunctionsTest.java b/src/test/java/com/ezylang/evalex/functions/trigonometric/TrigonometricFunctionsTest.java index 43355fa..3a6a041 100644 --- a/src/test/java/com/ezylang/evalex/functions/trigonometric/TrigonometricFunctionsTest.java +++ b/src/test/java/com/ezylang/evalex/functions/trigonometric/TrigonometricFunctionsTest.java @@ -41,6 +41,20 @@ class TrigonometricFunctionsTest extends BaseEvaluationTest { assertExpressionHasExpectedResult(expression, expectedResult); } + @Test + void testAcosThrowsExceptionPositive() { + assertThatThrownBy(() -> new Expression("ACOS(1.5)").evaluate()) + .isInstanceOf(EvaluationException.class) + .hasMessage("Illegal acos(x) for x > 1: x = 1.5"); + } + + @Test + void testAcosThrowsExceptionNegative() { + assertThatThrownBy(() -> new Expression("ACOS(-1.5)").evaluate()) + .isInstanceOf(EvaluationException.class) + .hasMessage("Illegal acos(x) for x < -1: x = -1.5"); + } + @ParameterizedTest @CsvSource( delimiter = ':', @@ -75,6 +89,20 @@ class TrigonometricFunctionsTest extends BaseEvaluationTest { assertExpressionHasExpectedResult(expression, expectedResult); } + @Test + void testAcosRThrowsExceptionPositive() { + assertThatThrownBy(() -> new Expression("ACOSR(1.5)").evaluate()) + .isInstanceOf(EvaluationException.class) + .hasMessage("Illegal acosr(x) for x > 1: x = 1.5"); + } + + @Test + void testAcosRThrowsExceptionNegative() { + assertThatThrownBy(() -> new Expression("ACOSR(-1.5)").evaluate()) + .isInstanceOf(EvaluationException.class) + .hasMessage("Illegal acosr(x) for x < -1: x = -1.5"); + } + @ParameterizedTest @CsvSource( delimiter = ':',