/*
 * Copyright (c) 1998, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.expressions;

import java.util.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.platform.database.*;
import org.eclipse.persistence.internal.helper.*;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * This test suite is designed to cover all the API in
 * org.eclipse.persistence.expressions.Expression.
 * This is in addition to what is covered in ExpressionTestSuite.
 * Since 9.0.4
 * @author Stephen McRitchie
 */
public class ExpressionUnitTestSuite extends ExpressionTestSuite {
    protected PopulationManager manager;

    public ExpressionUnitTestSuite() {
        setDescription("This suite covers the public/advanced API of Expression.");
    }

    protected void _addAllOfTest() {
        ExpressionBuilder employee = new ExpressionBuilder();
        ExpressionBuilder phone = new ExpressionBuilder();
        Expression expression = employee.allOf("phoneNumbers", phone.get("areaCode").equal("613"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("AllOfTest");
        test.setDescription("Test allOf expression");
        addTest(test);
    }

    protected void _addAppendSQLTest() {
        Expression expression = (new ExpressionBuilder()).prefixSQL("(t0.F_NAME = 'Bob')");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("AppendSQLTest");
        test.setDescription("Test appendSQL expression");
        addTest(test);
    }

    /*protected void _addBetween$booleanTest()
    {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThan(50000).between(true,true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("BetweenBooleanTest");
        test.setDescription("Test BETWEEN (boolean) expression");
        addTest(test);
    }*/
    protected void _addBetween$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").between((byte)0, (byte)120);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 3);
        test.setExpression(expression);
        test.setName("Between$byteTest");
        test.setDescription("Test BETWEEN (byte) expression");
        addTest(test);
    }

    protected void _addBetween$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").between('M', 'N');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("Between$charTest");
        test.setDescription("Test BETWEEN (char) expression");
        addTest(test);
    }

