/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping.expression.internal; import com.liferay.dynamic.data.mapping.expression.model.AndExpression; import com.liferay.dynamic.data.mapping.expression.model.ArithmeticExpression; import com.liferay.dynamic.data.mapping.expression.model.ComparisonExpression; import com.liferay.dynamic.data.mapping.expression.model.Expression; import com.liferay.dynamic.data.mapping.expression.model.FunctionCallExpression; import com.liferay.dynamic.data.mapping.expression.model.MinusExpression; import com.liferay.dynamic.data.mapping.expression.model.NotExpression; import com.liferay.dynamic.data.mapping.expression.model.OrExpression; import com.liferay.dynamic.data.mapping.expression.model.Parenthesis; import com.liferay.dynamic.data.mapping.expression.model.Term; import java.util.List; import org.junit.Assert; import org.junit.Test; /** * @author Leonardo Barros */ public class ExpressionModelTest { @Test public void testAndExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "true && (2 != 3)", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals(AndExpression.class, expressionModel.getClass()); AndExpression andExpression = (AndExpression)expressionModel; Expression leftOperandExpression = andExpression.getLeftOperandExpression(); Expression rightOperandExpression = andExpression.getRightOperandExpression(); Assert.assertEquals(Term.class, leftOperandExpression.getClass()); Assert.assertEquals( ComparisonExpression.class, rightOperandExpression.getClass()); Term term = (Term)leftOperandExpression; Assert.assertEquals("true", term.getValue()); ComparisonExpression comparisonExpression = (ComparisonExpression)rightOperandExpression; Expression leftOperandExpression2 = comparisonExpression.getLeftOperandExpression(); Expression rightOperandExpression2 = comparisonExpression.getRightOperandExpression(); Assert.assertEquals("!=", comparisonExpression.getOperator()); Assert.assertEquals(Term.class, leftOperandExpression2.getClass()); Assert.assertEquals(Term.class, rightOperandExpression2.getClass()); term = (Term)leftOperandExpression2; Assert.assertEquals("2", term.getValue()); term = (Term)rightOperandExpression2; Assert.assertEquals("3", term.getValue()); } @Test public void testArithmeticExpression() throws Exception { DDMExpressionImpl<Double> expression = new DDMExpressionImpl<>( "a + b * c - d", Double.class); Expression expressionModel = expression.getModel(); Assert.assertEquals( ArithmeticExpression.class, expressionModel.getClass()); ArithmeticExpression arithmeticExpression = (ArithmeticExpression)expressionModel; Expression leftOperandExpression = arithmeticExpression.getLeftOperandExpression(); Expression rightOperandExpression = arithmeticExpression.getRightOperandExpression(); Assert.assertEquals( ArithmeticExpression.class, leftOperandExpression.getClass()); Assert.assertEquals(Term.class, rightOperandExpression.getClass()); Assert.assertEquals("-", arithmeticExpression.getOperator()); Term term = (Term)rightOperandExpression; Assert.assertEquals("d", term.getValue()); ArithmeticExpression arithmeticExpression2 = (ArithmeticExpression)leftOperandExpression; Expression leftOperandExpression2 = arithmeticExpression2.getLeftOperandExpression(); Expression rightOperandExpression2 = arithmeticExpression2.getRightOperandExpression(); Assert.assertEquals(Term.class, leftOperandExpression2.getClass()); Assert.assertEquals( ArithmeticExpression.class, rightOperandExpression2.getClass()); Assert.assertEquals("+", arithmeticExpression2.getOperator()); term = (Term)leftOperandExpression2; Assert.assertEquals("a", term.getValue()); ArithmeticExpression arithmeticExpression3 = (ArithmeticExpression)rightOperandExpression2; Expression leftOperandExpression3 = arithmeticExpression3.getLeftOperandExpression(); Expression rightOperandExpression3 = arithmeticExpression3.getRightOperandExpression(); Assert.assertEquals(Term.class, leftOperandExpression3.getClass()); Assert.assertEquals(Term.class, rightOperandExpression3.getClass()); Assert.assertEquals("*", arithmeticExpression3.getOperator()); term = (Term)leftOperandExpression3; Assert.assertEquals("b", term.getValue()); term = (Term)rightOperandExpression3; Assert.assertEquals("c", term.getValue()); } @Test public void testFunctionCallExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "date()", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals( FunctionCallExpression.class, expressionModel.getClass()); FunctionCallExpression functionCallExpression = (FunctionCallExpression)expressionModel; Assert.assertEquals("date", functionCallExpression.getFunctionName()); Assert.assertEquals(0, functionCallExpression.getArity()); } @Test public void testGreaterThanExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "(2 * 5) > 3", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals( ComparisonExpression.class, expressionModel.getClass()); ComparisonExpression comparisonExpression = (ComparisonExpression)expressionModel; Expression leftOperandExpression = comparisonExpression.getLeftOperandExpression(); Expression rightOperandExpression = comparisonExpression.getRightOperandExpression(); Assert.assertEquals(">", comparisonExpression.getOperator()); Assert.assertEquals( Parenthesis.class, leftOperandExpression.getClass()); Assert.assertEquals(Term.class, rightOperandExpression.getClass()); Parenthesis parenthesis = (Parenthesis)leftOperandExpression; ArithmeticExpression arithmeticExpression = (ArithmeticExpression)parenthesis.getOperandExpression(); Expression arithmeticLeftOperandExpression = arithmeticExpression.getLeftOperandExpression(); Expression arithmeticRightOperandExpression = arithmeticExpression.getRightOperandExpression(); Assert.assertEquals("*", arithmeticExpression.getOperator()); Assert.assertEquals( Term.class, arithmeticLeftOperandExpression.getClass()); Assert.assertEquals( Term.class, arithmeticRightOperandExpression.getClass()); Term term = (Term)arithmeticLeftOperandExpression; Assert.assertEquals("2", term.getValue()); term = (Term)arithmeticRightOperandExpression; Assert.assertEquals("5", term.getValue()); term = (Term)rightOperandExpression; Assert.assertEquals("3", term.getValue()); } @Test public void testLessThanEqualExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "((1 + 4) / (5 - 2)) <= sum(Var1,Var2)", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals( ComparisonExpression.class, expressionModel.getClass()); ComparisonExpression comparisonExpression = (ComparisonExpression)expressionModel; Expression comparisonLeftOperandExpression = comparisonExpression.getLeftOperandExpression(); Expression comparisonRightOperandExpression = comparisonExpression.getRightOperandExpression(); Assert.assertEquals("<=", comparisonExpression.getOperator()); Assert.assertEquals( Parenthesis.class, comparisonLeftOperandExpression.getClass()); Assert.assertEquals( FunctionCallExpression.class, comparisonRightOperandExpression.getClass()); Parenthesis parenthesis0 = (Parenthesis)comparisonLeftOperandExpression; ArithmeticExpression arithmeticExpression = (ArithmeticExpression)parenthesis0.getOperandExpression(); Expression arithmeticLeftOperandExpression = arithmeticExpression.getLeftOperandExpression(); Expression arithmeticRightOperandExpression = arithmeticExpression.getRightOperandExpression(); Assert.assertEquals("/", arithmeticExpression.getOperator()); Assert.assertEquals( Parenthesis.class, arithmeticLeftOperandExpression.getClass()); Assert.assertEquals( Parenthesis.class, arithmeticRightOperandExpression.getClass()); Parenthesis parenthesis1 = (Parenthesis)arithmeticLeftOperandExpression; Parenthesis parenthesis2 = (Parenthesis)arithmeticRightOperandExpression; ArithmeticExpression arithmeticExpression2 = (ArithmeticExpression)parenthesis1.getOperandExpression(); Expression arithmeticLeftOperandExpression2 = arithmeticExpression2.getLeftOperandExpression(); Expression arithmeticRightOperandExpression2 = arithmeticExpression2.getRightOperandExpression(); Assert.assertEquals("+", arithmeticExpression2.getOperator()); Assert.assertEquals( Term.class, arithmeticLeftOperandExpression2.getClass()); Assert.assertEquals( Term.class, arithmeticRightOperandExpression2.getClass()); Term term = (Term)arithmeticLeftOperandExpression2; Assert.assertEquals("1", term.getValue()); term = (Term)arithmeticRightOperandExpression2; Assert.assertEquals("4", term.getValue()); ArithmeticExpression arithmeticExpression3 = (ArithmeticExpression)parenthesis2.getOperandExpression(); Expression arithmeticLeftOperandExpression3 = arithmeticExpression3.getLeftOperandExpression(); Expression arithmeticRightOperandExpression3 = arithmeticExpression3.getRightOperandExpression(); Assert.assertEquals("-", arithmeticExpression3.getOperator()); Assert.assertEquals( Term.class, arithmeticLeftOperandExpression3.getClass()); Assert.assertEquals( Term.class, arithmeticRightOperandExpression3.getClass()); term = (Term)arithmeticLeftOperandExpression3; Assert.assertEquals("5", term.getValue()); term = (Term)arithmeticRightOperandExpression3; Assert.assertEquals("2", term.getValue()); FunctionCallExpression functionCallExpression = (FunctionCallExpression)comparisonRightOperandExpression; Assert.assertEquals("sum", functionCallExpression.getFunctionName()); Assert.assertEquals(2, functionCallExpression.getArity()); List<Expression> parameterExpressions = functionCallExpression.getParameterExpressions(); Assert.assertNotNull(parameterExpressions); Assert.assertEquals( parameterExpressions.toString(), 2, parameterExpressions.size()); Expression parameterExpression = parameterExpressions.get(0); Assert.assertEquals(Term.class, parameterExpression.getClass()); term = (Term)parameterExpression; Assert.assertEquals("Var1", term.getValue()); parameterExpression = parameterExpressions.get(1); Assert.assertEquals(Term.class, parameterExpression.getClass()); term = (Term)parameterExpression; Assert.assertEquals("Var2", term.getValue()); } @Test public void testNotExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "not false", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals(NotExpression.class, expressionModel.getClass()); NotExpression notExpression = (NotExpression)expressionModel; Expression operandExpression = notExpression.getOperandExpression(); Assert.assertEquals(Term.class, operandExpression.getClass()); Term term = (Term)operandExpression; Assert.assertEquals("false", term.getValue()); } @Test public void testOrExpression() throws Exception { DDMExpressionImpl<Boolean> expression = new DDMExpressionImpl<>( "(-3 < Var1) || (not equals(Var2,sum(Var3,Var4)))", Boolean.class); Expression expressionModel = expression.getModel(); Assert.assertEquals(OrExpression.class, expressionModel.getClass()); OrExpression orExpression = (OrExpression)expressionModel; Expression leftOperandExpression = orExpression.getLeftOperandExpression(); Expression rightOperandExpression = orExpression.getRightOperandExpression(); Assert.assertEquals( ComparisonExpression.class, leftOperandExpression.getClass()); Assert.assertEquals( NotExpression.class, rightOperandExpression.getClass()); ComparisonExpression comparisonExpression = (ComparisonExpression)leftOperandExpression; Expression leftOperandExpression2 = comparisonExpression.getLeftOperandExpression(); Expression rightOperandExpression2 = comparisonExpression.getRightOperandExpression(); Assert.assertEquals("<", comparisonExpression.getOperator()); Assert.assertEquals( MinusExpression.class, leftOperandExpression2.getClass()); Assert.assertEquals(Term.class, rightOperandExpression2.getClass()); MinusExpression minusExpression = (MinusExpression)leftOperandExpression2; Expression minusOperandExpression = minusExpression.getOperandExpression(); Assert.assertEquals(Term.class, minusOperandExpression.getClass()); Term term = (Term)minusOperandExpression; Assert.assertEquals("3", term.getValue()); term = (Term)rightOperandExpression2; Assert.assertEquals("Var1", term.getValue()); NotExpression notExpression = (NotExpression)rightOperandExpression; Expression notOperandExpression = notExpression.getOperandExpression(); Assert.assertEquals( FunctionCallExpression.class, notOperandExpression.getClass()); FunctionCallExpression functionCallExpression = (FunctionCallExpression)notOperandExpression; Assert.assertEquals("equals", functionCallExpression.getFunctionName()); Assert.assertEquals(2, functionCallExpression.getArity()); List<Expression> parameterExpressions = functionCallExpression.getParameterExpressions(); Assert.assertEquals( parameterExpressions.toString(), 2, parameterExpressions.size()); Expression parameterExpression1 = parameterExpressions.get(0); Assert.assertEquals(Term.class, parameterExpression1.getClass()); term = (Term)parameterExpression1; Assert.assertEquals("Var2", term.getValue()); Expression parameterExpression2 = parameterExpressions.get(1); Assert.assertEquals( FunctionCallExpression.class, parameterExpression2.getClass()); FunctionCallExpression functionCallExpression2 = (FunctionCallExpression)parameterExpression2; Assert.assertEquals("sum", functionCallExpression2.getFunctionName()); Assert.assertEquals(2, functionCallExpression2.getArity()); List<Expression> parameterExpressions2 = functionCallExpression2.getParameterExpressions(); Assert.assertEquals( parameterExpressions2.toString(), 2, parameterExpressions2.size()); Expression parameterExpression3 = parameterExpressions2.get(0); Assert.assertEquals(Term.class, parameterExpression3.getClass()); term = (Term)parameterExpression3; Assert.assertEquals("Var3", term.getValue()); Expression parameterExpression4 = parameterExpressions2.get(1); Assert.assertEquals(Term.class, parameterExpression4.getClass()); term = (Term)parameterExpression4; Assert.assertEquals("Var4", term.getValue()); } }