/**
* 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.HashSet;
import java.util.Properties;
import java.util.Set;
import junit.framework.TestCase;
import org.junit.Test;
/**
* @author Michael Hashimoto
*/
public class PQLOperatorTest extends TestCase {
@Test
public void testGetOperator() throws Exception {
Set<String> availableOperators = PQLOperator.getAvailableOperators();
for (String operator : availableOperators) {
PQLOperator pqlOperator = PQLOperatorFactory.newPQLOperator(
operator);
_compareString(pqlOperator.getOperator(), operator);
}
}
@Test
public void testGetPQLResultConditionalOperatorAND() throws Exception {
_validateGetPQLResult("true", "AND", "true", Boolean.TRUE);
_validateGetPQLResult("true", "AND", "false", Boolean.FALSE);
_validateGetPQLResult("false", "AND", "false", Boolean.FALSE);
}
@Test
public void testGetPQLResultConditionalOperatorErrors() throws Exception {
Set<String> conditionalOperators = new HashSet<>();
conditionalOperators.add("AND");
conditionalOperators.add("OR");
for (String operator : conditionalOperators) {
String expectedError =
"Operators must be surrounded by 2 boolean values: " + operator;
_validateGetPQLResultError(null, operator, null, expectedError);
_validateGetPQLResultError("test", operator, "test", expectedError);
_validateGetPQLResultError("123", operator, "123", expectedError);
_validateGetPQLResultError("12.3", operator, "12.3", expectedError);
_validateGetPQLResultError("true", operator, null, expectedError);
_validateGetPQLResultError("true", operator, "test", expectedError);
_validateGetPQLResultError("true", operator, "123", expectedError);
_validateGetPQLResultError("true", operator, "12.3", expectedError);
_validateGetPQLResultError(null, operator, "false", expectedError);
_validateGetPQLResultError(
"test", operator, "false", expectedError);
_validateGetPQLResultError("123", operator, "false", expectedError);
_validateGetPQLResultError(
"12.3", operator, "false", expectedError);
}
}
@Test
public void testGetPQLResultConditionalOperatorOR() throws Exception {
_validateGetPQLResult("true", "OR", "true", Boolean.TRUE);
_validateGetPQLResult("true", "OR", "false", Boolean.TRUE);
_validateGetPQLResult("false", "OR", "false", Boolean.FALSE);
}
@Test
public void testGetPQLResultEqualityOperatorEquals() throws Exception {
_validateGetPQLResult("test", "==", "test", Boolean.TRUE);
_validateGetPQLResult(null, "==", "test", Boolean.FALSE);
_validateGetPQLResult("test", "==", null, Boolean.FALSE);
_validateGetPQLResult(null, "==", null, Boolean.TRUE);
_validateGetPQLResult("test1", "==", "test2", Boolean.FALSE);
}
@Test
public void testGetPQLResultEqualityOperatorNotEquals() throws Exception {
_validateGetPQLResult("test", "!=", "test", Boolean.FALSE);
_validateGetPQLResult(null, "!=", "test", Boolean.TRUE);
_validateGetPQLResult("test", "!=", null, Boolean.TRUE);
_validateGetPQLResult(null, "!=", null, Boolean.FALSE);
_validateGetPQLResult("test1", "!=", "test2", Boolean.TRUE);
}
@Test
public void testGetPQLResultRelationalOperatorErrors() throws Exception {
Set<String> conditionalOperators = new HashSet<>();
conditionalOperators.add("<");
conditionalOperators.add("<=");
conditionalOperators.add(">");
conditionalOperators.add(">=");
for (String operator : conditionalOperators) {
String expectedError =
"Operator only works for number values: " + operator;
_validateGetPQLResultError("123", operator, null, expectedError);
_validateGetPQLResultError("12.3", operator, null, expectedError);
_validateGetPQLResultError(null, operator, null, expectedError);
_validateGetPQLResultError(null, operator, "123", expectedError);
_validateGetPQLResultError(null, operator, "12.3", expectedError);
_validateGetPQLResultError("123", operator, "true", expectedError);
_validateGetPQLResultError("12.3", operator, "true", expectedError);
_validateGetPQLResultError(
"false", operator, "true", expectedError);
_validateGetPQLResultError("false", operator, "123", expectedError);
_validateGetPQLResultError(
"false", operator, "12.3", expectedError);
_validateGetPQLResultError("123", operator, "test", expectedError);
_validateGetPQLResultError("12.3", operator, "test", expectedError);
_validateGetPQLResultError("test", operator, "test", expectedError);
_validateGetPQLResultError("test", operator, "123", expectedError);
_validateGetPQLResultError("test", operator, "12.3", expectedError);
}
}
@Test
public void testGetPQLResultRelationalOperatorGreaterThan()
throws Exception {
_validateGetPQLResult("2", ">", "1", Boolean.TRUE);
_validateGetPQLResult("2.1", ">", "1", Boolean.TRUE);
_validateGetPQLResult("2", ">", "1.1", Boolean.TRUE);
_validateGetPQLResult("2.1", ">", "1.1", Boolean.TRUE);
_validateGetPQLResult("2", ">", "2", Boolean.FALSE);
_validateGetPQLResult("2.1", ">", "2.1", Boolean.FALSE);
_validateGetPQLResult("1", ">", "2", Boolean.FALSE);
_validateGetPQLResult("1.1", ">", "2", Boolean.FALSE);
_validateGetPQLResult("1", ">", "2.1", Boolean.FALSE);
_validateGetPQLResult("1.1", ">", "2.1", Boolean.FALSE);
}
@Test
public void testGetPQLResultRelationalOperatorGreaterThanEquals()
throws Exception {
_validateGetPQLResult("2", ">=", "1", Boolean.TRUE);
_validateGetPQLResult("2.1", ">=", "1", Boolean.TRUE);
_validateGetPQLResult("2", ">=", "1.1", Boolean.TRUE);
_validateGetPQLResult("2.1", ">=", "1.1", Boolean.TRUE);
_validateGetPQLResult("2", ">=", "2", Boolean.TRUE);
_validateGetPQLResult("2.1", ">=", "2.1", Boolean.TRUE);
_validateGetPQLResult("1", ">=", "2", Boolean.FALSE);
_validateGetPQLResult("1.1", ">=", "2", Boolean.FALSE);
_validateGetPQLResult("1", ">=", "2.1", Boolean.FALSE);
_validateGetPQLResult("1.1", ">=", "2.1", Boolean.FALSE);
}
@Test
public void testGetPQLResultRelationalOperatorLessThan() throws Exception {
_validateGetPQLResult("2", "<", "1", Boolean.FALSE);
_validateGetPQLResult("2.1", "<", "1", Boolean.FALSE);
_validateGetPQLResult("2", "<", "1.1", Boolean.FALSE);
_validateGetPQLResult("2.1", "<", "1.1", Boolean.FALSE);
_validateGetPQLResult("2", "<", "2", Boolean.FALSE);
_validateGetPQLResult("2.1", "<", "2.1", Boolean.FALSE);
_validateGetPQLResult("1", "<", "2", Boolean.TRUE);
_validateGetPQLResult("1.1", "<", "2", Boolean.TRUE);
_validateGetPQLResult("1", "<", "2.1", Boolean.TRUE);
_validateGetPQLResult("1.1", "<", "2.1", Boolean.TRUE);
}
@Test
public void testGetPQLResultRelationalOperatorLessThanEquals()
throws Exception {
_validateGetPQLResult("2", "<=", "1", Boolean.FALSE);
_validateGetPQLResult("2.1", "<=", "1", Boolean.FALSE);
_validateGetPQLResult("2", "<=", "1.1", Boolean.FALSE);
_validateGetPQLResult("2.1", "<=", "1.1", Boolean.FALSE);
_validateGetPQLResult("2", "<=", "2", Boolean.TRUE);
_validateGetPQLResult("2.1", "<=", "2.1", Boolean.TRUE);
_validateGetPQLResult("1", "<=", "2", Boolean.TRUE);
_validateGetPQLResult("1.1", "<=", "2", Boolean.TRUE);
_validateGetPQLResult("1", "<=", "2.1", Boolean.TRUE);
_validateGetPQLResult("1.1", "<=", "1.1", Boolean.TRUE);
}
@Test
public void testGetPQLResultStringOperatorContains() throws Exception {
_validateGetPQLResult("test", "~", "test", Boolean.TRUE);
_validateGetPQLResult("test1", "~", "test", Boolean.TRUE);
_validateGetPQLResult(null, "~", "test", Boolean.FALSE);
_validateGetPQLResult("test", "~", null, Boolean.FALSE);
_validateGetPQLResult(null, "~", null, Boolean.FALSE);
_validateGetPQLResult("test1", "~", "test2", Boolean.FALSE);
}
@Test
public void testGetPQLResultStringOperatorErrors() throws Exception {
Set<String> conditionalOperators = new HashSet<>();
conditionalOperators.add("!~");
conditionalOperators.add("~");
for (String operator : conditionalOperators) {
String expectedError =
"Operator only works for string values: " + operator;
_validateGetPQLResultError("test", operator, "true", expectedError);
_validateGetPQLResultError("true", operator, "true", expectedError);
_validateGetPQLResultError(
"false", operator, "test", expectedError);
_validateGetPQLResultError("test", operator, "12.3", expectedError);
_validateGetPQLResultError("12.3", operator, "12.3", expectedError);
_validateGetPQLResultError("12.3", operator, "test", expectedError);
_validateGetPQLResultError("test", operator, "123", expectedError);
_validateGetPQLResultError("123", operator, "123", expectedError);
_validateGetPQLResultError("123", operator, "test", expectedError);
}
}
@Test
public void testGetPQLResultStringOperatorNotContains() throws Exception {
_validateGetPQLResult("test", "!~", "test", Boolean.FALSE);
_validateGetPQLResult("test1", "!~", "test", Boolean.FALSE);
_validateGetPQLResult(null, "!~", "test", Boolean.FALSE);
_validateGetPQLResult("test", "!~", null, Boolean.FALSE);
_validateGetPQLResult(null, "!~", null, Boolean.FALSE);
_validateGetPQLResult("test1", "!~", "test2", Boolean.TRUE);
}
@Test
public void testOperatorValidate() throws Exception {
Set<String> availableOperators = PQLOperator.getAvailableOperators();
for (String operator : availableOperators) {
PQLOperator.validateOperator(operator);
}
}
@Test
public void testOperatorValidateError() throws Exception {
Set<String> operators = new HashSet<>();
operators.add(null);
operators.add("bad");
operators.add("bad value");
for (String operator : operators) {
_validatePQLOperatorError(
operator, "Invalid operator: " + operator);
}
}
private void _compareString(String actualString, String expectedString)
throws Exception {
if (!actualString.equals(expectedString)) {
StringBuilder sb = new StringBuilder();
sb.append("Mismatched string values:");
sb.append("\n* Actual: ");
sb.append(actualString);
sb.append("\n* Expected: ");
sb.append(expectedString);
throw new Exception(sb.toString());
}
}
private void _validateGetPQLResult(
String value1, String operator, String value2,
Object expectedPQLResult)
throws Exception {
String pql = value1 + " " + operator + " " + value2;
PQLEntity pqlEntity1 = PQLEntityFactory.newPQLEntity(value1);
PQLOperator pqlOperator = PQLOperatorFactory.newPQLOperator(operator);
PQLEntity pqlEntity2 = PQLEntityFactory.newPQLEntity(value2);
Object actualPQLResult = pqlOperator.getPQLResult(
pqlEntity1, pqlEntity2, new 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 void _validateGetPQLResultError(
String value1, String operator, String value2, String expectedError)
throws Exception {
String pql = value1 + " " + operator + " " + value2;
PQLEntity pqlEntity1 = PQLEntityFactory.newPQLEntity(value1);
PQLOperator pqlOperator = PQLOperatorFactory.newPQLOperator(operator);
PQLEntity pqlEntity2 = PQLEntityFactory.newPQLEntity(value2);
String actualError = null;
try {
pqlOperator.getPQLResult(pqlEntity1, pqlEntity2, new 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(value2);
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 void _validatePQLOperatorError(
String operator, String expectedError)
throws Exception {
String actualError = null;
try {
PQLOperator.validateOperator(operator);
}
catch (Exception e) {
actualError = e.getMessage();
if (!actualError.equals(expectedError)) {
StringBuilder sb = new StringBuilder();
sb.append("Mismatched error for PQL operator validation:");
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 PQL operator validation: " + operator);
}
}
}
}