/** * 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.poshi.runner.pql; import java.util.Properties; import java.util.Set; import java.util.TreeSet; import junit.framework.TestCase; import org.junit.Test; /** * @author Michael Hashimoto */ public class PQLEntityFactoryTest extends TestCase { @Test public void testPQLQueryGetPQLResultComparativeOperator() throws Exception { Properties properties = new Properties(); properties.setProperty("component.names", "Blogs,Message Boards,WEM"); properties.setProperty("portal.smoke", "true"); properties.setProperty("priority", "5"); Set<String> queries = new TreeSet<>(); queries.add("component.names !~ 'Journal'"); queries.add("component.names ~ 'Message Boards'"); queries.add("portal.smoke != false"); queries.add("portal.smoke == true"); queries.add("priority < 6"); queries.add("priority <= 5"); queries.add("priority > 4"); queries.add("priority >= 5"); queries.add("priority < 5.1"); queries.add("priority <= 5.1"); queries.add("priority > 4.1"); queries.add("priority >= 4.9"); for (String query : queries) { _validateGetPQLResult(query, Boolean.TRUE, properties); } queries = new TreeSet<>(); queries.add("component.names !~ 'Message Boards'"); queries.add("component.names ~ 'Journal'"); queries.add("portal.smoke != true"); queries.add("portal.smoke == false"); queries.add("priority < 4"); queries.add("priority <= 4"); queries.add("priority > 6"); queries.add("priority >= 6"); queries.add("priority < 4.1"); queries.add("priority <= 4.9"); queries.add("priority > 5.1"); queries.add("priority >= 5.1"); for (String query : queries) { _validateGetPQLResult(query, Boolean.FALSE, properties); } } @Test public void testPQLQueryGetPQLResultComparativeOperatorError() throws Exception { Properties properties = new Properties(); properties.setProperty("component.names", "Blogs,Message Boards,WEM"); properties.setProperty("portal.smoke", "true"); properties.setProperty("priority", "5"); _validateGetPQLResultError( "true ==", "Invalid value: true ==", properties); _validateGetPQLResultError( "false ==", "Invalid value: false ==", properties); _validateGetPQLResultError( "== true", "Invalid value: == true", properties); _validateGetPQLResultError( "== false", "Invalid value: == false", properties); } @Test public void testPQLQueryGetPQLResultConditionalOperator() throws Exception { Properties properties = new Properties(); properties.setProperty("component.names", "Blogs,Message Boards,WEM"); properties.setProperty("portal.smoke", "true"); properties.setProperty("priority", "5"); Set<String> queries = new TreeSet<>(); queries.add("portal.smoke == true AND portal.smoke != false"); queries.add("portal.smoke == true OR portal.smoke == false"); queries.add("false OR true"); queries.add("true AND true"); queries.add("true OR false"); queries.add("true OR true"); for (String query : queries) { _validateGetPQLResult(query, Boolean.TRUE, properties); } queries = new TreeSet<>(); queries.add("portal.smoke != true OR portal.smoke == false"); queries.add("portal.smoke == true AND portal.smoke == false"); queries.add("false AND false"); queries.add("false AND true"); queries.add("false OR false"); queries.add("true AND false"); for (String query : queries) { _validateGetPQLResult(query, Boolean.FALSE, properties); } } @Test public void testPQLQueryGetPQLResultConditionalOperatorError() throws Exception { Properties properties = new Properties(); properties.setProperty("component.names", "Blogs,Message Boards,WEM"); properties.setProperty("portal.smoke", "true"); properties.setProperty("priority", "5"); _validateGetPQLResultError( "AND true == true", "Invalid value: AND true == true", properties); _validateGetPQLResultError( "true == true AND", "Invalid value: true == true AND", properties); _validateGetPQLResultError( "OR true == true", "Invalid value: OR true == true", properties); _validateGetPQLResultError( "true == true OR", "Invalid value: true == true OR", properties); _validateGetPQLResultError( "true == true AND AND false == false", "Invalid value: AND false == false", properties); _validateGetPQLResultError( "(true == true) AND", "Invalid value: (true == true) AND", properties); _validateGetPQLResultError( "(true == true) OR", "Invalid value: (true == true) OR", properties); } @Test public void testPQLQueryGetPQLResultModifier() throws Exception { Properties properties = new Properties(); properties.setProperty("portal.smoke", "true"); _validateGetPQLResult( "NOT portal.smoke == true", Boolean.FALSE, properties); _validateGetPQLResult( "NOT portal.smoke == false", Boolean.TRUE, properties); } @Test public void testPQLQueryGetPQLResultModifierError() throws Exception { _validateGetPQLResultError( "portal.smoke == true NOT", "Invalid value: true NOT"); _validateGetPQLResultError( "portal.smoke == false NOT", "Invalid value: false NOT"); _validateGetPQLResultError( "portal.smoke == true NOT AND true", "Invalid value: true NOT"); _validateGetPQLResultError( "portal.smoke == false NOT AND true", "Invalid value: false NOT"); } @Test public void testPQLQueryGetPQLResultParenthesis() throws Exception { Properties properties = new Properties(); properties.setProperty("component.names", "Blogs,Message Boards,WEM"); properties.setProperty("portal.smoke", "true"); properties.setProperty("priority", "5"); Set<String> queries = new TreeSet<>(); queries.add("(portal.smoke == true AND portal.smoke == false) OR true"); queries.add("(portal.smoke == true OR portal.smoke == false) AND true"); queries.add("(true AND false) OR true"); queries.add("(true AND false) OR true"); queries.add("(true AND true) OR false"); queries.add("(true OR false) AND true"); for (String query : queries) { _validateGetPQLResult(query, Boolean.TRUE, properties); } queries = new TreeSet<>(); queries.add("(portal.smoke != true AND portal.smoke == true) OR false"); queries.add("(portal.smoke != true OR portal.smoke == false) AND true"); queries.add("(false AND true) OR false"); queries.add("(false OR false) AND false"); queries.add("(false OR false) AND true"); queries.add("(false OR true) AND false"); for (String query : queries) { _validateGetPQLResult(query, Boolean.FALSE, properties); } } @Test public void testPQLValueGetPQLResult() throws Exception { _validateGetPQLResult("false", Boolean.FALSE); _validateGetPQLResult("'false'", Boolean.FALSE); _validateGetPQLResult("\"false\"", Boolean.FALSE); _validateGetPQLResult("true", Boolean.TRUE); _validateGetPQLResult("'true'", Boolean.TRUE); _validateGetPQLResult("\"true\"", Boolean.TRUE); _validateGetPQLResult("3.2", 3.2D); _validateGetPQLResult("'3.2'", 3.2D); _validateGetPQLResult("\"3.2\"", 3.2D); _validateGetPQLResult("2016.0", 2016D); _validateGetPQLResult("'2016.0'", 2016D); _validateGetPQLResult("\"2016.0\"", 2016D); _validateGetPQLResult("2016", 2016); _validateGetPQLResult("'2016'", 2016); _validateGetPQLResult("\"2016\"", 2016); _validateGetPQLResult("test", "test"); _validateGetPQLResult("'test'", "test"); _validateGetPQLResult("\"test\"", "test"); _validateGetPQLResult("'test test'", "test test"); _validateGetPQLResult("\"test test\"", "test test"); } @Test public void testPQLValueGetPQLResultModifier() throws Exception { _validateGetPQLResult("NOT true", Boolean.FALSE); _validateGetPQLResult("NOT false", Boolean.TRUE); } @Test public void testPQLValueGetPQLResultModifierError() throws Exception { _validateGetPQLResultError( "NOT 3.2", "Modifier must be used with a boolean value: NOT"); _validateGetPQLResultError( "NOT 2016", "Modifier must be used with a boolean value: NOT"); _validateGetPQLResultError( "NOT test", "Modifier must be used with a boolean value: NOT"); _validateGetPQLResultError( "NOT 'test test'", "Modifier must be used with a boolean value: NOT"); } @Test public void testPQLVariableGetPQLResult() throws Exception { _validateGetPQLResultFromVariable("false", Boolean.FALSE); _validateGetPQLResultFromVariable("'false'", Boolean.FALSE); _validateGetPQLResultFromVariable("\"false\"", Boolean.FALSE); _validateGetPQLResultFromVariable("true", Boolean.TRUE); _validateGetPQLResultFromVariable("'true'", Boolean.TRUE); _validateGetPQLResultFromVariable("\"true\"", Boolean.TRUE); _validateGetPQLResultFromVariable("3.2", 3.2D); _validateGetPQLResultFromVariable("'3.2'", 3.2D); _validateGetPQLResultFromVariable("\"3.2\"", 3.2D); _validateGetPQLResultFromVariable("2016.0", 2016D); _validateGetPQLResultFromVariable("'2016.0'", 2016D); _validateGetPQLResultFromVariable("\"2016.0\"", 2016D); _validateGetPQLResultFromVariable("2016", 2016); _validateGetPQLResultFromVariable("'2016'", 2016); _validateGetPQLResultFromVariable("\"2016\"", 2016); _validateGetPQLResultFromVariable("test", "test"); _validateGetPQLResultFromVariable("'test'", "test"); _validateGetPQLResultFromVariable("\"test\"", "test"); _validateGetPQLResultFromVariable("'test test'", "test test"); _validateGetPQLResultFromVariable("\"test test\"", "test test"); } private static void _validateGetPQLResult( String pql, Object expectedPQLResult) throws Exception { _validateGetPQLResult(pql, expectedPQLResult, new Properties()); } private static void _validateGetPQLResult( String pql, Object expectedPQLResult, Properties properties) throws Exception { PQLEntity pqlEntity = PQLEntityFactory.newPQLEntity(pql); Object actualPQLResult = pqlEntity.getPQLResult(properties); if (!actualPQLResult.equals(expectedPQLResult)) { StringBuilder sb = new StringBuilder(); sb.append("Mismatched PQL result within the following PQL:\n"); sb.append(pql); sb.append("\n* Actual: "); sb.append(actualPQLResult); sb.append("\n* Expected: "); sb.append(expectedPQLResult); throw new Exception(sb.toString()); } } private static void _validateGetPQLResultError( String pql, String expectedError) throws Exception { _validateGetPQLResultError(pql, expectedError, new Properties()); } private static void _validateGetPQLResultError( String pql, String expectedError, Properties properties) throws Exception { String actualError = null; try { PQLEntity pqlEntity = PQLEntityFactory.newPQLEntity(pql); pqlEntity.getPQLResult(properties); } catch (Exception e) { actualError = e.getMessage(); if (!actualError.equals(expectedError)) { StringBuilder sb = new StringBuilder(); sb.append("Mismatched error within the following PQL:\n"); sb.append(pql); sb.append("\n* Actual: "); sb.append(actualError); sb.append("\n* Expected: "); sb.append(expectedError); throw new Exception(sb.toString(), e); } } finally { if (actualError == null) { throw new Exception( "No error thrown for the following PQL: " + pql); } } } private static void _validateGetPQLResultFromVariable( String pql, Object expectedPQLResult) throws Exception { Properties properties = new Properties(); properties.put("portal.smoke", pql); _validateGetPQLResult("portal.smoke", expectedPQLResult, properties); } }