    protected void _addBetween$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").between(3000.0, 6000.0);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("Between$doubleTest");
        test.setDescription("Test BETWEEN (double) expression");
        addTest(test);
    }

    protected void _addBetween$floatTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").between(3000.0F, 6000.0F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("Between$floatTest");
        test.setDescription("Test BETWEEN (float) expression");
        addTest(test);
    }

    protected void _addBetween$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").between(75000L, 87000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2);
        test.setExpression(expression);
        test.setName("Between$longTest");
        test.setDescription("Test BETWEEN (long) expression");
        addTest(test);
    }

    protected void _addBetween$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").between((short)5000, (short)32000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Between$shortTest");
        test.setDescription("Test BETWEEN (short) expression");
        addTest(test);
    }

    protected void _addContainsAllKeyWords$nullTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsAllKeyWords("");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("ContainsAllKeyWords$nullTest");
        test.setDescription("Test containsAllKeyWords with wildcard % expression");
        addTest(test);
    }

    protected void _addContainsAllKeyWordsTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsAllKeyWords("java write");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("ContainsAllKeyWordsTest");
        test.setDescription("Test containsAllKeyWords expression");
        addTest(test);
    }

    protected void _addContainsAnyKeyWords$nullTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsAnyKeyWords("");
        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("ContainsAnyKeyWords$nullTest");
        test.setDescription("Test containsAnyKeyWords with wildcard % expression");
        addTest(test);
    }

    protected void _addContainsAnyKeyWordsTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsAnyKeyWords("java write");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setName("ContainsAnyKeyWordsTest");
        test.setDescription("Test containsAnyKeyWords expression");
        addTest(test);
    }

    protected void _addContainsSubstringIgnoringCaseTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsSubstringIgnoringCase("tHe CoFfEe");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("ContainsSubstringIgnoringCaseTest");
        test.setDescription("Test containsSubstringIgnoringCase expression");
        addTest(test);
    }

    protected void _addContainsSubstringTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("responsibilitiesList").containsSubstring("the coffee");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("ContainsSubstringTest");
        test.setDescription("Test containsSubstring expression");
        addTest(test);
    }

    protected void _addCurrentDateTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").lessThan(builder.currentDateDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("CurrentDateTest");
        test.setDescription("Test currentDate expression");
        test.addUnsupportedPlatform(DB2Platform.class);
        test.addUnsupportedPlatform(TimesTenPlatform.class);
        test.addUnsupportedPlatform(SymfowarePlatform.class);
        addTest(test);
    }

    protected void _addDifferenceTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").difference("Bib").equal(4);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("DifferenceTest");
        test.setDescription("Test Difference expression");
        test.addSupportedPlatform(SybasePlatform.class);
        test.addSupportedPlatform(SQLAnywherePlatform.class);
        addTest(test);
    }

    /*
     * The following are equal(primitive) tests...
     */
    protected void _addEqual$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").equal(false);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("Equal$booleanTest");
        test.setDescription("Test EQUAL (boolean) expression");
        addTest(test);
    }

    protected void _addEqual$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").equal((byte)100).not();

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("Equal$byteTest");
        test.setDescription("Test Equal (byte) expression");
        addTest(test);
    }

    protected void _addEqual$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").equal('M');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("Equal$charTest");
        test.setDescription("Test EQUAL (char) expression");
        addTest(test);
    }

    protected void _addEqual$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").equal(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("Equal$doubleTest");
        test.setDescription("Test Equal (double) expression");
        addTest(test);
    }

    /**
     * This tests the equals(float) API.
     * floats are (base 2) approximations, and cannot represent all numbers,
     * so this test was changed to use 5000 to avoid float conversion issues.
     */
    protected void _addEqual$floatTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression budget = builder.get("budget");
        Expression expression = ExpressionMath.max(budget, 0).equal(5000F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("Equal$floatTest");
        test.setDescription("Test Equal (float) expression");
        test.addUnsupportedPlatform(DB2Platform.class);
        test.addUnsupportedPlatform(SybasePlatform.class);
        test.addUnsupportedPlatform(SQLAnywherePlatform.class);
        test.addUnsupportedPlatform(SQLServerPlatform.class);
        test.addUnsupportedPlatform(org.eclipse.persistence.platform.database.TimesTenPlatform.class);
        addTest(test);
    }

    protected void _addEqual$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").equal(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Equal$longTest");
        test.setDescription("Test Equal (long) expression");
        addTest(test);
    }

    protected void _addEqual$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").equal((short)31000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Equal$shortTest");
        test.setDescription("Test Equal (short) expression");
        addTest(test);
    }

    protected void _addGetFunction$int$VectorTest() {
        // The selector should be unique and the selectors for pre-defined operators are > 0.
        int applyRaiseSelector = 0 - "applyRaise".hashCode();
        Vector v = new Vector();
        v.addElement("(");
        v.addElement(" * (100 + ");
        v.addElement(") / 100)");
        ExpressionOperator applyRaiseOperator = new ExpressionOperator(applyRaiseSelector, v);
        applyRaiseOperator.bePrefix();
        ExpressionOperator.addOperator(applyRaiseOperator);

        // The following query will select all employees who will still have a salary under
        // $50,000 after a 15% raise.
        Vector arguments = new Vector();
        arguments.addElement(new Integer(15));
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").getFunction(applyRaiseSelector, arguments).lessThan(50000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("GetFunction$int$Vector$Test");
        test.setDescription("Test GetFunction(operator,arguments) expression");
        addTest(test);
    }

    /*
     * The following are greaterThan(primitive) tests...
     */
    protected void _addGetFunctionWithArgumentsTest() {
        Vector arguments = new Vector();
        arguments.addElement(new String("Smith"));
        Expression expression = (new ExpressionBuilder()).get("firstName").getFunctionWithArguments("Concat", arguments).equal("BobSmith");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.addSupportedPlatform(OraclePlatform.class);
        test.addSupportedPlatform(MySQLPlatform.class);
        test.addUnsupportedPlatform(SymfowarePlatform.class);
        test.setName("GetFunctionWithArgumentsTest");
        test.setDescription("Test GetFunctionWithArguments expression");
        addTest(test);
    }

    /*
     * The following are greaterThan(primitive) tests...
     */
    protected void _addGreaterThan$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThan(true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("GreaterThan$booleanTest");
        test.setDescription("Test GreaterThan (boolean) expression");
        addTest(test);
    }

    protected void _addGreaterThan$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThan((byte)100);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("GreaterThan$byteTest");
        test.setDescription("Test GreaterThan (byte) expression");
        addTest(test);
    }

    protected void _addGreaterThan$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").greaterThan('F');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("GreaterThan$charTest");
        test.setDescription("Test GreaterThan (char) expression");
        addTest(test);
    }

    protected void _addGreaterThan$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThan(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("GreaterThan$doubleTest");
        test.setDescription("Test GreaterThan (double) expression");
        addTest(test);
    }

    protected void _addGreaterThan$floatTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThan(4000F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("GreaterThan$floatTest");
        test.setDescription("Test GreaterThan (float) expression");
        addTest(test);
    }

    protected void _addGreaterThan$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThan(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setName("GreaterThan$longTest");
        test.setDescription("Test GreaterThan (long) expression");
        addTest(test);
    }

    protected void _addGreaterThan$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThan((short)32000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("GreaterThan$shortTest");
        test.setDescription("Test GreaterThan (short) expression");
        addTest(test);
    }

    /*
     * The following are greaterThanEqual(primitive) tests...
     */
    protected void _addGreaterThanEqual$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThanEqual(true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$booleanTest");
        test.setDescription("Test GreaterThanEqual (boolean) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThanEqual((byte)100);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$byteTest");
        test.setDescription("Test GreaterThanEqual (byte) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").greaterThanEqual('M');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$charTest");
        test.setDescription("Test GreaterThanEqual (char) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThanEqual(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$doubleTest");
        test.setDescription("Test GreaterThanEqual (double) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$floatTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").greaterThanEqual(4000.98F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$floatTest");
        test.setDescription("Test GreaterThanEqual (float) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThanEqual(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$longTest");
        test.setDescription("Test GreaterThanEqual (long) expression");
        addTest(test);
    }

    protected void _addGreaterThanEqual$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").greaterThanEqual((short)31000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$shortTest");
        test.setDescription("Test GreaterThanEqual (short) expression");
        addTest(test);
    }

    protected void _addHexToRawTest() {
        Expression expression = (new ExpressionBuilder()).get("firstName").hexToRaw().equal("Bob");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("HexToRawTest");
        test.setDescription("Test HexToRaw expression");
        addTest(test);
    }

    /*
     * The following are in(primitive[]) tests...
     */
    protected void _addIn$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").in(new boolean[] { true });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("In$booleanTest");
        test.setDescription("Test In (boolean) expression");
        addTest(test);
    }

    protected void _addIn$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").in(new byte[] { (byte)100 }).not();

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("In$byteTest");
        test.setDescription("Test In (byte) expression");
        addTest(test);
    }

    protected void _addIn$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").in(new char[] { 'A', 'N', 'M' });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("In$charTest");
        test.setDescription("Test In (char) expression");
        addTest(test);
    }

    protected void _addIn$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").in(new double[] { 4000.98 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("In$doubleTest");
        test.setDescription("Test In (double) expression");
        addTest(test);
    }

    /**
     * Test changed to choose float value that can be represented as a float without conversion issues.
     * This method also tests ExpressionMath.subtract(Expression, int)
     */
    protected void _addIn$floatTest() {
        Expression expression =
            ExpressionMath.subtract((new ExpressionBuilder()).get("budget"), 1000).in(new float[] { 4000F });

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("In$floatTest");
        test.setDescription("Test In (float) expression");
        addTest(test);
    }

    protected void _addIn$intTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").in(new int[] { 2, 5654443, 75000 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("In$intTest");
        test.setDescription("Test In (int) expression");
        addTest(test);
    }

    protected void _addIn$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").in(new long[] { 2L, 5654443L, 75000L });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("In$longTest");
        test.setDescription("Test In (long) expression");
        addTest(test);
    }

    protected void _addIn$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").in(new short[] { (short)-31000, (short)31000 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("In$shortTest");
        test.setDescription("Test In (short) expression");
        addTest(test);
    }

    protected void _addIs___ExpressionTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression exp = builder.get("salary").greaterThan(0).not();

        if (!exp.isCompoundExpression() && !exp.isDataExpression() && !exp.isLiteralExpression() && !exp.isLogicalExpression()) {
            exp = exp.not();
        }

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(exp);
        test.setName("Is___ExpressionTest");
        test.setDescription("Test is{Compound,Data,Literal,Logical}Expression");
        addTest(test);
    }

    private void _addIsEmptyTest() {
        ExpressionBuilder builder = new ExpressionBuilder();

        Expression expression = builder.isEmpty("projects");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.testBatchAttributesOnEmployee();
        test.setName("IsEmptyWithBatchAttributeTest");
        test.setDescription("Test batch reading attributes from query with isEmpty.");
        test.addUnsupportedPlatform(org.eclipse.persistence.platform.database.TimesTenPlatform.class);
        addTest(test);
    }

    protected void _addLengthTest() {
        Expression expression = (new ExpressionBuilder()).get("firstName").length().equal(3);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("LengthTest");
        test.setDescription("Test Length expression");
        addTest(test);
    }

    /*
     * The following are lessThan(primitive) tests...
     */
    protected void _addLessThan$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThan(true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("LessThan$booleanTest");
        test.setDescription("Test LessThan (boolean) expression");
        addTest(test);
    }

    protected void _addLessThan$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").lessThan((byte)100);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("LessThan$byteTest");
        test.setDescription("Test LessThan (byte) expression");
        addTest(test);
    }

    protected void _addLessThan$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").lessThan('M');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("LessThan$charTest");
        test.setDescription("Test LessThan (char) expression");
        addTest(test);
    }

    protected void _addLessThan$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").lessThan(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 3);
        test.setExpression(expression);
        test.setName("LessThan$doubleTest");
        test.setDescription("Test LessThan (double) expression");
        addTest(test);
    }

    protected void _addLessThan$floatTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").lessThan(4000.98F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 3);
        test.setExpression(expression);
        test.setName("LessThan$floatTest");
        test.setDescription("Test LessThan (float) expression");
        addTest(test);
    }

    protected void _addLessThan$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThan(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 8);
        test.setExpression(expression);
        test.setName("LessThan$longTest");
        test.setDescription("Test LessThan (long) expression");
        addTest(test);
    }

    protected void _addLessThan$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThan((short)32000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("LessThan$shortTest");
        test.setDescription("Test LessThan (short) expression");
        addTest(test);
    }

    /*
     * The following are lessThanEqual(primitive) tests...
     */
    protected void _addLessThanEqual$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThanEqual(true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("LessThanEqual$booleanTest");
        test.setDescription("Test LessThanEqual (boolean) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").lessThanEqual((byte)100);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("LessThanEqual$byteTest");
        test.setDescription("Test LessThanEqual (byte) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").lessThanEqual('F');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("LessThanEqual$charTest");
        test.setDescription("Test LessThanEqual (char) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").lessThanEqual(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("LessThanEqual$doubleTest");
        test.setDescription("Test LessThanEqual (double) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$floatTest() {
        Expression expression = ExpressionMath.add((new ExpressionBuilder()).get("budget"), 1000).lessThanEqual(6000F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("LessThanEqual$floatTest");
        test.setDescription("Test LessThanEqual (float) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThanEqual(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 9);
        test.setExpression(expression);
        test.setName("LessThanEqual$longTest");
        test.setDescription("Test LessThanEqual (long) expression");
        addTest(test);
    }

    protected void _addLessThanEqual$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").lessThanEqual((short)31000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("LessThanEqual$shortTest");
        test.setDescription("Test LessThanEqual (short) expression");
        addTest(test);
    }

    protected void _addLocate$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").locate("ob").equal(2);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Locate$StringTest");
        test.setDescription("Test locate(String) expression");
        addTest(test);
    }

    protected void _addLocate$String$intTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.anyOf("responsibilities").locate("coffee", 4).greaterThan(0);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Locate$String$intTest");
        test.setDescription("Test locate(String, int) expression");
        addTest(test);
    }

    protected void _addMonthsBetweenTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").monthsBetween(builder.currentDate()).lessThan(0);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("MonthsBetweenTest");
        test.setDescription("Test monthsBetween expression");
        test.addSupportedPlatform(OraclePlatform.class);
        addTest(test);
    }

    protected void _addNextDayTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").lessThan(builder.get("period").get("startDate").nextDay("Sunday"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("NextDayTest");
        test.setDescription("Test nextDay expression");
        test.addSupportedPlatform(OraclePlatform.class);
        addTest(test);
    }

    protected void _addNoneOfTest() {
        ExpressionBuilder employee = new ExpressionBuilder();
        ExpressionBuilder phone = new ExpressionBuilder();
        Expression expression = employee.noneOf("phoneNumbers", phone.get("areaCode").equal("613"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("NoneOfTest");
        test.setDescription("Test noneOf expression");
        addTest(test);
    }

    /*
     * The following tests notBetween.
     */
    protected void _addNotBetween$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notBetween((byte)0, (byte)120);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 2);
        test.setExpression(expression);
        test.setName("NotBetween$byteTest");
        test.setDescription("Test NotBetween (byte) expression");
        addTest(test);
    }

    protected void _addNotBetween$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").notBetween('M', 'N');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("NotBetween$charTest");
        test.setDescription("Test NotBetween (char) expression");
        addTest(test);
    }

    protected void _addNotBetween$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notBetween(3000.0, 6000.0);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 3);
        test.setExpression(expression);
        test.setName("NotBetween$doubleTest");
        test.setDescription("Test NotBetween (double) expression");
        addTest(test);
    }

    protected void _addNotBetween$ExpressionTest() {
        ExpressionBuilder emp = new ExpressionBuilder();
        Expression expression = emp.get("salary").notBetween(emp.anyOf("managedEmployees").get("salary"), emp.get("manager").get("salary"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("NotBetween$ExpressionTest");
        test.setDescription("Test NotBetween (expression) expression");
        addTest(test);
    }

    protected void _addNotBetween$floatTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notBetween(3000.0F, 6000.0F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 3);
        test.setExpression(expression);
        test.setName("NotBetween$floatTest");
        test.setDescription("Test NotBetween (float) expression");
        addTest(test);
    }

    protected void _addNotBetween$intTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notBetween(75000, 87000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 10);
        test.setExpression(expression);
        test.setName("NotBetween$intTest");
        test.setDescription("Test NotBetween (int) expression");
        addTest(test);
    }

    protected void _addNotBetween$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notBetween(75000L, 87000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 10);
        test.setExpression(expression);
        test.setName("NotBetween$longTest");
        test.setDescription("Test NotBetween (long) expression");
        addTest(test);
    }

    protected void _addNotBetween$ObjectTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").notBetween(builder.get("manager").get("salary"), new Integer(500000));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 3);
        test.setExpression(expression);
        test.setName("NotBetween$ObjectTest");
        test.setDescription("Test NotBetween (Object) expression");
        addTest(test);
    }

    protected void _addNotBetween$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notBetween((short)5000, (short)32000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("NotBetween$shortTest");
        test.setDescription("Test NotBetween (short) expression");
        addTest(test);
    }

    private void _addNotEmptyTest() {
        ExpressionBuilder builder = new ExpressionBuilder();

        Expression expression = builder.notEmpty("projects");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.testBatchAttributesOnEmployee();
        test.setName("NotEmptyWithBatchAttributeTest");
        test.setDescription("Test batch reading attributes from query with notEmpty.");
        test.addUnsupportedPlatform(org.eclipse.persistence.platform.database.TimesTenPlatform.class);
        addTest(test);
    }

    /*
     * The following are notEqual(primitive) tests...
     */
    protected void _addNotEqual$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notEqual(true);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("NotEqual$booleanTest");
        test.setDescription("Test NotEqual (boolean) expression");
        addTest(test);
    }

    protected void _addNotEqual$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notEqual((byte)100);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("NotEqual$byteTest");
        test.setDescription("Test NotEqual (byte) expression");
        addTest(test);
    }

    protected void _addNotEqual$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").notEqual('M');

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("NotEqual$charTest");
        test.setDescription("Test NotEqual (char) expression");
        addTest(test);
    }

    protected void _addNotEqual$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notEqual(4000.98);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("NotEqual$doubleTest");
        test.setDescription("Test NotEqual (double) expression");
        addTest(test);
    }

    /**
     * This method also tests ExpressionMath.divide(Expression, int).
     */
    protected void _addNotEqual$floatTest() {
        Expression expression = ExpressionMath.divide((new ExpressionBuilder()).get("budget"), 1).notEqual(5000F);

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("NotEqual$floatTest");
        test.setDescription("Test NotEqual (float) expression");
        addTest(test);
    }

    protected void _addNotEqual$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notEqual(75000L);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("NotEqual$longTest");
        test.setDescription("Test NotEqual (long) expression");
        addTest(test);
    }

    protected void _addNotEqual$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notEqual((short)31000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("NotEqual$shortTest");
        test.setDescription("Test NotEqual (short) expression");
        addTest(test);
    }

    /*
     * The following are notIn(primitive[]) tests...
     */
    protected void _addNotIn$booleanTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notIn(new boolean[] { false, true });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 12);
        test.setExpression(expression);
        test.setName("NotIn$booleanTest");
        test.setDescription("Test NotIn (boolean) expression");
        addTest(test);
    }

    protected void _addNotIn$byteTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notIn(new byte[] { (byte)100 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("NotIn$byteTest");
        test.setDescription("Test NotIn (byte) expression");
        addTest(test);
    }

    protected void _addNotIn$charTest() {
        Expression expression = (new ExpressionBuilder()).getField("GENDER").notIn(new char[] { 'A', 'N', 'M' });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("NotIn$charTest");
        test.setDescription("Test NotIn (char) expression");
        addTest(test);
    }

    protected void _addNotIn$doubleTest() {
        Expression expression = (new ExpressionBuilder()).get("budget").notIn(new double[] { 4000.98 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("NotIn$doubleTest");
        test.setDescription("Test NotIn (double) expression");
        addTest(test);
    }

    /**
     * This method also tests ExpressionMath.subtract(Expression, int)
     */
    protected void _addNotIn$floatTest() {
        Expression expression =
            ExpressionMath.subtract((new ExpressionBuilder()).get("budget"), 1000).notIn(new float[] { 4000F });

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 4);
        test.setExpression(expression);
        test.setName("NotIn$floatTest");
        test.setDescription("Test NotIn (float) expression");
        addTest(test);
    }

    protected void _addNotIn$intTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notIn(new int[] { 2, 5654443, 75000 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("In$intTest");
        test.setDescription("Test NotIn (int) expression");
        addTest(test);
    }

    protected void _addNotIn$longTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notIn(new long[] { 2L, 5654443L, 75000L });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("NotIn$longTest");
        test.setDescription("Test NotIn (long) expression");
        addTest(test);
    }

    protected void _addNotIn$shortTest() {
        Expression expression = (new ExpressionBuilder()).get("salary").notIn(new short[] { (short)-31000, (short)31000 });

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("In$shortTest");
        test.setDescription("Test In (short) expression");
        addTest(test);
    }

    protected void _addOr$DifferentBuildersTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        ExpressionBuilder builder2 = new ExpressionBuilder();
        Expression expression1 = builder.get("firstName").equal("Bob");
        Expression expression2 = builder2.get("firstName").equal("Betty");
        Expression expression = expression1.or(expression2);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2);
        test.setExpression(expression);
        test.setName("Or$DifferentBuildersTest");
        test.setDescription("Test Or(DifferentBuilders) expression");
        addTest(test);
    }

    /**
     * Tests 'appending' sql to an existing selection criteria.
     * For bug 2872161.
     */
    protected void _addPostfixSQLTest() {
        Expression expression = (new ExpressionBuilder()).get("lastName").equal("Way");
        expression = expression.postfixSQL(" AND (t0.F_NAME = 'Sarah')");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("PostfixSQLTest");
        test.setDescription("Test postfixSQL expression");
        test.addSupportedPlatform(OraclePlatform.class);
        test.addSupportedPlatform(MySQLPlatform.class);
        addTest(test);
    }

    /**
     * Tests 'appending' sql to an existing selection criteria.
     * The custom sql appears before the sql for the expression it is
     * applied to.
     * For bug 2872161.
     */
    protected void _addPrefixSQLTest() {
        Expression expression = (new ExpressionBuilder()).get("lastName").equal("Way");
        expression = expression.prefixSQL("(t0.F_NAME = 'Sarah') AND ");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("PrefixSQLTest");
        test.setDescription("Test prefixSQL expression");
        test.addSupportedPlatform(OraclePlatform.class);
        test.addSupportedPlatform(MySQLPlatform.class);
        addTest(test);
    }

    /**
     * For bug 2916893.
     */
    protected void _addRightTrim$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").rightTrim("b").equal("Bo");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("RightTrim$StringTest");
        test.setDescription("Test RightTrim(String) expression");
        test.addUnsupportedPlatform(DB2Platform.class);
        test.addUnsupportedPlatform(SybasePlatform.class);
        test.addUnsupportedPlatform(SQLAnywherePlatform.class);
        test.addUnsupportedPlatform(SQLServerPlatform.class);
        test.addUnsupportedPlatform(MySQLPlatform.class);
        test.addUnsupportedPlatform(TimesTenPlatform.class);
        addTest(test);
    }

    protected void _addRightTrimTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").equal(builder.value("Bob    ").rightTrim());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setSupportedInMemory(false);
        test.setName("RightTrimTest");
        test.setDescription("Test RightTrim expression");
        addTest(test);
    }

    protected void _addRoundDateTest() {
        Calendar calendar = new GregorianCalendar(1902, 0, 1);
        Object date = calendar.getTime();

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").roundDate("YEAR").equal(builder.value(date).roundDate("YEAR"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("RoundDateTest");
        test.setDescription("Test RoundDate expression");
        addTest(test);
    }

    private void _addSizeTest() {
        ExpressionBuilder builder = new ExpressionBuilder();

        Expression expression = builder.size("projects").greaterThan(2);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4);
        test.setExpression(expression);
        test.testBatchAttributesOnEmployee();
        test.setName("SizeWithBatchAttributeTest");
        test.setDescription("Test batch reading attributes from query with size expression.");
        test.addUnsupportedPlatform(org.eclipse.persistence.platform.database.TimesTenPlatform.class);
        addTest(test);
    }

    protected void _addStandardDeviationTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        ExpressionBuilder subBuilder = new ExpressionBuilder();
        Expression subExpression = subBuilder.get("manager").equal(builder);

        ReportQuery subQuery = new ReportQuery(Employee.class, subExpression);
        subQuery.addStandardDeviation("salary");

        Expression expression = builder.subQuery(subQuery).greaterThan(19000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.addUnsupportedPlatform(SybasePlatform.class);
        test.addUnsupportedPlatform(SQLAnywherePlatform.class);
        test.addUnsupportedPlatform(TimesTenPlatform.class);
        test.addUnsupportedPlatform(DerbyPlatform.class);
        test.addUnsupportedPlatform(SymfowarePlatform.class);
        test.setExpression(expression);
        test.setName("StandardDeviationTest");
        test.setDescription("Test StandardDeviation expression");
        addTest(test);
    }

    protected void _addToCharacterTest() {
        Expression expression = (new ExpressionBuilder()).get("firstName").toCharacter().equal("Bob");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("ToCharacterTest");
        test.setDescription("Test ToCharacter expression");
        addTest(test);
    }

    protected void _addToUpperCasedWordsTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.anyOf("responsibilitiesList").toUppercaseCasedWords().containsSubstring("The Coffee");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("ToUpperCasedWordsTest");
        test.setDescription("Test toUpperCasedWords expression");
        test.addSupportedPlatform(OraclePlatform.class);
        test.addSupportedPlatform(PostgreSQLPlatform.class);
        addTest(test);
    }

    /*
     * The following are value(primitive) tests...
     */
    protected void _addValue$booleanTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").equal(builder.value(false));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("Value$booleanTest");
        test.setDescription("Test Value (boolean) expression");
        addTest(test);
    }

    protected void _addValue$byteTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("budget").equal(builder.value((byte)100)).not();

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 5);
        test.setExpression(expression);
        test.setName("Value$byteTest");
        test.setDescription("Test Value (byte) expression");
        addTest(test);
    }

    protected void _addValue$charTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.getField("GENDER").equal(builder.value('M'));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("Value$charTest");
        test.setDescription("Test Value (char) expression");
        addTest(test);
    }

    protected void _addValue$doubleTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("budget").equal(builder.value(4000.98));

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("Value$doubleTest");
        test.setDescription("Test Value (double) expression");
        addTest(test);
    }

    /**
     * This method also tests ExpressionMath.add(Expression, int);
     */
    protected void _addValue$floatTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = ExpressionMath.add(builder.get("budget"), 0).equal(builder.value(5000F));

        ReadAllExpressionTest test = new ReadAllExpressionTest(LargeProject.class, 1);
        test.setExpression(expression);
        test.setName("Value$floatTest");
        test.setDescription("Test Value (float) expression");
        addTest(test);
    }

    protected void _addValue$longTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").equal(builder.value(75000L));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Value$longTest");
        test.setDescription("Test Value (long) expression");
        addTest(test);
    }

    protected void _addValue$shortTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").equal(builder.value((short)31000));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("Value$shortTest");
        test.setDescription("Test Value (short) expression");
        addTest(test);
    }

    protected void _addVarianceTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        ExpressionBuilder subBuilder = new ExpressionBuilder();
        Expression subExpression = subBuilder.get("manager").equal(builder);

        ReportQuery subQuery = new ReportQuery(Employee.class, subExpression);
        subQuery.addVariance("salary");

        Expression expression = builder.subQuery(subQuery).greaterThan(1000000);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2);
        test.addUnsupportedPlatform(SybasePlatform.class);
        test.addUnsupportedPlatform(SQLAnywherePlatform.class);
        test.addUnsupportedPlatform(SQLServerPlatform.class);
        test.addUnsupportedPlatform(DerbyPlatform.class);
        test.addUnsupportedPlatform(TimesTenPlatform.class);
        test.addUnsupportedPlatform(SymfowarePlatform.class);
        test.setExpression(expression);
        test.setName("VarianceTest");
        test.setDescription("Test Variance expression");
        addTest(test);
    }

    public void _testAliasForTableTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.aliasForTable(null) != null) {
            throw new TestErrorException("Expression.aliasForTable(...) should return null.");
        }
    }

    public void _testCreate$Expression$Object$ExpressionOperatorTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.create(exp, exp, null) != exp) {
            throw new TestErrorException("Expression.create(Expression, Object, ExpressionOperator) should return itself.");
        }
    }

    public void _testCreate$Expression$Vector$ExpressionOperatorTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.create(exp, new Vector(1), null) != exp) {
            throw new TestErrorException("Expression.create(Expression, Vector, ExpressionOperator) should return itself.");
        }
    }

    public void _testDoesConformTest() {
        try {
            Expression exp = (new ExpressionBuilder()).value(0);
            exp.doesConform(null, null, null, 0);
            throw new TestErrorException("Cannot conform expression exception not thrown.");
        } catch (QueryException e) {
            ;
        }
    }

    public void _testGetField$DatabaseFieldTest() {
        try {
            (new ExpressionBuilder()).value(0).getField(new DatabaseField("Foo"));
            throw new TestErrorException("Expression.getField(DatabaseField) should throw query exception.");
        } catch (QueryException e) {
            ;
        }
    }

    public void _testGetField$StringTest() {
        try {
            (new ExpressionBuilder()).value(0).getField(new String("Foo"));
            throw new TestErrorException("Expression.getField(String) should throw query exception.");
        } catch (QueryException e) {
            ;
        }
    }

    public void _testGetFieldsTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if ((exp.getFields() == null) || (exp.getFields().size() != 0)) {
            throw new TestErrorException("Expression.getFields() should return empty vector");
        }
    }

    public void _testGetNameTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.getName() != "") {
            throw new TestErrorException("Expression.getName(\"\") should return empty string.");
        }
    }

    public void _testGetOperatorTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.getOperator() != null) {
            throw new TestErrorException("Expression.getOperator() should return null.");
        }
    }

    public void _testGetTable$DatabaseTableTest() {
        try {
            (new ExpressionBuilder()).value(0).getTable(new DatabaseTable("Foo"));
            throw new TestErrorException("Expression.getTable(DatabaseTable) should throw query exception.");
        } catch (QueryException e) {
            ;
        }
    }

    public void _testGetTable$StringTest() {
        try {
            (new ExpressionBuilder()).value(0).getTable(new String("Foo"));
            throw new TestErrorException("Expression.getTable(String) should throw query exception.");
        } catch (QueryException e) {
            ;
        }
    }

    public void _testTwist$null$ExpressionTest() {
        // Uses ConstantExpression to test methods defined in abstract Expression.
        Expression exp = (new ExpressionBuilder()).value(0);
        if (exp.twist(null, exp) != null) {
            throw new TestErrorException("Expression.twist(exp, newBase) should return null if exp null.");
        }
    }

    public void _testValueFromObjectTest() {
        try {
            Expression exp = (new ExpressionBuilder()).get("salary").greaterThan(0);
            exp.valueFromObject(null, null, null, 0);
            throw new TestErrorException("Cannot conform expression exception not thrown.");
        } catch (QueryException e) {
            ;
        }
    }

    public void addBaseExpressionTests() {
        super.addTests();
    }

    public void addTests() {
        setManager(PopulationManager.getDefaultManager());
        _addAllOfTest();
        _addAppendSQLTest();
        _addBetween$byteTest();
        _addBetween$charTest();
        _addBetween$doubleTest();
        _addBetween$floatTest();
        _addBetween$longTest();
        _addBetween$shortTest();
        _addContainsAllKeyWords$nullTest();
        _addContainsAllKeyWordsTest();
        _addContainsAnyKeyWords$nullTest();
        _addContainsAnyKeyWordsTest();
        _addContainsSubstringTest();
        _addContainsSubstringIgnoringCaseTest();
        _addCurrentDateTest();
        _addDifferenceTest();
        _addEqual$booleanTest();
        _addEqual$byteTest();
        _addEqual$charTest();
        _addEqual$doubleTest();
        _addEqual$floatTest();
        _addEqual$longTest();
        _addEqual$shortTest();
        _addGetFunction$int$VectorTest();
        _addGetFunctionWithArgumentsTest();
        _addGreaterThan$booleanTest();
        _addGreaterThan$byteTest();
        _addGreaterThan$charTest();
        _addGreaterThan$doubleTest();
        _addGreaterThan$floatTest();
        _addGreaterThan$longTest();
        _addGreaterThan$shortTest();
        _addGreaterThanEqual$booleanTest();
        _addGreaterThanEqual$byteTest();
        _addGreaterThanEqual$charTest();
        _addGreaterThanEqual$doubleTest();
        _addGreaterThanEqual$floatTest();
        _addGreaterThanEqual$longTest();
        _addGreaterThanEqual$shortTest();
        // broken _addHexToRawTest();
        _addIn$booleanTest();
        _addIn$byteTest();
        _addIn$charTest();
        _addIn$doubleTest();
        _addIn$floatTest();
        _addIn$intTest();
        _addIn$longTest();
        _addIn$shortTest();
        _addIs___ExpressionTest();
        _addIsEmptyTest();
        _addLengthTest();
        _addLessThan$booleanTest();
        _addLessThan$byteTest();
        _addLessThan$charTest();
        _addLessThan$doubleTest();
        _addLessThan$floatTest();
        _addLessThan$longTest();
        _addLessThan$shortTest();
        _addLessThanEqual$booleanTest();
        _addLessThanEqual$byteTest();
        _addLessThanEqual$charTest();
        _addLessThanEqual$doubleTest();
        _addLessThanEqual$floatTest();
        _addLessThanEqual$longTest();
        _addLessThanEqual$shortTest();
        // broken _addLocate$StringTest();
        // broken _addLocate$String$intTest();
        _addMonthsBetweenTest();
        _addNextDayTest();
        _addNoneOfTest();
        _addNotBetween$byteTest();
        _addNotBetween$charTest();
        _addNotBetween$doubleTest();
        _addNotBetween$ExpressionTest();
        _addNotBetween$floatTest();
        _addNotBetween$intTest();
        _addNotBetween$longTest();
        _addNotBetween$ObjectTest();
        _addNotBetween$shortTest();
        _addNotEmptyTest();
        _addNotEqual$booleanTest();
        _addNotEqual$byteTest();
        _addNotEqual$charTest();
        _addNotEqual$doubleTest();
        _addNotEqual$floatTest();
        _addNotEqual$longTest();
        _addNotEqual$shortTest();
        _addNotIn$booleanTest();
        _addNotIn$byteTest();
        _addNotIn$charTest();
        _addNotIn$doubleTest();
        _addNotIn$floatTest();
        _addNotIn$intTest();
        _addNotIn$longTest();
        _addNotIn$shortTest();
        _addOr$DifferentBuildersTest();
        _addRightTrim$StringTest();
        _addRightTrimTest();
        // broken _addRoundDateTest();
        _addPostfixSQLTest();
        _addPrefixSQLTest();
        _addSizeTest();
        _addStandardDeviationTest();
        // broken _addToCharacterTest();
        _addToUpperCasedWordsTest();
        _addValue$booleanTest();
        _addValue$byteTest();
        _addValue$charTest();
        _addValue$doubleTest();
        _addValue$floatTest();
        _addValue$longTest();
        _addValue$shortTest();
        _addVarianceTest();

        addTest(new UnitTestCase("AliasForTableTest"));
        addTest(new UnitTestCase("Create$Expression$Object$ExpressionOperatorTest"));
        addTest(new UnitTestCase("Create$Expression$Vector$ExpressionOperatorTest"));
        addTest(new UnitTestCase("DoesConformTest"));
        addTest(new UnitTestCase("GetField$DatabaseFieldTest"));
        addTest(new UnitTestCase("GetField$StringTest"));
        addTest(new UnitTestCase("GetFieldsTest"));
        addTest(new UnitTestCase("GetNameTest"));
        addTest(new UnitTestCase("GetOperatorTest"));
        addTest(new UnitTestCase("GetTable$DatabaseTableTest"));
        addTest(new UnitTestCase("GetTable$StringTest"));
        addTest(new UnitTestCase("Twist$null$ExpressionTest"));
        // Should be declared abstract: addTest(new UnitTestCase("TwisedForBaseAndContextTest"));
        addTest(new UnitTestCase("ValueFromObjectTest"));
    }

    protected PopulationManager getManager() {
        return manager;
    }

    protected void setManager(PopulationManager theManager) {
        manager = theManager;
    }
}
