public static int getInteger(NodeValue expr) { int result; if(expr.isInteger()) { result = expr.getInteger().intValue(); } else if(expr.isDecimal()) { result = expr.getDecimal().intValue(); } else { throw new RuntimeException("Not an integer value: " + expr); } return result; }
public static NodeValue ceiling(NodeValue v) { switch (classifyNumeric("ceiling", v)) { case OP_INTEGER : return v ; case OP_DECIMAL : BigDecimal dec = v.getDecimal().setScale(0, BigDecimal.ROUND_CEILING) ; return NodeValue.makeDecimal(dec) ; case OP_FLOAT : return NodeValue.makeFloat((float)Math.ceil(v.getFloat())) ; case OP_DOUBLE : return NodeValue.makeDouble(Math.ceil(v.getDouble())) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : " + v) ; } }
public static NodeValue abs(NodeValue nv) { switch (classifyNumeric("abs", nv)) { case OP_INTEGER : return NodeValue.makeInteger(nv.getInteger().abs()) ; case OP_DECIMAL : return NodeValue.makeDecimal(nv.getDecimal().abs()) ; case OP_FLOAT : return NodeValue.makeFloat(Math.abs(nv.getFloat())) ; case OP_DOUBLE : return NodeValue.makeDouble(Math.abs(nv.getDouble())) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : " + nv) ; } }
public static NodeValue numAdd(NodeValue nv1, NodeValue nv2) { switch (classifyNumeric("add", nv1, nv2)) { case OP_INTEGER : return NodeValue.makeInteger(nv1.getInteger().add(nv2.getInteger())) ; case OP_DECIMAL : return NodeValue.makeDecimal(nv1.getDecimal().add(nv2.getDecimal())) ; case OP_FLOAT : return NodeValue.makeFloat(nv1.getFloat() + nv2.getFloat()) ; case OP_DOUBLE : return NodeValue.makeDouble(nv1.getDouble() + nv2.getDouble()) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : (" + nv1 + " ," + nv2 + ")") ; } }
public static NodeValue numSubtract(NodeValue nv1, NodeValue nv2) { switch (classifyNumeric("subtract", nv1, nv2)) { case OP_INTEGER : return NodeValue.makeInteger(nv1.getInteger().subtract(nv2.getInteger())) ; case OP_DECIMAL : return NodeValue.makeDecimal(nv1.getDecimal().subtract(nv2.getDecimal())) ; case OP_FLOAT : return NodeValue.makeFloat(nv1.getFloat() - nv2.getFloat()) ; case OP_DOUBLE : return NodeValue.makeDouble(nv1.getDouble() - nv2.getDouble()) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : (" + nv1 + " ," + nv2 + ")") ; } }
public static NodeValue numMultiply(NodeValue nv1, NodeValue nv2) { switch (classifyNumeric("multiply", nv1, nv2)) { case OP_INTEGER : return NodeValue.makeInteger(nv1.getInteger().multiply(nv2.getInteger())) ; case OP_DECIMAL : return NodeValue.makeDecimal(nv1.getDecimal().multiply(nv2.getDecimal())) ; case OP_FLOAT : return NodeValue.makeFloat(nv1.getFloat() * nv2.getFloat()) ; case OP_DOUBLE : return NodeValue.makeDouble(nv1.getDouble() * nv2.getDouble()) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : (" + nv1 + " ," + nv2 + ")") ; } }
@Test public void testDecimal3() { NodeValue v1 = NodeValue.makeDecimal(new BigDecimal("1.3")); NodeValue v2 = NodeValue.makeNodeDecimal("1.3"); assertTrue("Not same decimal: " + v1 + " & " + v2, v1.getDecimal().compareTo(v2.getDecimal()) == 0); assertEquals("Not same decimal by equals: " + v1 + " & " + v2, v1, v2); }
public static NodeValue unaryMinus(NodeValue nv) { switch (classifyNumeric("unaryMinus", nv)) { case OP_INTEGER : return NodeValue.makeInteger(nv.getInteger().negate()) ; case OP_DECIMAL : return NodeValue.makeDecimal(nv.getDecimal().negate()) ; case OP_FLOAT : return NodeValue.makeFloat(-nv.getFloat()) ; case OP_DOUBLE : return NodeValue.makeDouble(-nv.getDouble()) ; default : throw new ARQInternalErrorException("Unrecognized numeric operation : " + nv) ; } }
@Test public void testCeiling1() { NodeValue nv = NodeValue.makeDecimal(2.6) ; NodeValue r = XSDFuncOp.ceiling(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 3, r.getDecimal().longValue()) ; }
@Test public void testFloor2() { NodeValue nv = NodeValue.makeDecimal(-3.6) ; NodeValue r = XSDFuncOp.floor(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", -4, r.getDecimal().longValue() ) ; }
@Test public void testAbs3() { NodeValue nv = NodeValue.makeDecimal(2) ; NodeValue r = XSDFuncOp.abs(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 2, r.getDecimal().doubleValue(), accuracyExact_D ) ; }
@Test public void testAbs4() { NodeValue nv = NodeValue.makeDecimal(-2) ; NodeValue r = XSDFuncOp.abs(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 2, r.getDecimal().doubleValue(), accuracyExact_D ) ; }
@Test public void testCeiling2() { NodeValue nv = NodeValue.makeDecimal(-3.6) ; NodeValue r = XSDFuncOp.ceiling(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", -3, r.getDecimal().longValue() ) ; }
@Test public void testFloor1() { NodeValue nv = NodeValue.makeDecimal(2.6) ; NodeValue r = XSDFuncOp.floor(nv) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 2, r.getDecimal().longValue()) ; }
@Test public void testDivideIntegerInteger() { NodeValue nv1 = NodeValue.makeInteger(25) ; NodeValue nv2 = NodeValue.makeInteger(2) ; NodeValue r = XSDFuncOp.numDivide(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 12.5, r.getDecimal().doubleValue(), accuracyExact_D) ; }
@Test public void testMultiplyDecimalInteger() { NodeValue nv1 = NodeValue.makeDecimal(3.5) ; NodeValue nv2 = NodeValue.makeInteger(2) ; NodeValue r = XSDFuncOp.numMultiply(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 7L, r.getDecimal().longValue()) ; }
@Test public void testAddIntegerDecimal() { NodeValue nv1 = NodeValue.makeInteger(5) ; NodeValue nv2 = NodeValue.makeDecimal(7) ; NodeValue r = XSDFuncOp.numAdd(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 12, r.getDecimal().longValue()) ; }
@Test public void testAddDecimalDecimal() { NodeValue nv1 = NodeValue.makeDecimal(4.3) ; NodeValue nv2 = NodeValue.makeDecimal(3.7) ; NodeValue r = XSDFuncOp.numAdd(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 8, r.getDecimal().doubleValue(), accuracyExact_D ) ; }
@Test public void testAddDecimalInteger() { NodeValue nv1 = NodeValue.makeDecimal(7) ; NodeValue nv2 = NodeValue.makeInteger(5) ; NodeValue r = XSDFuncOp.numAdd(nv1, nv2) ; assertTrue("Not a decimal: "+r, r.isDecimal()) ; assertTrue("Not a NodeValueDecimal: "+r, r instanceof NodeValueDecimal) ; assertEquals("Wrong result", 12, r.getDecimal().longValue()) ; }
private static void testNumeric(String string, BigDecimal decimal) { Expr expr = parse(string) ; NodeValue v = expr.eval( BindingFactory.binding() , new FunctionEnvBase()) ; assertTrue(v.isDecimal()) ; assertEquals(decimal, v.getDecimal()) ; }