package com.spotify.heroic.grammar;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import static com.spotify.heroic.grammar.ExpressionTests.biFuncTest;
import static com.spotify.heroic.grammar.ExpressionTests.uniFuncTest;
import static org.junit.Assert.assertEquals;
public class DoubleExpressionTest extends AbstractExpressionTest<DoubleExpression> {
@Override
protected DoubleExpression build(final Context ctx) {
return new DoubleExpression(ctx, 42D);
}
@Override
protected BiFunction<Expression.Visitor<Void>, DoubleExpression, Void> visitorMethod() {
return Expression.Visitor::visitDouble;
}
@Test
public void castTest() {
final DoubleExpression d = build();
assertEquals(new IntegerExpression(ctx, (long) d.getValue()),
d.cast(IntegerExpression.class));
assertEquals(new DurationExpression(ctx, TimeUnit.MILLISECONDS, (int) d.getValue()),
d.cast(DurationExpression.class));
}
@Test
public void operationsTest() {
biFuncTest(a -> new DoubleExpression(a, 21D), b -> new DoubleExpression(b, 21D),
r -> new DoubleExpression(r, 42D), DoubleExpression::add);
biFuncTest(a -> new DoubleExpression(a, 21D), b -> new DoubleExpression(b, 21D),
r -> new DoubleExpression(r, 0D), DoubleExpression::sub);
biFuncTest(a -> new DoubleExpression(a, 20D), b -> new DoubleExpression(b, 2D),
r -> new DoubleExpression(r, 10D), DoubleExpression::divide);
biFuncTest(a -> new DoubleExpression(a, 10D), b -> new DoubleExpression(b, 20D),
r -> new DoubleExpression(r, 200D), DoubleExpression::multiply);
uniFuncTest(a -> new DoubleExpression(a, 10D), r -> new DoubleExpression(r, -10D),
DoubleExpression::negate);
}
}