package com.querydsl.collections;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.MathExpressions;
import com.querydsl.core.types.dsl.NumberPath;
public class MathTest {
private NumberPath<Double> num = Expressions.numberPath(Double.class, "num");
@Test
public void math() {
Expression<Double> expr = num;
assertEquals(Math.acos(0.5), unique(MathExpressions.acos(expr)), 0.001);
assertEquals(Math.asin(0.5), unique(MathExpressions.asin(expr)), 0.001);
assertEquals(Math.atan(0.5), unique(MathExpressions.atan(expr)), 0.001);
assertEquals(Math.cos(0.5), unique(MathExpressions.cos(expr)), 0.001);
assertEquals(Math.cosh(0.5), unique(MathExpressions.cosh(expr)), 0.001);
assertEquals(cot(0.5), unique(MathExpressions.cot(expr)), 0.001);
assertEquals(coth(0.5), unique(MathExpressions.coth(expr)), 0.001);
assertEquals(degrees(0.5), unique(MathExpressions.degrees(expr)), 0.001);
assertEquals(Math.exp(0.5), unique(MathExpressions.exp(expr)), 0.001);
assertEquals(Math.log(0.5), unique(MathExpressions.ln(expr)), 0.001);
assertEquals(log(0.5, 10), unique(MathExpressions.log(expr, 10)), 0.001);
assertEquals(0.25, unique(MathExpressions.power(expr, 2)), 0.001);
assertEquals(radians(0.5), unique(MathExpressions.radians(expr)), 0.001);
assertEquals(Integer.valueOf(1),
unique(MathExpressions.sign(expr)));
assertEquals(Math.sin(0.5), unique(MathExpressions.sin(expr)), 0.001);
assertEquals(Math.sinh(0.5), unique(MathExpressions.sinh(expr)), 0.001);
assertEquals(Math.tan(0.5), unique(MathExpressions.tan(expr)), 0.001);
assertEquals(Math.tanh(0.5), unique(MathExpressions.tanh(expr)), 0.001);
}
private double cot(double x) {
return Math.cos(x) / Math.sin(x);
}
private double coth(double x) {
return Math.cosh(x) / Math.sinh(x);
}
private double degrees(double x) {
return x * 180.0 / Math.PI;
}
private double radians(double x) {
return x * Math.PI / 180.0;
}
private double log(double x, int y) {
return Math.log(x) / Math.log(y);
}
private <T> T unique(Expression<T> expr) {
//return query().fetchOne(expr);
return CollQueryFactory.from(num, Arrays.asList(0.5)).select(expr).fetchOne();
}
}