/*
 * 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.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * <b>Purpose:</b> Tests Complex queries executed In-Memory.
 * <p>
 * <b>Responsibilities:</b> Execute the ExpressionTestSuite In-Memory.  Only
 * expressions that run on all platforms are supported In-Memory.
 * <p>
 * TopLink has the limited ability to execute some queries in memory, and
 * to decide if a particular domain object conforms to the selection criteria.
 *
 * @author Stephen McRitchie
 * @since 9.0.4
 */
public class ExpressionInMemoryTestSuite extends ExpressionUnitTestSuite {
    public ExpressionInMemoryTestSuite() {
        setDescription("This suite tests expressions executed in memory.");
    }

    private void _addAdvancedInMemoryExpressionMathTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").greaterThanEqual(1000);

        //expression = expression.and((ExpressionMath.ln(builder.get("salary"))).lessThan(10));
        //expression = expression.and((ExpressionMath.mod(builder.get("salary"), Integer.valueOf(107)).lessThan(10)));
        expression = expression.and((ExpressionMath.floor(builder.get("salary"))).lessThan(45000));
        expression = expression.and((ExpressionMath.ceil(builder.get("salary"))).lessThan(10000));
        expression = expression.and(ExpressionMath.round(builder.get("salary"), 2).equal(40000));
        expression = expression.and(ExpressionMath.min(builder.get("salary"), Integer.valueOf(30000)).greaterThan(30000));
        expression = expression.and(ExpressionMath.max(builder.get("salary"), Integer.valueOf(30000)).lessThan(50000));
        //expression = expression.and((ExpressionMath.sinh(ExpressionMath.divide(builder.get("salary"),Integer.valueOf(10000000))).lessThanEqual(100)));
        //expression = expression.and((ExpressionMath.cosh(ExpressionMath.divide(builder.get("salary"),Integer.valueOf(10000000))).lessThanEqual(100)));
        //expression = expression.and((ExpressionMath.tanh(ExpressionMath.divide(builder.get("salary"),Integer.valueOf(10000000))).lessThanEqual(1)));
        expression = expression.and((ExpressionMath.acos(ExpressionMath.power(builder.get("salary"), 0)).lessThanEqual(100)));
        expression = expression.and((ExpressionMath.asin(ExpressionMath.power(builder.get("salary"), 0)).lessThanEqual(100)));
        expression = expression.and((ExpressionMath.atan(ExpressionMath.power(builder.get("salary"), 0)).lessThanEqual(100)));
        //expression = expression.and((ExpressionMath.atan2(ExpressionMath.power(builder.get("salary"), 0), 2).lessThanEqual(100)));
        expression = expression.and(ExpressionMath.power(builder.get("salary"), 1).equal(40000));
        //expression = expression.and((ExpressionMath.trunc(builder.get("salary"), 2).equal(50000)));
        //expression = expression.and((ExpressionMath.chr(builder.get("salary"))).equal('b'));
        expression = expression.and(ExpressionMath.round(builder.get("salary"), 2).equal(40000));
        //expression = expression.and((ExpressionMath.sign(builder.get("salary"))).greaterThan(0));
        expression = expression.and((ExpressionMath.exp(ExpressionMath.min(builder.get("salary"), 5))).lessThan(1000000));
        // Test sqrt.
        expression = expression.and(ExpressionMath.power(builder.get("salary"), Double.valueOf(0.5)).greaterThan(0));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("AdvancedInMemoryExpressionMathTest");
        test.setDescription("Test advanced expression math package In-Memory");
        addTest(test);
    }

    protected void _addBetween$DateTest() {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(1900, 1, 1);
        java.sql.Date start = new java.sql.Date(calendar.getTime().getTime());
        calendar.set(1902, 1, 1);
        java.sql.Date end = new java.sql.Date(calendar.getTime().getTime());
        Expression expression = (new ExpressionBuilder()).get("period").get("startDate").between(start, end);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("Between$DateTest");
        test.setDescription("Test BETWEEN (Date) expression InMemory.");
        addTest(test);
    }

    protected void _addBetween$StringTest() {
        Expression expression = (new ExpressionBuilder()).get("firstName").between("Babi", "Buzz");

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

    /*
     * The following are testing doesRelationConform (Equal) in memory.
     */
    protected void _addEqual$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("manager").equal(builder.value(null));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4);
        test.setExpression(expression);
        test.setName("Equal$nullTest");
        test.setDescription("Test Equal(null) expression inMemory");
        addTest(test);
    }

    protected void _addEqual$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").equal(employee.getPeriod().getStartDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("Equal$DateTest");
        test.setDescription("Test Equal(Date) expression inMemory");
        addTest(test);
    }

    protected void _addEqual$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").equal("Bob");

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

    /*
     * The following are testing doesRelationConform (greaterThan) in memory.
     */
    protected void _addGreaterThan$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").greaterThan(builder.value(null));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("GreaterThan$nullTest");
        test.setDescription("Test GreaterThan(null) expression inMemory");
        addTest(test);
    }

    protected void _addGreaterThan$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").greaterThan(employee.getPeriod().getStartDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 5);
        test.setExpression(expression);
        test.setName("GreaterThan$DateTest");
        test.setDescription("Test GreaterThan(Date) expression inMemory");
        addTest(test);
    }

    protected void _addGreaterThan$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").greaterThan("Bob");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 10);
        test.setExpression(expression);
        test.setName("GreaterThan$StringTest");
        test.setDescription("Test GreaterThan(String) expression inMemory");
        addTest(test);
    }

    /*
     * The following are testing doesRelationConform (greaterThanEqual) in memory.
     */
    protected void _addGreaterThanEqual$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").greaterThanEqual(builder.value(null));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 0);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$nullTest");
        test.setDescription("Test GreaterThanEqual(null) expression inMemory");
        addTest(test);
    }

    protected void _addGreaterThanEqual$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").greaterThanEqual(employee.getPeriod().getStartDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$DateTest");
        test.setDescription("Test GreaterThanEqual(Date) expression inMemory");
        addTest(test);
    }

    protected void _addGreaterThanEqual$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").greaterThanEqual("Bob");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 11);
        test.setExpression(expression);
        test.setName("GreaterThanEqual$StringTest");
        test.setDescription("Test GreaterThanEqual(String) expression inMemory");
        addTest(test);
    }

    /*
     * The following are testing doesRelationConform (lessThan) in memory.
     */
    protected void _addLessThan$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").lessThan(builder.value(null));

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

    /*
     * The following are testing doesRelationConform (Equal) in memory.
     */
    protected void _addIsNullAccrossAnyOfTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.anyOf("projects").get("teamLeader").equal(null);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 4);
        test.setExpression(expression);
        test.setName("IsNullAccrossAnyOfTest");
        test.setDescription("Test anyOf().get().isNull expression inMemory");
        addTest(test);
    }

    /*
     * The following are testing doesRelationConform (Equal) in memory.
     */
    protected void _addIsNullAccrossAnyOfWorkaroundTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.anyOf("projects").get("teamLeader").equal(builder.value(null));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("IsNullAccrossAnyOfWorkaroundTest");
        test.setDescription("Test anyOf().get().isNull expression inMemory");
        addTest(test);
    }

    /*
     * The following are testing doesRelationConform (Equal) in memory.
     */
    protected void _addIsNullAccrossAnyOfWorkaround2Test() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.anyOf("projects").get("teamLeader").equal(builder.getParameter("TL"));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        ReadAllQuery query = test.getQuery(true);
        query.addArgument("TL");
        test.getArguments().add(null);
        test.setName("IsNullAccrossAnyOfWorkaround2Test");
        test.setDescription("Test anyOf().get().isNull expression inMemory");
        addTest(test);
    }

    protected void _addLessThan$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").lessThan(employee.getPeriod().getStartDate());

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

    protected void _addLessThan$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").lessThan("Bob");

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

    /*
     * The following are testing doesRelationConform (lessThanEqual) in memory.
     */
    protected void _addLessThanEqual$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("salary").lessThanEqual(builder.value(null));

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

    protected void _addLessThanEqual$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").lessThanEqual(employee.getPeriod().getStartDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 7);
        test.setExpression(expression);
        test.setName("LessThanEqual$DateTest");
        test.setDescription("Test LessThanEqual(Date) expression inMemory");
        addTest(test);
    }

    protected void _addLessThanEqual$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").lessThanEqual("Bob");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 2);
        test.setExpression(expression);
        test.setName("LessThanEqual$StringTest");
        test.setDescription("Test LessThanEqual(String) expression inMemory");
        addTest(test);
    }

    /*
     * The following are testing doesRelationConform (NotEqual) in memory.
     */
    protected void _addNotEqual$nullTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("manager").notEqual(builder.value(null));

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 8);
        test.setExpression(expression);
        test.setName("NotEqual$nullTest");
        test.setDescription("Test NotEqual(null) expression inMemory");
        addTest(test);
    }

    protected void _addNotEqual$DateTest() {
        Employee employee = (Employee)getManager().getObject(new org.eclipse.persistence.testing.models.employee.domain.Employee().getClass(), "0003");

        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("period").get("startDate").notEqual(employee.getPeriod().getStartDate());

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 6);
        test.setExpression(expression);
        test.setName("NotEqual$DateTest");
        test.setDescription("Test NotEqual(Date) expression inMemory");
        addTest(test);
    }

    protected void _addNotEqual$StringTest() {
        ExpressionBuilder builder = new ExpressionBuilder();
        Expression expression = builder.get("firstName").notEqual("Bob");

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

    protected void _addToNumberTest() {
        Expression expression = (new ExpressionBuilder()).anyOf("phoneNumbers").get("areaCode").toNumber().equal(613);

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 10);
        test.setExpression(expression);
        test.setName("ToNumberTest");
        test.setDescription("Test ToNumber expression InMemory");
        addTest(test);
    }

    protected void _addLikeDoubleWildcardTest(){
        Expression expression = (new ExpressionBuilder()).get("firstName").like("B__");

        ReadAllExpressionTest test = new ReadAllExpressionTest(Employee.class, 1);
        test.setExpression(expression);
        test.setName("LikeDoubleWildCardTest");
        test.setDescription("Test like expression with two consecutive wildcards");
        addTest(test);
    }

    @Override
    public void addTests() {
        // By adding tests from the parent, In-Memory expression support
        // can be kept current with future changes.
        addBaseExpressionTests();
        super.addTests();

        _addAdvancedInMemoryExpressionMathTest();
        _addBetween$DateTest();
        _addBetween$StringTest();
        _addEqual$nullTest();
        _addEqual$DateTest();
        _addEqual$longTest();
        _addEqual$StringTest();
        _addGreaterThan$nullTest();
        _addGreaterThan$DateTest();
        _addGreaterThan$longTest();
        _addGreaterThan$StringTest();
        _addGreaterThanEqual$nullTest();
        _addGreaterThanEqual$DateTest();
        _addGreaterThanEqual$longTest();
        _addGreaterThanEqual$StringTest();
        _addIsNullAccrossAnyOfTest();
        _addIsNullAccrossAnyOfWorkaroundTest();
        _addIsNullAccrossAnyOfWorkaround2Test();
        _addLengthTest();
        _addLessThan$nullTest();
        _addLessThan$DateTest();
        _addLessThan$longTest();
        _addLessThan$StringTest();
        _addLessThanEqual$nullTest();
        _addLessThanEqual$DateTest();
        _addLessThanEqual$longTest();
        _addLessThanEqual$StringTest();
        _addNotBetween$longTest();
        _addNotEqual$nullTest();
        _addNotEqual$DateTest();
        _addNotEqual$longTest();
        _addNotEqual$StringTest();

        _addToNumberTest();
        _addLikeDoubleWildcardTest();

        Vector inMemoryTests = new Vector(getTests().size());
        for (Iterator iter = getTests().iterator(); iter.hasNext();) {
            TestEntity baseTest = (TestEntity)iter.next();
            if (baseTest instanceof ReadAllExpressionTest) {
                ReadAllExpressionTest test = (ReadAllExpressionTest)baseTest;
                if (test.isPlatformSpecific()) {
                    continue;
                }
                if (!shouldTestPassInMemory(test)) {
                    continue;
                }
                ReadAllQuery query = test.getQuery(true);
                query.checkCacheOnly();
                InMemoryQueryIndirectionPolicy policy = new InMemoryQueryIndirectionPolicy();
                policy.triggerIndirection();
                query.setInMemoryQueryIndirectionPolicy(policy);
                inMemoryTests.addElement(baseTest);
            }
        }
        inMemoryTests.trimToSize();
        setTests(inMemoryTests);
    }

    /**
     * Filter out all Expression tests that trigger some fatal error
     * when executed In-Memory.
     */
    public boolean shouldTestPassInMemory(ReadAllExpressionTest test) {
        String name = test.getName();
        if (// Exclude batching tests
            (name.indexOf("MultiPlatformTest") > -1) ||// MultiPlatformTestx use functions that are not supported in memory yet
            (name.indexOf("Batch") > -1) ||// Exclude float tests because of Java floating point conversion issues.
            (name.indexOf("$float") > -1) ||// Exclude char tests because they use field values, with incorrect types.
            (name.indexOf("$char") > -1) ||// Excluded due to bug 3246889, inner/outerjoin symantics need to be supported.
            (name.equals("JoinsShrinkResultSetSizeTest")) || (name.equals("NotSelfManagedEmployeeTest")) || (name.equals("NotEqualSelfManagedEmployeeTest")) || (name.equals("NotBetween$ObjectTest")) || (name.equals("IsNullAccrossAnyOfTest")) || (name.equals("VehicleViewJoinOnlyTest"))) {
            return false;
        }
        return true;
    }
}
