/*
 * Copyright (c) 1998, 2021 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(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"), 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();
    }

    @Override
    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"));
    }

    @Override
    protected PopulationManager getManager() {
        return manager;
    }

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