@Test public void testMixedOperands_DoublesAndInts() { evaluate("3.0d + 5", 8.0d, Double.class); evaluate("3.0D - 5", -2.0d, Double.class); evaluate("3.0f * 5", 15.0f, Float.class); evaluate("6.0f / 2", 3.0f, Float.class); evaluate("6.0f / 4", 1.5f, Float.class); evaluate("5.0D % 3", 2.0d, Double.class); evaluate("5.5D % 3", 2.5, Double.class); }
@Test public void testModulus() { evaluate("3%2",1,Integer.class); evaluate("3L%2L",1L,Long.class); evaluate("3.0f%2.0f",1f,Float.class); evaluate("5.0d % 3.1d", 1.9d, Double.class); evaluate("new java.math.BigDecimal('5') % new java.math.BigDecimal('3')", new BigDecimal("2"), BigDecimal.class); evaluate("new java.math.BigDecimal('5') % 3", new BigDecimal("2"), BigDecimal.class); evaluateAndCheckError("'abc'%'def'",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); }
@Test public void testMathOperatorDivide_ConvertToDouble() { evaluateAndAskForReturnType("8/4", new Double(2.0), Double.class); }
private Operator getOperatorNode(SpelExpression expr) { SpelNode node = expr.getAST(); return findOperator(node); }
@Test public void testOperatorOverloading() { evaluateAndCheckError("'a' * '2'", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); evaluateAndCheckError("'a' ^ '2'", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); }
@Test public void testOperatorNames() throws Exception { Operator node = getOperatorNode((SpelExpression)parser.parseExpression("1==3")); assertEquals("==",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("1!=3")); assertEquals("!=",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3/3")); assertEquals("/",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3+3")); assertEquals("+",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3-3")); assertEquals("-",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3<4")); assertEquals("<",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3<=4")); assertEquals("<=",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3*4")); assertEquals("*",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3%4")); assertEquals("%",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3>=4")); assertEquals(">=",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3 between 4")); assertEquals("between",node.getOperatorName()); node = getOperatorNode((SpelExpression)parser.parseExpression("3 ^ 4")); assertEquals("^",node.getOperatorName()); }
@Test public void testMathOperatorDivide04_ConvertToFloat() { evaluateAndAskForReturnType("8/4", new Float(2.0), Float.class); }
private Operator findOperator(SpelNode node) { if (node instanceof Operator) { return (Operator) node; } int childCount = node.getChildCount(); for (int i = 0; i < childCount; i++) { Operator possible = findOperator(node.getChild(i)); if (possible != null) { return possible; } } return null; }
@Test public void testIntegerArithmetic() { evaluate("2 + 4", "6", Integer.class); evaluate("5 - 4", "1", Integer.class); evaluate("3 * 5", 15, Integer.class); evaluate("3.2d * 5", 16.0d, Double.class); evaluate("3 * 5f", 15f, Float.class); evaluate("3 / 1", 3, Integer.class); evaluate("3 % 2", 1, Integer.class); evaluate("3 mod 2", 1, Integer.class); evaluate("3 mOd 2", 1, Integer.class); evaluate("3 Mod 2", 1, Integer.class); evaluate("3 MOD 2", 1, Integer.class); }
@Test public void testDivide() { evaluate("3.0f / 5.0f", 0.6f, Float.class); evaluate("4L/2L",2L,Long.class); evaluate("3.0f div 5.0f", 0.6f, Float.class); evaluate("4L DIV 2L",2L,Long.class); evaluate("new java.math.BigDecimal('3') / 5", new BigDecimal("1"), BigDecimal.class); evaluate("new java.math.BigDecimal('3.0') / 5", new BigDecimal("0.6"), BigDecimal.class); evaluate("new java.math.BigDecimal('3.00') / 5", new BigDecimal("0.60"), BigDecimal.class); evaluate("new java.math.BigDecimal('3.00') / new java.math.BigDecimal('5.0000')", new BigDecimal("0.6000"), BigDecimal.class); evaluateAndCheckError("'abc'/'def'",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); }
@Test public void testDoubles() { evaluate("3.0d == 5.0d", false, Boolean.class); evaluate("3.0d == 3.0d", true, Boolean.class); evaluate("3.0d != 5.0d", true, Boolean.class); evaluate("3.0d != 3.0d", false, Boolean.class); evaluate("3.0d + 5.0d", 8.0d, Double.class); evaluate("3.0d - 5.0d", -2.0d, Double.class); evaluate("3.0d * 5.0d", 15.0d, Double.class); evaluate("3.0d / 5.0d", 0.6d, Double.class); evaluate("6.0d % 3.5d", 2.5d, Double.class); }
@Test public void testMinus() throws Exception { evaluate("'c' - 2", "a", String.class); evaluate("3.0f - 5.0f", -2.0f, Float.class); evaluateAndCheckError("'ab' - 2", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); evaluateAndCheckError("2-'ab'", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); SpelExpression expr = (SpelExpression)parser.parseExpression("-3"); assertEquals("-3", expr.toStringAST()); expr = (SpelExpression)parser.parseExpression("2-3"); assertEquals("(2 - 3)", expr.toStringAST()); evaluate("-5d",-5d,Double.class); evaluate("-5L",-5L,Long.class); evaluate("-5", -5, Integer.class); evaluate("-new java.math.BigDecimal('5')", new BigDecimal("-5"),BigDecimal.class); evaluateAndCheckError("-'abc'", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); }
@Test public void testLongs() { evaluate("3L == 4L", false, Boolean.class); evaluate("3L == 3L", true, Boolean.class); evaluate("3L != 4L", true, Boolean.class); evaluate("3L != 3L", false, Boolean.class); evaluate("3L * 50L", 150L, Long.class); evaluate("3L + 50L", 53L, Long.class); evaluate("3L - 50L", -47L, Long.class); }
@Test public void testPlus() throws Exception { evaluate("7 + 2", "9", Integer.class); evaluate("3.0f + 5.0f", 8.0f, Float.class); evaluate("3.0d + 5.0d", 8.0d, Double.class); evaluate("3 + new java.math.BigDecimal('5')", new BigDecimal("8"), BigDecimal.class); evaluate("'ab' + 2", "ab2", String.class); evaluate("2 + 'a'", "2a", String.class); evaluate("'ab' + null", "abnull", String.class); evaluate("null + 'ab'", "nullab", String.class); // AST: SpelExpression expr = (SpelExpression)parser.parseExpression("+3"); assertEquals("+3",expr.toStringAST()); expr = (SpelExpression)parser.parseExpression("2+3"); assertEquals("(2 + 3)",expr.toStringAST()); // use as a unary operator evaluate("+5d",5d,Double.class); evaluate("+5L",5L,Long.class); evaluate("+5",5,Integer.class); evaluate("+new java.math.BigDecimal('5')", new BigDecimal("5"),BigDecimal.class); evaluateAndCheckError("+'abc'",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES); // string concatenation evaluate("'abc'+'def'","abcdef",String.class); evaluate("5 + new Integer('37')",42,Integer.class); }
@Test public void testBigDecimals() { evaluate("3 + new java.math.BigDecimal('5')", new BigDecimal("8"), BigDecimal.class); evaluate("3 - new java.math.BigDecimal('5')", new BigDecimal("-2"), BigDecimal.class); evaluate("3 * new java.math.BigDecimal('5')", new BigDecimal("15"), BigDecimal.class); evaluate("3 / new java.math.BigDecimal('5')", new BigDecimal("1"), BigDecimal.class); evaluate("5 % new java.math.BigDecimal('3')", new BigDecimal("2"), BigDecimal.class); evaluate("new java.math.BigDecimal('5') % 3", new BigDecimal("2"), BigDecimal.class); evaluate("new java.math.BigDecimal('5') ^ 3", new BigDecimal("125"), BigDecimal.class); }
@Test public void testBigIntegers() { evaluate("3 + new java.math.BigInteger('5')", new BigInteger("8"), BigInteger.class); evaluate("3 - new java.math.BigInteger('5')", new BigInteger("-2"), BigInteger.class); evaluate("3 * new java.math.BigInteger('5')", new BigInteger("15"), BigInteger.class); evaluate("3 / new java.math.BigInteger('5')", new BigInteger("0"), BigInteger.class); evaluate("5 % new java.math.BigInteger('3')", new BigInteger("2"), BigInteger.class); evaluate("new java.math.BigInteger('5') % 3", new BigInteger("2"), BigInteger.class); evaluate("new java.math.BigInteger('5') ^ 3", new BigInteger("125"), BigInteger.class); }