Skip to content

Commit

Permalink
361: Adds input constraints to asin and asinr functions (#363)
Browse files Browse the repository at this point in the history
  • Loading branch information
uklimaschewski authored Mar 19, 2023
1 parent c3558c8 commit f0d2e63
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,38 @@
*/
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;
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-sine (in degrees). */
@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) {
Expression expression, Token functionToken, EvaluationValue... parameterValues)
throws EvaluationException {

BigDecimal parameterValue = parameterValues[0].getNumberValue();

return expression.convertDoubleValue(
Math.toDegrees(Math.asin(parameterValues[0].getNumberValue().doubleValue())));
if (parameterValue.compareTo(ONE) > 0) {
throw new EvaluationException(
functionToken, "Illegal asin(x) for x > 1: x = " + parameterValue);
}
if (parameterValue.compareTo(MINUS_ONE) < 0) {
throw new EvaluationException(
functionToken, "Illegal asin(x) for x < -1: x = " + parameterValue);
}
return expression.convertDoubleValue(Math.toDegrees(Math.asin(parameterValue.doubleValue())));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,38 @@
*/
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;
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-sine (in radians). */
@FunctionParameter(name = "value")
public class AsinRFunction extends AbstractFunction {

private static final BigDecimal MINUS_ONE = valueOf(-1);

@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 asinr(x) for x > 1: x = " + parameterValue);
}
if (parameterValue.compareTo(MINUS_ONE) < 0) {
throw new EvaluationException(
functionToken, "Illegal asinr(x) for x < -1: x = " + parameterValue);
}
return expression.convertDoubleValue(
Math.asin(parameterValues[0].getNumberValue().doubleValue()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,20 @@ void testAsin(String expression, String expectedResult)
assertExpressionHasExpectedResult(expression, expectedResult);
}

@Test
void testAsinThrowsExceptionPositive() {
assertThatThrownBy(() -> new Expression("ASIN(1.5)").evaluate())
.isInstanceOf(EvaluationException.class)
.hasMessage("Illegal asin(x) for x > 1: x = 1.5");
}

@Test
void testAsinThrowsExceptionNegative() {
assertThatThrownBy(() -> new Expression("ASIN(-1.5)").evaluate())
.isInstanceOf(EvaluationException.class)
.hasMessage("Illegal asin(x) for x < -1: x = -1.5");
}

@ParameterizedTest
@CsvSource(
delimiter = ':',
Expand All @@ -161,6 +175,20 @@ void testAsinR(String expression, String expectedResult)
assertExpressionHasExpectedResult(expression, expectedResult);
}

@Test
void testAsinRThrowsExceptionPositive() {
assertThatThrownBy(() -> new Expression("ASINR(1.5)").evaluate())
.isInstanceOf(EvaluationException.class)
.hasMessage("Illegal asinr(x) for x > 1: x = 1.5");
}

@Test
void testAsinRThrowsExceptionNegative() {
assertThatThrownBy(() -> new Expression("ASINR(-1.5)").evaluate())
.isInstanceOf(EvaluationException.class)
.hasMessage("Illegal asinr(x) for x < -1: x = -1.5");
}

@ParameterizedTest
@CsvSource(
delimiter = ':',
Expand Down

0 comments on commit f0d2e63

Please sign in to comment.