/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2014 Wisdom Framework * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.wisdom.template.thymeleaf; import ognl.NumericTypes; import ognl.OgnlException; import ognl.OgnlOps; import org.assertj.core.api.Assertions; import org.junit.Test; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; /** * Basic OGNL tests, especially the patched part. */ public class OgnlOpsTest { @Test public void testPatchedBooleanValue() { Assertions.assertThat(OgnlOps.booleanValue("true")).isTrue(); assertThat(OgnlOps.booleanValue("false")).isFalse(); assertThat(OgnlOps.booleanValue("yes")).isTrue(); assertThat(OgnlOps.booleanValue("no")).isFalse(); assertThat(OgnlOps.booleanValue("on")).isTrue(); assertThat(OgnlOps.booleanValue("off")).isFalse(); } @Test public void testNegate() { assertThat(OgnlOps.negate(-1)).isEqualTo(1); assertThat(OgnlOps.negate(-1.0)).isEqualTo(1.0); assertThat(OgnlOps.negate(new BigInteger("1"))).isEqualTo(new BigInteger("-1")); assertThat(OgnlOps.negate(new BigDecimal(1.5))).isEqualTo(new BigDecimal(-1.5)); } @Test public void testRemainder() { assertThat(OgnlOps.remainder(4, 2)).isEqualTo(0); assertThat(OgnlOps.remainder(4.0, 2)).isEqualTo(0.0); assertThat(OgnlOps.remainder(new BigInteger("4"), 2)).isEqualTo(new BigInteger("0")); assertThat(OgnlOps.remainder(new BigDecimal("4.0"), 2)).isEqualTo(new BigInteger("0")); } @Test public void testDivide() { assertThat(OgnlOps.divide(4, 2)).isEqualTo(2); assertThat(OgnlOps.divide(4.0, 2)).isEqualTo(2.0); assertThat(OgnlOps.divide(new BigInteger("4"), 2)).isEqualTo(new BigInteger("2")); assertThat(OgnlOps.divide(new BigDecimal("4.0"), 2)).isEqualTo(new BigDecimal("2.0")); } @Test public void testMultiply() { assertThat(OgnlOps.multiply(4, 2)).isEqualTo(8); assertThat(OgnlOps.multiply(4.0, 2)).isEqualTo(8.0); assertThat(OgnlOps.multiply(new BigInteger("4"), 2)).isEqualTo(new BigInteger("8")); assertThat(OgnlOps.multiply(new BigDecimal("4.0"), 2)).isEqualTo(new BigDecimal("8.0")); } @Test public void testSubtract() { assertThat(OgnlOps.subtract(4, 2)).isEqualTo(2); assertThat(OgnlOps.subtract(4.0, 2)).isEqualTo(2.0); assertThat(OgnlOps.subtract(new BigInteger("4"), 2)).isEqualTo(new BigInteger("2")); assertThat(OgnlOps.subtract(new BigDecimal("4.0"), 2)).isEqualTo(new BigDecimal("2.0")); } @Test public void testAdd() { assertThat(OgnlOps.add(4, 2)).isEqualTo(6); assertThat(OgnlOps.add(4.0, 2)).isEqualTo(6.0); assertThat(OgnlOps.add(new BigInteger("4"), 2)).isEqualTo(new BigInteger("6")); assertThat(OgnlOps.add(new BigDecimal("4.0"), 2)).isEqualTo(new BigDecimal("6.0")); // The add method can also be used on String resulting in a concatenation assertThat(OgnlOps.add("4", "2")).isEqualTo("42"); assertThat(OgnlOps.add("foo", "bar")).isEqualTo("foobar"); } @Test public void testShifts() { assertThat(OgnlOps.shiftLeft(30, 2)).isEqualTo(120); assertThat(OgnlOps.shiftLeft(new BigInteger("30"), 2)).isEqualTo(new BigInteger("120")); assertThat(OgnlOps.shiftRight(30, 2)).isEqualTo(7); assertThat(OgnlOps.shiftRight(new BigInteger("30"), 2)).isEqualTo(new BigInteger("7")); assertThat(OgnlOps.unsignedShiftRight(30, 2)).isEqualTo(7); assertThat(OgnlOps.unsignedShiftRight(30l, 2)).isEqualTo(7l); assertThat(OgnlOps.unsignedShiftRight(new BigInteger("30"), 2)).isEqualTo(new BigInteger("7")); } @Test public void testIn() throws OgnlException { assertThat(OgnlOps.in("b", Arrays.asList("a", "b", "c"))).isTrue(); assertThat(OgnlOps.in("d", Arrays.asList("a", "b", "c"))).isFalse(); assertThat(OgnlOps.in("b", new String[] {"a", "b", "c"})).isTrue(); assertThat(OgnlOps.in("d", new String[] {"a", "b", "c"})).isFalse(); assertThat(OgnlOps.in("d", null)).isFalse(); } @Test public void testLessAndGreater() throws OgnlException { assertThat(OgnlOps.less(1, 2)).isTrue(); assertThat(OgnlOps.less("1", "2")).isTrue(); assertThat(OgnlOps.less(2, 1)).isFalse(); assertThat(OgnlOps.greater(2, 1)).isTrue(); assertThat(OgnlOps.greater("2", "1")).isTrue(); } @Test public void testBinaryOperator() { assertThat(OgnlOps.binaryAnd("42", "8")).isEqualTo(new BigInteger("8")); assertThat(OgnlOps.binaryAnd(new BigInteger("42"), "8")).isEqualTo(new BigInteger("8")); assertThat(OgnlOps.binaryOr("42", "8")).isEqualTo(new BigInteger("42")); assertThat(OgnlOps.binaryOr(new BigInteger("42"), "8")).isEqualTo(new BigInteger("42")); assertThat(OgnlOps.binaryXor("42", "8")).isEqualTo(new BigInteger("34")); assertThat(OgnlOps.binaryXor(new BigInteger("42"), "8")).isEqualTo(new BigInteger("34")); } @Test public void testNewReal() { assertThat(OgnlOps.newReal(NumericTypes.FLOAT, 42.0)).isEqualTo(42f); assertThat(OgnlOps.newReal(NumericTypes.DOUBLE, 42.0)).isEqualTo(42d); } @Test public void testNewInteger() { assertThat(OgnlOps.newInteger(NumericTypes.INT, 42l)).isEqualTo(42); assertThat(OgnlOps.newInteger(NumericTypes.LONG, 42l)).isEqualTo(42l); assertThat(OgnlOps.newInteger(NumericTypes.BYTE, 8)).isEqualTo(new Byte("8")); assertThat(OgnlOps.newInteger(NumericTypes.SHORT, 42)).isEqualTo(new Short("42")); // Also works with float and double, but only if there are no decimal part assertThat(OgnlOps.newInteger(NumericTypes.FLOAT, 42)).isEqualTo(42f); assertThat(OgnlOps.newInteger(NumericTypes.DOUBLE, 42)).isEqualTo(42d); } @Test public void testConvertValue() { // Null value assertThat(OgnlOps.convertValue(null, Long.TYPE)).isEqualTo(0l); assertThat(OgnlOps.convertValue(null, String.class)).isNull(); // Primitive assertThat(OgnlOps.convertValue("42", Integer.class)).isEqualTo(42); assertThat(OgnlOps.convertValue("42", Integer.TYPE)).isEqualTo(42); assertThat(OgnlOps.convertValue("42", Byte.class)).isEqualTo(Byte.valueOf("42")); assertThat(OgnlOps.convertValue("42", Byte.TYPE)).isEqualTo(Byte.valueOf("42")); assertThat(OgnlOps.convertValue("42", Short.class)).isEqualTo(Short.valueOf("42")); assertThat(OgnlOps.convertValue("42", Short.TYPE)).isEqualTo(Short.valueOf("42")); assertThat(OgnlOps.convertValue(String.valueOf((int) 'c'), Character.class)).isEqualTo('c'); assertThat(OgnlOps.convertValue(String.valueOf((int) 'c'), Character.TYPE)).isEqualTo('c'); assertThat(OgnlOps.convertValue("42", Long.class)).isEqualTo(42l); assertThat(OgnlOps.convertValue("42", Long.TYPE)).isEqualTo(42l); assertThat(OgnlOps.convertValue("true", Boolean.class)).isEqualTo(true); assertThat(OgnlOps.convertValue("true", Boolean.TYPE)).isEqualTo(true); assertThat(OgnlOps.convertValue("42", Double.class)).isEqualTo(42.0); assertThat(OgnlOps.convertValue("42", Double.TYPE)).isEqualTo(42.0); assertThat(OgnlOps.convertValue("42", Float.class)).isEqualTo(42.0f); assertThat(OgnlOps.convertValue("42", Float.TYPE)).isEqualTo(42.0f); // BigInteger, BigDecimal and String assertThat(OgnlOps.convertValue("42", BigDecimal.class)).isEqualTo(new BigDecimal("42")); assertThat(OgnlOps.convertValue("42", BigInteger.class)).isEqualTo(new BigInteger("42")); assertThat(OgnlOps.convertValue("42", String.class)).isEqualTo("42"); //Array assertThat(OgnlOps.convertValue(new Object[] {1, 2,3}, (new int[0]).getClass())).isNotNull(); } @Test public void testBitNegate() { assertThat(OgnlOps.bitNegate("42")).isEqualTo(new BigInteger("-43")); assertThat(OgnlOps.bitNegate(new BigInteger("42"))).isEqualTo(new BigInteger("-43")); assertThat(OgnlOps.bitNegate(new BigDecimal("42"))).isEqualTo(new BigInteger("-43")); } }