package mulCal.equationParser;
import static junit.framework.Assert.assertEquals;
import static mulCal.equationParser.InfixToRPN.toRPN;
import static mulCal.equationParser.PostfixEval.eval;
import static mulCal.equationParser.Tokenize.toTokens;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import org.junit.Test;
public class PostfixEvalTest {
@Test
public void testEvalOperators() throws Exception {
assertEquals(new BigDecimal("3"), eval(toRPN(toTokens("1 + 2"))));
assertEquals(new BigDecimal("7"), eval(toRPN(toTokens("1 + 2 * 3"))));
assertEquals(new BigDecimal("9"), eval(toRPN(toTokens("(1 + 2) * 3"))));
assertEquals(new BigDecimal("23"), eval(toRPN(toTokens("10 * 2 + 3"))));
assertEquals(new BigDecimal("23"), eval(toRPN(toTokens("(10 * 2) + 3"))));
assertEquals(new BigDecimal("50"), eval(toRPN(toTokens("10 * (2 + 3)"))));
assertEquals(new BigDecimal("1"), eval(toRPN(toTokens("2 - 1"))));
assertEquals(new BigDecimal("0.5"), eval(toRPN(toTokens("5.00 / 10.00"))));
assertEquals(new BigDecimal("0.500"), eval(toRPN(toTokens("5.000000000 / 10.000000"))));
assertEquals(new BigDecimal("0.5"), eval(toRPN(toTokens("5 / 10"))));
assertEquals(new BigDecimal("1"), eval(toRPN(toTokens("10 % 3"))));
assertTrue(0.001 > eval(toRPN(toTokens("1 / 3"))).subtract(new BigDecimal("0.3333333333333333333")).floatValue());
}
@Test
public void testEvalFunctions() throws Exception {
assertEquals(new BigDecimal("3"), eval(toRPN(toTokens("1 + nul 2"))));
assertEquals(new BigDecimal("-1"), eval(toRPN(toTokens("-abs-1"))));
assertTrue(eval(toRPN(toTokens("sin 3.14159265"))).doubleValue() < 0.0001);
assertTrue(eval(toRPN(toTokens("sin(3.14159265)"))).doubleValue() < 0.0001);
}
@Test(expected=ArithmeticException.class)
public void testFailDivZero() throws Exception {
eval(toRPN(toTokens("1/0")));
}
}