/*****************************************************************************
* Copyright (c) 2015 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.nebula.widgets.nattable.formula.function;
import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class FunctionTest {
@Test
public void shouldSumEmptyValues() {
FunctionValue function = new SumFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldSumSingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue function = new SumFunction(values);
assertEquals(new BigDecimal(42), function.getValue());
}
@Test
public void shouldSumTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
values.add(new BigDecimalFunctionValue(23));
FunctionValue function = new SumFunction(values);
assertEquals(new BigDecimal(65), function.getValue());
}
@Test
public void shouldSumMultipleValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(3));
values.add(new BigDecimalFunctionValue(12));
values.add(new BigDecimalFunctionValue(42));
FunctionValue function = new SumFunction(values);
assertEquals(new BigDecimal(5 + 3 + 12 + 42), function.getValue());
}
@Test
public void shouldAvgEmptyValues() {
FunctionValue function = new AverageFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldAvgSingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue function = new AverageFunction(values);
assertEquals(new BigDecimal(42), function.getValue());
}
@Test
public void shouldAvgTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
values.add(new BigDecimalFunctionValue(23));
FunctionValue function = new AverageFunction(values);
assertEquals(new BigDecimal(32.5), function.getValue());
}
@Test
public void shouldAvgMultipleValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(3));
values.add(new BigDecimalFunctionValue(12));
values.add(new BigDecimalFunctionValue(40));
FunctionValue function = new AverageFunction(values);
assertEquals(new BigDecimal((5 + 3 + 12 + 40) / 4), function.getValue());
}
@Test
public void shouldMultiplyEmptyValues() {
FunctionValue function = new ProductFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldMultiplySingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue fFunction = new ProductFunction(values);
assertEquals(new BigDecimal(42), fFunction.getValue());
}
@Test
public void shouldMultiplyTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(4));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new ProductFunction(values);
assertEquals(new BigDecimal(8), function.getValue());
}
@Test
public void shouldMultiplyMultipleValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(3));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new ProductFunction(values);
assertEquals(new BigDecimal(5 * 3 * 2), function.getValue());
}
@Test
public void shouldDivideEmptyValues() {
FunctionValue function = new QuotientFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldDivideSingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue fFunction = new QuotientFunction(values);
assertEquals(new BigDecimal(42), fFunction.getValue());
}
@Test
public void shouldDivideTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(4));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new QuotientFunction(values);
assertEquals(new BigDecimal(2), function.getValue());
}
@Test
public void shouldDivideMultipleValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(20));
values.add(new BigDecimalFunctionValue(4));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new QuotientFunction(values);
assertEquals(new BigDecimal(20d / 4d / 2d), function.getValue());
}
@Test
public void shouldDivideNonTerminating() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(-3));
FunctionValue function = new QuotientFunction(values);
assertEquals(new BigDecimal(5).divide(new BigDecimal(-3), 9, RoundingMode.HALF_UP), function.getValue());
}
@Test(expected = FunctionException.class)
public void shouldThrowExceptionOnDivisionByZero() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(0));
FunctionValue function = new QuotientFunction(values);
assertEquals(new BigDecimal(5), function.getValue());
}
@Test(expected = IllegalArgumentException.class)
public void shouldNegateEmptyValues() {
FunctionValue function = new NegateFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldNegateSingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue function = new NegateFunction(values);
assertEquals(new BigDecimal(-42), function.getValue());
}
@Test(expected = IllegalArgumentException.class)
public void shouldNegateTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(4));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new NegateFunction(values);
assertEquals(new BigDecimal(2), function.getValue());
}
@Test
public void shouldCalculateNestedFunctions() {
List<FunctionValue> productValues = new ArrayList<FunctionValue>();
productValues.add(new BigDecimalFunctionValue(4));
productValues.add(new BigDecimalFunctionValue(5));
FunctionValue productFunction = new ProductFunction(productValues);
List<FunctionValue> sumValues = new ArrayList<FunctionValue>();
sumValues.add(productFunction);
sumValues.add(new BigDecimalFunctionValue(5));
FunctionValue sumFunction = new SumFunction(sumValues);
List<FunctionValue> divValues = new ArrayList<FunctionValue>();
divValues.add(sumFunction);
divValues.add(new BigDecimalFunctionValue(5));
FunctionValue divFunction = new QuotientFunction(divValues);
FunctionValue negFunction = new NegateFunction(divFunction);
assertEquals(new BigDecimal(-5), negFunction.getValue());
}
@Test
public void shouldPowerEmptyValues() {
FunctionValue function = new PowerFunction(new ArrayList<FunctionValue>());
assertEquals(new BigDecimal(0), function.getValue());
}
@Test
public void shouldPowerSingleValue() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(42));
FunctionValue function = new PowerFunction(values);
assertEquals(new BigDecimal(42), function.getValue());
}
@Test
public void shouldPowerTwoValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new PowerFunction(values);
assertEquals(new BigDecimal(25), function.getValue());
}
@Test
public void shouldPowerMultipleValues() {
List<FunctionValue> values = new ArrayList<FunctionValue>();
values.add(new BigDecimalFunctionValue(5));
values.add(new BigDecimalFunctionValue(3));
values.add(new BigDecimalFunctionValue(2));
FunctionValue function = new PowerFunction(values);
assertEquals(new BigDecimal(15625), function.getValue());
}
}