/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2019 IBM Corporation. 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.jpa.jpql;

import java.io.EOFException;
import java.util.List;

import jakarta.persistence.NoResultException;
import jakarta.persistence.OptimisticLockException;
import jakarta.persistence.Persistence;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.RollbackException;
import jakarta.persistence.TransactionRequiredException;
import jakarta.persistence.Query;
import jakarta.persistence.EntityManager;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.advanced.EmployeePopulator;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper;

import org.junit.Assert;

/**
 * <p>
 * <b>Purpose</b>: Test EJBQL exceptions.
 * </p>
 * <b>Description</b>: This class creates a test suite, initializes the database
 * and adds tests to the suite.
 * <p>
 * <b>Responsibilities</b>:
 * </p>
 * <ul>
 * <li> Run tests for expected EJBQL exceptions thrown
 * </ul>
 * @see org.eclipse.persistence.testing.models.jpa.advanced.EmployeePopulator
 * @see JUnitDomainObjectComparer
 */

public class JUnitJPQLValidationTestSuite extends JUnitTestCase
{
    static JUnitDomainObjectComparer comparer;        //the global comparer object used in all tests

    public JUnitJPQLValidationTestSuite()
    {
        super();
    }

    public JUnitJPQLValidationTestSuite(String name)
    {
        super(name);
    }

