@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 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 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 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 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); }
@Test public void testMixedOperandsBigDecimal() { evaluate("3 * new java.math.BigDecimal('5')", new BigDecimal("15"), BigDecimal.class); evaluate("3L * new java.math.BigDecimal('5')", new BigDecimal("15"), BigDecimal.class); evaluate("3.0d * new java.math.BigDecimal('5')", new BigDecimal("15.0"), BigDecimal.class); evaluate("3 + new java.math.BigDecimal('5')", new BigDecimal("8"), BigDecimal.class); evaluate("3L + new java.math.BigDecimal('5')", new BigDecimal("8"), BigDecimal.class); evaluate("3.0d + new java.math.BigDecimal('5')", new BigDecimal("8.0"), BigDecimal.class); evaluate("3 - new java.math.BigDecimal('5')", new BigDecimal("-2"), BigDecimal.class); evaluate("3L - new java.math.BigDecimal('5')", new BigDecimal("-2"), BigDecimal.class); evaluate("3.0d - new java.math.BigDecimal('5')", new BigDecimal("-2.0"), BigDecimal.class); evaluate("3 / new java.math.BigDecimal('5')", new BigDecimal("1"), BigDecimal.class); evaluate("3 / new java.math.BigDecimal('5.0')", new BigDecimal("0.6"), BigDecimal.class); evaluate("3 / new java.math.BigDecimal('5.00')", new BigDecimal("0.60"), BigDecimal.class); evaluate("3L / new java.math.BigDecimal('5.0')", new BigDecimal("0.6"), BigDecimal.class); evaluate("3.0d / new java.math.BigDecimal('5.0')", new BigDecimal("0.6"), BigDecimal.class); evaluate("5 % new java.math.BigDecimal('3')", new BigDecimal("2"), BigDecimal.class); evaluate("3 % new java.math.BigDecimal('5')", new BigDecimal("3"), BigDecimal.class); evaluate("3L % new java.math.BigDecimal('5')", new BigDecimal("3"), BigDecimal.class); evaluate("3.0d % new java.math.BigDecimal('5')", new BigDecimal("3.0"), BigDecimal.class); }
@Test public void testRealLiteral() { evaluate("3.5", 3.5d, Double.class); }
@Test public void testMultiplyStringInt() { evaluate("'a' * 5", "aaaaa", String.class); }
@Test public void testIntegerLiteral() { evaluate("3", 3, Integer.class); }
@Test public void testMultiplyDoubleDoubleGivesDouble() { evaluate("3.0d * 5.0d", 15.0d, Double.class); }
@Test public void testMathOperatorAdd02() { evaluate("'hello' + ' ' + 'world'", "hello world", String.class); }