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 DurationExpressionTest extends AbstractExpressionTest<DurationExpression> {
@Override
protected DurationExpression build(final Context ctx) {
return new DurationExpression(ctx, TimeUnit.SECONDS, 42);
}
@Override
protected BiFunction<Expression.Visitor<Void>, DurationExpression, Void> visitorMethod() {
return Expression.Visitor::visitDuration;
}
@Test
public void castTest() {
final DurationExpression dur = build();
assertEquals(new IntegerExpression(ctx, dur.toMilliseconds()),
dur.cast(IntegerExpression.class));
}
@Test
public void operationsTest() {
biFuncTest(a -> new DurationExpression(a, TimeUnit.SECONDS, 21L),
b -> new DurationExpression(b, TimeUnit.SECONDS, 21L),
r -> new DurationExpression(r, TimeUnit.SECONDS, 42L), DurationExpression::add);
biFuncTest(a -> new DurationExpression(a, TimeUnit.SECONDS, 21L),
b -> new DurationExpression(b, TimeUnit.SECONDS, 11L),
r -> new DurationExpression(r, TimeUnit.SECONDS, 10L), DurationExpression::sub);
// find least common unit
biFuncTest(a -> new DurationExpression(a, TimeUnit.MINUTES, 21L),
b -> new DurationExpression(b, TimeUnit.SECONDS, 10L),
r -> new DurationExpression(r, TimeUnit.SECONDS, 1250L), DurationExpression::sub);
uniFuncTest(a -> new DurationExpression(a, TimeUnit.SECONDS, 10L),
r -> new DurationExpression(r, TimeUnit.SECONDS, -10L), DurationExpression::negate);
}
}