    //This method is run at the end of EVERY test case method
    @Override
    public void tearDown()
    {
        clearCache();
    }
    //This suite contains all tests contained in this class
    public static Test suite()
    {
        TestSuite suite = new TestSuite();
        suite.setName("JUnitJPQLValidationTestSuite");
        suite.addTest(new JUnitJPQLValidationTestSuite("testSetup"));
        suite.addTest(new JUnitJPQLValidationTestSuite("generalExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("recognitionExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("missingSelectExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest1"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest2"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest3"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest4"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest5"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest6"));
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest7"));
        //gf1166
        suite.addTest(new JUnitJPQLValidationTestSuite("malformedJPQLExceptionTest8"));
        suite.addTest(new JUnitJPQLValidationTestSuite("noAliasWithWHEREAndParameterExceptionTest"));
        //suite.addTest(new JUnitJPQLValidationTestSuite("unknownAbstractSchemaTypeTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("multipleDeclarationOfIdentificationVariable"));
        suite.addTest(new JUnitJPQLValidationTestSuite("aliasResolutionException"));
        suite.addTest(new JUnitJPQLValidationTestSuite("illegalArgumentExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("createNamedQueryThrowsIllegalArgumentExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("flushTxExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testExecuteUpdateTxException"));
        suite.addTest(new JUnitJPQLValidationTestSuite("noResultExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testGetSingleResultOnUpdate"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testGetSingleResultOnDelete"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testExecuteUpdateOnSelect"));
        suite.addTest(new JUnitJPQLValidationTestSuite("flushOptimisticLockExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("commitOptimisticLockExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("JTAOptimisticLockExceptionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testParameterNameValidation"));
        // JPQL should not validate floats, database may allow (could be 1.0 and valid, or db could truncate)
        //suite.addTest(new JUnitJPQLValidationTestSuite("testModArgumentValidation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testInExpressionValidation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testOrderableTypeInOrderByItem"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testNonExistentOrderByAlias"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testInvalidNavigation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testInvalidCollectionNavigation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testUnknownAttribute"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testUnknownEnumConstant"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testCommitRollbackException"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testParameterPositionValidation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testParameterPositionValidation2"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testParameterTypeValidation"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testEjbqlCaseSensitivity"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testEjbqlSupportJoinArgument"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testInvalidSetClause"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testUnsupportedCountDistinctOnOuterJoinedCompositePK"));
        suite.addTest(new JUnitJPQLValidationTestSuite("testInvalidHint"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidCharTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidOnClauseTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidSQLExpressionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidColumnExpressionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidFunctionExpressionTest"));
        suite.addTest(new JUnitJPQLValidationTestSuite("invalidOperatorExpressionTest"));

        return suite;
    }

    /**
     * The setup is done as a test, both to record its failure, and to allow execution in the server.
     */
    public void testSetup() {
        clearCache();
        //get session to start setup
        DatabaseSession session = JUnitTestCase.getServerSession();

        //create a new EmployeePopulator
        EmployeePopulator employeePopulator = new EmployeePopulator();

        new AdvancedTableCreator().replaceTables(session);

        //initialize the global comparer object
        comparer = new JUnitDomainObjectComparer();

        //set the session for the comparer to use
        comparer.setSession((AbstractSession)session.getActiveSession());

        //Populate the tables
        employeePopulator.buildExamples();

        //Persist the examples in the database
        employeePopulator.persistExample(session);
    }

    public void ensureInvalid(String jpql)
    {
        try {
            createEntityManager().createQuery(jpql).getResultList();
            fail("Illegal Argument Exception must be thrown");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void illegalArgumentExceptionTest() {
        ensureInvalid("SELECT FROM EMPLOYEE emp");
    }


    public void generalExceptionTest() {
        ensureInvalid("SELECT FROM EMPLOYEE emp");
    }

    public void recognitionExceptionTest() {
        ensureInvalid("SELECT OBJECT(emp) FROW Employee emp");
    }

    public void invalidCharTest() {
        ensureInvalid("Select !e from Employee e where ! e = e");
    }

    public void invalidOnClauseTest() {
        if (!isHermesParser()) {
            warning("invalidOnClauseTest only works with Hermes");
            return;
        }
        ensureInvalid("Select e from Employee e on e.id = 5");
        ensureInvalid("Select e from Employee e on");
        ensureInvalid("Select e from Employee e like");
        ensureInvalid("Select e from Employee e upper");
        ensureInvalid("Select e from Employee e case");
        ensureInvalid("Select e from Employee e select");
    }

    public void invalidSQLExpressionTest() {
        if (!isHermesParser()) {
            warning("invalidSQLExpressionTest only works with Hermes");
            return;
        }
        ensureInvalid("Select e from Employee e where sql");
        ensureInvalid("Select e from Employee e where sql(");
        ensureInvalid("Select e from Employee e where sql()");
        ensureInvalid("Select e from Employee e where sql(')");
    }

    public void invalidColumnExpressionTest() {
        if (!isHermesParser()) {
            warning("invalidColumnExpressionTest only works with Hermes");
            return;
        }
        ensureInvalid("Select e from Employee e where column");
        ensureInvalid("Select e from Employee e where column(");
        ensureInvalid("Select e from Employee e where column()");
        ensureInvalid("Select e from Employee e where column(')");
        ensureInvalid("Select e from Employee e where column('foo')");
        ensureInvalid("Select e from Employee e where column('foo', e.id, e.id)");
        ensureInvalid("Select e from Employee e where column('foo', 5)");
    }

    public void invalidOperatorExpressionTest() {
        if (!isHermesParser()) {
            warning("invalidColumnExpressionTest only works with Hermes");
            return;
        }
        ensureInvalid("Select e from Employee e where operator");
        ensureInvalid("Select e from Employee e where operator(");
        ensureInvalid("Select e from Employee e where operator()");
        ensureInvalid("Select e from Employee e where operator(')");
    }

    public void invalidFunctionExpressionTest() {
        if (!isHermesParser()) {
            warning("invalidFunctionExpressionTest only works with Hermes");
            return;
        }
        ensureInvalid("Select e from Employee e where function");
        ensureInvalid("Select e from Employee e where function(");
        ensureInvalid("Select e from Employee e where function()");
        ensureInvalid("Select e from Employee e where function(')");
    }

   public void missingSelectExceptionTest() {
       ensureInvalid("OBJECT(emp) FROM Employee emp");
   }


   public void malformedJPQLExceptionTest1()
   {

        String ejbqlString =  "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName == \"F";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Recognition Exception must be thrown");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
   }

   public void malformedJPQLExceptionTest2()
   {

        String ejbqlString =  "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = \"Fred\" AND 1";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Recognition Exception must be thrown");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
   }

    public void malformedJPQLExceptionTest3()
    {

        String ejbqlString =  "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = \"Fred\" OR \"Freda\"";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Recognition Exception must be thrown");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void malformedJPQLExceptionTest4()
    {

        String ejbqlString =  "SLEECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = \"Fred\" OR \"Freda\"";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Recognition Exception must be thrown");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

    }

    public void malformedJPQLExceptionTest5()
    {

        String ejbqlString =  "SELECT c FORM Customer c";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword FORM");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT COUNT(c FROM Customer c";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword FROM");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c* FROM Customer c";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword *");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void malformedJPQLExceptionTest6()
    {

        /*String ejbqlString =  "SELECT c FROM Customer c WHERE c.name LIKE 1";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword 1");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertEquals(JPQLException.unexpectedToken, ((JPQLException) ex.getCause()).getErrorCode());
            assertTrue("Failed to throw expected IllegalArgumentException for a query having an unexpected keyword 1.", ex.getCause().getMessage().contains("unexpected token [1]"));
        }*/

        String ejbqlString =  "SELECT c FROM Customer c WHERE c.name is not nall";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword nall");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c FROM Customer c WHERE c.name is net null";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword net");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c FROM Customer c WHERE c.name is EMPYT";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword EMPYT");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c FROM Customer c WHERE c.name in 3.5";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword 3.5");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c FROM Customer c WHERE c.name MEMBER 6";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword 6");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        ejbqlString =  "SELECT c FROM Customer c WHERE c.name NOT BETEEN 6 and 7";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query using invalid keyword BETEEN");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

    }

    public void malformedJPQLExceptionTest7()
    {

        String ejbqlString =  "SELECT e FROM";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Expected unexpected end of query exception.");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

    }

    //gf1166  Wrap ANTLRException inside JPQLException
    public void malformedJPQLExceptionTest8()
    {

        String ejbqlString =  "SELECT e FROM";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Expected unexpected end of query exception.");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

    }

    public void noAliasWithWHEREAndParameterExceptionTest()
    {

        String ejbqlString =  "FROM Employee WHERE firstName = ?1";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Recognition Exception must be thrown");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void aliasResolutionException()
    {
        String ejbqlString = null;

        try {
            // invalid identification variable in WHERE clause
            ejbqlString = "SELECT employee FROM Employee employee WHERE emp.firstName = 'Fred'";
            createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "using an invalid identification variable in the WHERE clause.");
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        try {
            // invalid identification variable in SELECT clause
            ejbqlString = "SELECT OBJECT(nullRoot) FROM Employee emp";
            createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "selecting an invalid identification variable.");
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        try {
            // invalid identification variable in JOIN clause
            ejbqlString = "SELECT emp FROM Employee emp JOIN e.projects p WHERE p.name = 'Enterprise'";
            createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "using an invalid identification variable in a JOIN clause.");
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void unknownAbstractSchemaTypeTest()
    {
        String ejbqlString =  " SELECT OBJECT(i) FROM Integer i WHERE i.city = \"Ottawa\"";

        try
        {
            List result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Missing exception for query using unknown abstract schema type");
        }

        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void multipleDeclarationOfIdentificationVariable()
    {
        String ejbqlString;
        List result;

        try
        {
            ejbqlString = "SELECT o FROM Employee o, Customer o";
            result = createEntityManager().createQuery(ejbqlString).getResultList();
            fail("Multiple declaration of identification variable must be thrown");
        }
        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        if (isHermesParser()) {
            // This should be valid now.
            ejbqlString = "SELECT e FROM Employee e JOIN e.projects p WHERE NOT EXISTS (SELECT p FROM e.projects p)";
            result = createEntityManager().createQuery(ejbqlString).getResultList();
        }
    }

    public void testParameterNameValidation(){
        EntityManager em = this.createEntityManager();
        Query query = em.createQuery("Select e from Employee e where e.lastName like :name ");
        try{
            query.setParameter("l", "%ay");
            query.getResultList();
        }catch (IllegalArgumentException ex){
            assertTrue("Failed to throw expected IllegalArgumentException, when incorrect parameter name is used", ex.getMessage().contains("using a name"));
            return;
        }
        fail("Failed to throw expected IllegalArgumentException, when incorrect parameter name is used");
    }

    public void testParameterPositionValidation(){
        EntityManager em = this.createEntityManager();
        Query query = em.createQuery("Select e from Employee e where e.firstName like ?1 ");
        try{
            query.setParameter(2, "%ay");
            query.getResultList();
        }catch (IllegalArgumentException ex){
            assertTrue("Failed to throw expected IllegalArgumentException, when incorrect parameter name is used", ex.getMessage().contains("parameter at position"));
            return;
        }
        fail("Failed to throw expected IllegalArgumentException, when incorrect parameter position is used");
    }

    public void testParameterPositionValidation2() {

        EntityManager em = this.createEntityManager();
        Query query = em.createQuery("Select e from Employee e where e.firstName = ?1 AND e.lastName = ?3 ");
        try {
            query.setParameter(1, "foo");
            query.setParameter(2, "");
            query.setParameter(3, "bar");
            query.getResultList();
        } catch (IllegalArgumentException ex) {
            assertTrue("Failed to throw expected IllegalArgumentException, when incorrect parameter name is used", ex.getMessage().contains("parameter at position"));
            return;
        }
        fail("Failed to throw expected IllegalArgumentException, when incorrect parameter position is used");
    }

    public void testParameterTypeValidation() {
        EntityManager em = this.createEntityManager();
        Query query = em.createQuery("Select e from Employee e where e.firstName = :fname AND e.lastName = :lname ");
        try {
            query.setParameter("fname", "foo");
            query.setParameter("lname", Integer.valueOf(1));
            query.getResultList();
        } catch (IllegalArgumentException ex) {
            assertTrue("Failed to throw expected IllegalArgumentException, when parameter with incorrect type is used", ex.getMessage().contains("attempted to set a value of type"));
            return;
        }
        fail("Failed to throw expected IllegalArgumentException, when parameter with incorrect type is used");
    }

    public void testModArgumentValidation()
    {
        //Assert.assertFalse("Warning SQL/Sybase doesnot support MOD function",  JUnitTestCase.getServerSession().getPlatform().isSQLServer() || JUnitTestCase.getServerSession().getPlatform().isSybase() || JUnitTestCase.getServerSession().getPlatform().isSybase());

        String ejbqlString;
        List result;

        try
        {
            ejbqlString = "SELECT p FROM LargeProject p WHERE MOD(p.budget, 10) = 5";
            result = createEntityManager().createQuery(ejbqlString).getResultList();
            //fail("wrong data type for MOD function must be thrown");
        }
        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }

        try
        {
            ejbqlString = "SELECT p FROM LargeProject p WHERE MOD(10, p.budget) = 5";
            result = createEntityManager().createQuery(ejbqlString).getResultList();
            //fail("wrong data type for MOD function must be thrown");
        }
        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testInExpressionValidation()
    {
        String ejbqlString;
        List result;

        try {
            ejbqlString = "SELECT e FROM Employee e WHERE e.firstName IN (1, 2)";
            result = createEntityManager().createQuery(ejbqlString).getResultList();
            //fail("wrong type for IN expression exception must be thrown");
        }
        catch(IllegalArgumentException ex)
        {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testOrderableTypeInOrderByItem() {
        EntityManager em = this.createEntityManager();

        if (isHermesParser()) {
            // This is now supported, orders by the address foreign key.
            Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.address");
            query.getResultList();
        }
    }

    public void testNonExistentOrderByAlias() {
        EntityManager em = this.createEntityManager();
        try {
            Query query = em.createQuery("SELECT e FROM Employee e ORDER BY firstName");
            query.getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query having an ORDER BY item with a non-existent alias");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testInvalidNavigation() {
        EntityManager em = this.createEntityManager();
        try {
            em.createQuery("SELECT e.firstName.invalid FROM Employee e").getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "navigating a state field of type String in the SELECT clause.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
        try {
            em.createQuery("SELECT e FROM Employee e WHERE e.firstName.invalid = 1").getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "navigating a state field of type String in the WHERE clause.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testInvalidCollectionNavigation() {
        EntityManager em = this.createEntityManager();
        try {
            String jpql = "SELECT e.phoneNumbers.type FROM Employee e";
            em.createQuery(jpql).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "navigating a collection valued association field in the SELECT clause.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
        try {
            String jpql =
                "SELECT e FROM Employee e WHERE e.phoneNumbers.type = 'Work'";
            em.createQuery(jpql).getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "navigating a collection valued association field in the WHERE clause.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testInvalidHint() {
        EntityManager em = createEntityManager();
        try {
            String jpql = "SELECT e.phoneNumbers.type FROM Employee e";
            Query query = em.createQuery(jpql);
            query.setHint(QueryHints.BATCH, "e.phoneNumbers");
            query.getResultList();
            fail("Failed to throw expected IllegalArgumentException for invalid query hint.");
        } catch (IllegalArgumentException ex) {
            // Expected.
        }
        try {
            String jpql = "SELECT e FROM Employee e";
            Query query = em.createQuery(jpql);
            query.setHint(QueryHints.BATCH, "e.phoneNumbers.areaCode");
            query.getResultList();
            fail("Failed to throw expected IllegalArgumentException for invalid query hint.");
        } catch (QueryException ex) {
            // Expected.
        }
        try {
            String jpql = "SELECT e FROM Employee e";
            Query query = em.createQuery(jpql);
            query.setHint(QueryHints.CACHE_USAGE, "foobar");
            query.getResultList();
            fail("Failed to throw expected IllegalArgumentException for invalid query hint.");
        } catch (IllegalArgumentException ex) {
            // Expected.
        }
        closeEntityManager(em);
    }

    public void testUnknownAttribute() {
        EntityManager em = this.createEntityManager();
        try {
            em.createQuery("SELECT e.unknown FROM Employee e").getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "selecting an unknown state or association field.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
        try {
            em.createQuery("SELECT e FROM Employee e WHERE e.unknown = 1").getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query " +
                 "using an unknown state or association field in the WHERE clause.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

    public void testUnknownEnumConstant() {
        EntityManager em = this.createEntityManager();
        try {
            //em.createQuery("SELECT e FROM Employee e WHERE e.status = EmployeeStatus.FULL_TIME");
            Query query = em.createQuery("SELECT e FROM Employee e WHERE e.status = EmployeeStatus.FULL_TIME");
            query.getResultList();
            fail("Failed to throw expected IllegalArgumentException for a query"+
                "unknown enumerated class constant.");
        } catch (IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        }
    }

  /**
   * For this test you need to add a persistence unit named default1 in the persistence.xml file
   * in essentials_testmodels.jar.
   */
    public void flushOptimisticLockExceptionTest()
    {
        if (isOnServer()) {
            // Multi-persistece-unit not work on server.
            return;
        }
        EntityManager firstEm = createEntityManager();
        EntityManager secondEm = createAlternateEntityManager();

        String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName='Bob' ";

        secondEm.getTransaction().begin();
        try{
            firstEm.getTransaction().begin();
            try{
                Employee firstEmployee = (Employee) firstEm.createQuery(ejbqlString).getSingleResult();
                firstEmployee.setLastName("test");

                Employee secondEmployee = (Employee) secondEm.createQuery(ejbqlString).getSingleResult();
                secondEmployee.setLastName("test");

                firstEm.flush();
                firstEm.getTransaction().commit();
            }catch (RuntimeException ex){
                if (firstEm.getTransaction().isActive()){
                    firstEm.getTransaction().rollback();
                }
                firstEm.close();
                throw ex;
            }
            secondEm.flush();
            fail("jakarta.persistence.OptimisticLockException must be thrown during flush");
        } catch (PersistenceException e) {
            if (secondEm.getTransaction().isActive()){
                secondEm.getTransaction().rollback();
            }
            secondEm.close();
            undoEmployeeChanges();
            if (isKnownMySQLIssue(e.getCause())) {
                warning("EOFException found on MySQL db.  This is a known problem with the MySQL Database");
            } else {
                //temporary logging
                AbstractSessionLog.getLog().log(SessionLog.WARNING, "[TEMPORARY LOGGING]", new Object[] {}, false);
                AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, e);
                Assert.assertTrue("Got Exception type: " + e, e instanceof jakarta.persistence.OptimisticLockException);
            }
        }
    }


     /* For this test you need to add a persistence unit named default1 in the persistence.xml file
       in essentials_testmodels.jar */
    public void commitOptimisticLockExceptionTest()
    {
          if (isOnServer()) {
            // Multi-persistece-unit not work on server.
            return;
        }
        EntityManager firstEm = createEntityManager();
        EntityManager secondEm = createAlternateEntityManager();

        String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName='Bob' ";

       secondEm.getTransaction().begin();
       try{
            firstEm.getTransaction().begin();
            try{

                Employee firstEmployee = (Employee) firstEm.createQuery(ejbqlString).getSingleResult();
                firstEmployee.setLastName("test");

                Employee secondEmployee = (Employee) secondEm.createQuery(ejbqlString).getSingleResult();
                secondEmployee.setLastName("test");

                firstEm.getTransaction().commit();
            }catch (RuntimeException ex){
                if (firstEm.getTransaction().isActive()){
                    firstEm.getTransaction().rollback();
                }
                firstEm.close();
                throw ex;
            }
            secondEm.getTransaction().commit();
        } catch (Exception e){
            if (secondEm.getTransaction().isActive()){
                secondEm.getTransaction().rollback();
            }
            secondEm.close();
            undoEmployeeChanges();
            if (isKnownMySQLIssue(e.getCause())) {
                warning("EOFException found on MySQL db.  This is a known problem with the MySQL Database");
            } else {
                Assert.assertTrue("Exception not instance of opt Lock exception: " + e.getCause(), e.getCause() instanceof jakarta.persistence.OptimisticLockException);
            }
            return;
        }
        fail("jakarta.persistence.OptimisticLockException must be thrown during commit");
    }

    public void JTAOptimisticLockExceptionTest()
    {
        // This test is skipped for Symfoware as Symfoware does not support SQL generated by this test.
        // Bug 381302 In Symfoware, a base table name to be updated cannot be identical to
        // table name in from clause in query or subquery specification or to table name
        // referenced by view table identified by table name.
        if ( JUnitTestCase.getServerSession().getPlatform().isSymfoware() ) {
            return;
        }

        EntityManager em = createEntityManager();
        try {
            beginTransaction(em);
            try {

                Employee emp = (Employee) em.createQuery("SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName='Bob' ").getSingleResult();
                em.createQuery("Update Employee set lastName = 'test-bad' WHERE firstName='Bob' ").executeUpdate();
                emp.setLastName("test");
                commitTransaction(em);
            } catch (RuntimeException ex) {
                closeEntityManagerAndTransaction(em);
                Throwable lockException = ex;
                while ((lockException != null) && !(lockException instanceof OptimisticLockException)) {
                    lockException = lockException.getCause();
                }
                if (lockException instanceof OptimisticLockException) {
                    return;
                }
                throw ex;
            }
            fail("Lock exception should have been thrown");
        } finally {
            clearCache();
        }
    }

    /**
     * This method is a temporary solution to avoid failures in our nightly testing.
     * This allows a warning to be printed when MySQL fails with a specific error.
     * This is a known error in the MySQL db, and this method will be removed
     * when this error is resolved.
     *
     * @param exception
     * @return true if this exception is a specific known MySQL failure
     */
    public boolean isKnownMySQLIssue(Throwable exception) {
        Throwable e1 = exception;
        if (exception == null) {
            return false;
        }

        if (!(exception instanceof jakarta.persistence.OptimisticLockException) &&
                JUnitTestCase.getServerSession().getPlatform().isMySQL()) {
            while(e1 != null) {
                if (e1 instanceof EOFException) {
                    //found it - return true
                    return true;
                }
                e1 = e1.getCause();
            }
        }
        return false;
    }

    public void flushTxExceptionTest()
    {
        try
        {
            createEntityManager().flush();
        }
        catch (TransactionRequiredException e) {
            // ok.
        }
    }

    public void testExecuteUpdateTxException()
    {
        boolean testPass=false;
        String ejbqlString = "DELETE FROM Employee e WHERE e.lastName=\"doesNotExist\"";

        EntityManager em = createEntityManager();
        try
        {
            Object result = em.createQuery(ejbqlString).executeUpdate();

            //rollback for clean-up if above call does not fail, otherwise this may affect other tests
            if(!isTransactionActive(em)){
                beginTransaction(em);
            }
            rollbackTransaction(em);
        }
        catch (TransactionRequiredException e)
        {
            testPass = true;
        }
        finally
        {
            closeEntityManager(em);
        }
        Assert.assertTrue("TransactionRequiredException is expected", testPass);
    }

    public void createNamedQueryThrowsIllegalArgumentExceptionTest()
    {
        try
        {
            List result = createEntityManager().createNamedQuery("test").getResultList();
        }
        catch (IllegalArgumentException e) {
            // ok.
        }
    }

    public void noResultExceptionTest()
    {
        String ejbqlString = "SELECT OBJECT (emp) FROM Employee emp WHERE emp.lastName=\"doestNotExist\" ";

        try
        {
            Object result = createEntityManager().createQuery(ejbqlString).getSingleResult();
        }
        catch (Exception e)
        {
            Assert.assertTrue(e instanceof NoResultException);
        }
    }

    public void testGetSingleResultOnUpdate()
    {
        boolean testPass=false;
        String ejbqlString = "UPDATE Employee e SET e.salary = (e.salary + 1000) WHERE e.lastName='Chanley' ";

        try
        {
            Object result = createEntityManager().createQuery(ejbqlString).getSingleResult();
        }
        catch (IllegalStateException e)
        {
            testPass = true;
        }
        Assert.assertTrue(testPass);
    }


    public void testGetSingleResultOnDelete()
    {
        boolean testPass=false;
        String ejbqlString = "DELETE FROM Employee e WHERE e.lastName='Chanley' ";

        try
        {
            Object result = createEntityManager().createQuery(ejbqlString).getSingleResult();
        }
        catch (IllegalStateException e)
        {
            testPass = true;
        }
        Assert.assertTrue(testPass);
    }

    public void testExecuteUpdateOnSelect()
    {
        boolean testPass=false;
        String ejbqlString = "SELECT emp FROM Employee emp  WHERE emp.lastName='Smith' ";

        EntityManager em = createEntityManager();
        try  {
            beginTransaction(em);
            em.createQuery(ejbqlString).executeUpdate();
            commitTransaction(em);
        } catch (IllegalStateException e) {
            testPass = true;
        } finally {
            closeEntityManagerAndTransaction(em);
        }
        Assert.assertTrue(testPass);
    }


    public void testCommitRollbackException()
    {
        if (isOnServer()) {
            // Cannot create parallel entity managers in the server.
            return;
        }
        EntityManager em = createEntityManager();
        String ejbqlString = "SELECT OBJECT (emp) FROM Employee emp WHERE emp.firstName='Bob'";
        DirectToFieldMapping idMapping = null;
        String defaultFieldName = "";
        beginTransaction(em);
        try{
            Employee emp = (Employee) em.createQuery(ejbqlString).getSingleResult();
            idMapping = (DirectToFieldMapping) (((EntityManagerImpl)em.getDelegate()).getServerSession()).getClassDescriptor(Employee.class).getMappingForAttributeName("id");
            defaultFieldName = idMapping.getFieldName();
            idMapping.setFieldName("fake_id");
            emp.setId(323);
            commitTransaction(em);
        } catch (Exception e) {
            if(isTransactionActive(em)){
                rollbackTransaction(em);
                closeEntityManager(em);
            }
            Assert.assertTrue(e instanceof RollbackException);
        } finally {
            em = createEntityManager();
            beginTransaction(em);
            try{
                idMapping.setFieldName(defaultFieldName);
                commitTransaction(em);
            } catch (Exception e) {
                if(isTransactionActive(em)){
                    rollbackTransaction(em);
                    closeEntityManager(em);
                }
            }
        }
    }

    //fix for bugID 4670705
    public void testEjbqlCaseSensitivity()
    {
        boolean testPass = true;
        EntityManager em = createEntityManager();
        String ejbqlString = "SELECT OBJECT (E) FROM Employee e";

        try {
            List result = em.createQuery(ejbqlString).getResultList();
        } catch (Exception e) {
            testPass = false;
        }
        Assert.assertTrue(testPass);
    }

    //this test resets the last name of the employee Bob that is changed in some tests
    public void undoEmployeeChanges()
    {
        EntityManager em = createEntityManager();

        beginTransaction(em);
        try{
            String ejbqlString = "SELECT OBJECT (emp) FROM Employee emp WHERE emp.firstName ='Bob' ";

            Employee emp = (Employee) em.createQuery(ejbqlString).getSingleResult();
            emp.setLastName("Smith");

            em.flush();
            commitTransaction(em);
        } catch (RuntimeException e) {
            if(isTransactionActive(em)){
                rollbackTransaction(em);
                closeEntityManager(em);
            }
        }
    }

    public void testEjbqlSupportJoinArgument() {
        boolean testPass = true;
        String ejbqlString;

        try
        {
            ejbqlString = "SELECT e.firstName FROM Employee e JOIN e.period ep";
            createEntityManager().createQuery(ejbqlString).getResultList();
        } catch(Exception ex) {
            testPass = false;
        }
        Assert.assertTrue(testPass);

        try
        {
            ejbqlString = "SELECT e.firstName FROM Employee e JOIN FETCH e.period";
            createEntityManager().createQuery(ejbqlString).getResultList();
        } catch(Exception ex) {
            testPass = false;
        }
        Assert.assertTrue(testPass);
    }

    public void testInvalidSetClause() {
        String ejbqlString;
        EntityManager em = createEntityManager();
        beginTransaction(em);
        try {
            ejbqlString = "UPDATE Employee e SET e.projects = NULL";
            em.createQuery(ejbqlString).executeUpdate();
            fail ("Failed to throw expected IllegalArgumentException for query " +
                    " updating a collection valued relationship.");
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        } finally {
            closeEntityManagerAndTransaction(em);
        }

        //above exception would have marked the transaction for rollback,
        //so the test needs to start a new one
        em = createEntityManager();
        beginTransaction(em);

        try
        {
            ejbqlString = "UPDATE Employee e SET e.department.name = 'CHANGED'";
            em.createQuery(ejbqlString).executeUpdate();
            fail ("Failed to throw expected IllegalArgumentException for query " +
                    " updating a sate field of a related instance.");
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        } finally {
            closeEntityManagerAndTransaction(em);
        }
    }

    public void testUnsupportedCountDistinctOnOuterJoinedCompositePK() {
        try  {
            String jpql = "SELECT COUNT(DISTINCT p) FROM Employee e LEFT JOIN e.phoneNumbers p GROUP BY e.lastName";
            createEntityManager().createQuery(jpql).getResultList();
            if (!((DatabasePlatform)getPlatform()).supportsCountDistinctWithMultipleFields()) {
                fail ("Failed to throw expected IllegalArgumentException for query " +
                      " having a COUNT DISTINCT on a joined variable with a composite primary key.");
            }
        } catch(IllegalArgumentException ex) {
            Assert.assertTrue(ex.getCause() instanceof JPQLException);
        } catch(QueryException ex) {
            // OK
        }
    }

    public static EntityManager createAlternateEntityManager() {
        return Persistence.createEntityManagerFactory("default1", JUnitTestCaseHelper.getDatabaseProperties()).createEntityManager();
    }
}
