package jscl.math.operator;
import jscl.JsclMathEngine;
import jscl.text.ParseException;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class PercentTest {
@Test
public void testNumeric() throws Exception {
final JsclMathEngine me = new JsclMathEngine();
assertEquals("150", me.evaluate("100+50%"));
assertEquals("0", me.evaluate("100-100%"));
assertEquals("50", me.evaluate("100*50%"));
assertEquals("150", me.evaluate("100+100*50%"));
assertEquals("125", me.evaluate("100+100*50%*50%"));
assertEquals("125", me.evaluate("100+100*50%*(25+25)%"));
assertEquals("250", me.evaluate("100+100*50%*(25+25)%+100%"));
assertEquals("150", me.evaluate("100+(100*50%*(25+25)%+100%)"));
assertEquals("140", me.evaluate("100+(20+20)%"));
assertEquals("124", me.evaluate("100+(20%+20%)"));
assertEquals("100+50%-50%", me.simplify("100+50%-50%"));
assertEquals("100+(100*50%*(50)%+100%)", me.simplify("100+(100*50%*(25+25)%+100%)"));
assertEquals("450", me.evaluate("((100+100*50%)+50%)*200%"));
assertEquals("150", me.evaluate("((100+100*50%)*50%)+100%"));
assertEquals("150", me.evaluate("100*50%+100"));
assertEquals("75", me.evaluate("100+50%-50%"));
assertEquals("75", me.evaluate("100+50%+(-50%)"));
assertEquals("0", me.evaluate("0+(-50%)"));
assertEquals("0", me.evaluate("0+(50%)"));
assertEquals("0", me.evaluate("0+50%"));
assertEquals("-150", me.evaluate("-100+50%"));
assertEquals("-148.5", me.evaluate("1-100+50%"));
assertEquals("-49.5", me.evaluate("1-100-50%"));
assertEquals("-49.5", me.evaluate("(1-100)-50%"));
assertEquals("-49", me.evaluate("1-(100-50%)"));
assertEquals("50", me.evaluate("100-50%"));
assertEquals("2600", me.evaluate("100+50%^2"));
assertEquals("101.0813826568003", me.evaluate("100+50^2%"));
assertEquals("22500", me.evaluate("(100+50%)^2"));
assertEquals("225", me.evaluate("(100+50%)+50%"));
assertEquals("225", me.evaluate("(100+50%)+(abs(-50)+10-10)%"));
assertEquals("0", me.evaluate("100-(10+2*40+10)%"));
assertEquals("3", me.evaluate("100-(10+2*40+10)%+3"));
assertEquals("0", me.evaluate("100-(200/2)%"));
assertEquals("3", me.evaluate("100-(200/2)%+3"));
assertEquals("99", me.evaluate("100-2*50%"));
assertEquals("102", me.evaluate("100-2*50%+3"));
assertEquals("84", me.evaluate("20+2^3!"));
assertEquals("21.0471285480509", me.evaluate("20+10^2%"));
assertEquals("20.48", me.evaluate("20+4!*2%"));
assertEquals("120", me.evaluate("100-20+50%"));
try {
me.evaluate("+50%");
Assert.fail();
} catch (ParseException e) {
}
assertEquals("0.5", me.evaluate("50%"));
assertEquals("-0.5", me.evaluate("-50%"));
assertEquals("225", me.evaluate("(100+50%)+50%"));
// undefined behavior, percent function always uses preceding number ignoring multiplier after
assertEquals("10100", me.evaluate("100+100%*100"));
}
}