/*
 * Copyright (c) 2006, 2020 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
//
package org.eclipse.persistence.jpa.tests.jpql.tools;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.Vector;
import org.eclipse.persistence.jpa.jpql.tools.AbstractJPQLQueryHelper;
import org.eclipse.persistence.jpa.jpql.tools.spi.IEntity;
import org.eclipse.persistence.jpa.jpql.tools.spi.IManagedType;
import org.eclipse.persistence.jpa.jpql.tools.spi.IManagedTypeProvider;
import org.eclipse.persistence.jpa.jpql.tools.spi.IQuery;
import org.eclipse.persistence.jpa.jpql.tools.spi.IType;
import org.eclipse.persistence.jpa.jpql.tools.spi.ITypeRepository;
import org.eclipse.persistence.jpa.tests.jpql.JPQLCoreTest;
import org.eclipse.persistence.jpa.tests.jpql.JPQLQueryHelperTestHelper;
import org.eclipse.persistence.jpa.tests.jpql.tools.spi.java.JavaQuery;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 * The unit-tests for {@link AbstractJPQLQueryHelper#getParameterType(String)} and
 * {@link AbstractJPQLQueryHelper#getResultType()}.
 *
 * @version 2.4
 * @since 2.3
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public abstract class AbstractJPQLQueryHelperTest extends JPQLCoreTest {

    @JPQLQueryHelperTestHelper
    private AbstractJPQLQueryHelper jpqlQueryHelper;

    protected AbstractJPQLQueryHelper buildQueryHelper(IQuery namedQuery) {
        jpqlQueryHelper.setQuery(namedQuery);
        return jpqlQueryHelper;
    }

    protected IManagedType entity(IManagedTypeProvider provider, String entityName) throws Exception {
        IEntity entity = provider.getEntityNamed(entityName);
        assertNotNull("The entity " + entityName + " could not be found", entity);
        return entity;
    }

    protected IType getType(IQuery query, Class<?> type) {
        return typeRepository(query).getType(type);
    }

    protected IType getType(IQuery query, String typeName) {
        return typeRepository(query).getType(typeName);
    }

    protected IType mappedType(IQuery query, String entityName) {
        return query.getProvider().getEntityNamed(entityName).getType();
    }

    protected abstract IQuery namedQuery(String entityName, String queryName) throws Exception;

    protected IManagedTypeProvider provider(IQuery query) {
        return query.getProvider();
    }

    @Override
    protected void tearDown() throws Exception {
        jpqlQueryHelper.dispose();
        super.tearDown();
    }

    @Override
    protected void tearDownClass() throws Exception {
        jpqlQueryHelper = null;
        super.tearDownClass();
    }

    @Test
    public final void test_ParameterType_01() throws Exception {

        // select ds from Employee ds, Product ci where ds.empId = :conversationId AND ds.state = 0 AND ds.cikey = ci.cikey AND  ci.state <> 2
        IQuery namedQuery = namedQuery("Employee", "employee.empId");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":conversationId");

        assertNotNull(
            "The type of :conversationId should have been found",
            type
        );

        assertEquals(
            "The wrong type for :conversationId was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_02() throws Exception {

        // SELECT a.alias FROM Alias AS a WHERE (a.alias IS NULL AND :param1 IS NULL) OR a.alias = :param1
        IQuery namedQuery = namedQuery("Alias", "alias.param1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":param1");

        assertNotNull(
            "The type of :param1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :param1 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_03() throws Exception {

        // SELECT Distinct Object(c) From Customer c, IN(c.home.phones) p where p.area LIKE :area
        IQuery namedQuery = namedQuery("Customer", "customer.area");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":area");

        assertNotNull(
            "The type of :area should have been found",
            type
        );

        assertEquals(
            "The wrong type for :area was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_04() throws Exception {

        // select c.firstName FROM Customer c Group By c.firstName HAVING c.firstName = concat(:fname, :lname)
        IQuery namedQuery = namedQuery("Customer", "customer.name");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":fname");

        assertNotNull(
            "The type of :fname should have been found",
            type
        );

        assertEquals(
            "The wrong type for :fname was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_05() throws Exception {

        // select count(c) FROM Customer c JOIN c.aliases a GROUP BY a.alias HAVING a.alias = SUBSTRING(:string1, :int1, :int2)
        IQuery namedQuery = namedQuery("Customer", "customer.substring");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":int1");

        assertNotNull(
            "The type of :int1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :int1 was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_06() throws Exception {

        // select count(c) FROM Customer c JOIN c.aliases a GROUP BY a.alias HAVING a.alias = SUBSTRING(:string1, :int1, :int2)
        IQuery namedQuery = namedQuery("Customer", "customer.substring");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":int2");

        assertNotNull(
            "The type of :int2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :int2 was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_07() throws Exception {

        // select c.firstName FROM Customer c Group By c.firstName HAVING c.firstName = concat(:fname, :lname)
        IQuery namedQuery = namedQuery("Customer", "customer.name");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":lname");

        assertNotNull(
            "The type of :lname should have been found",
            type
        );

        assertEquals(
            "The wrong type for :lname was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_08() throws Exception {

        // select count(c) FROM Customer c JOIN c.aliases a GROUP BY a.alias HAVING a.alias = SUBSTRING(:string1, :int1, :int2)
        IQuery namedQuery = namedQuery("Customer", "customer.substring");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":string1");

        assertNotNull(
            "The type of :string1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :string1 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_09() throws Exception {

        // select o from Dept o where o.dname in (:dname1, :dname2, :dname3)
        IQuery namedQuery = namedQuery("Dept", "dept.dname");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dname1");

        assertNotNull(
            "The type of :dname1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :newdate was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_10() throws Exception {

        // select o from Dept o where o.dname in (:dname1, :dname2, :dname3)
        IQuery namedQuery = namedQuery("Dept", "dept.dname");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dname2");

        assertNotNull(
            "The type of :dname2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :newdate was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_11() throws Exception {

        // select o from Dept o where o.dname in (:dname1, :dname2, :dname3)
        IQuery namedQuery = namedQuery("Dept", "dept.dname");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dname3");

        assertNotNull(
            "The type of :dname3 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :newdate was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_12() throws Exception {

        // SELECT e FROM Employee e WHERE e.department = :dept AND e.salary > :base
        IQuery namedQuery = namedQuery("Employee", "employee.deptBase");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":base");

        assertNotNull(
            "The type of :base should have been found",
            type
        );

        assertEquals(
            "The wrong type for :base was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_13() throws Exception {

        // DELETE FROM Employee e WHERE e.department = :dept
        IQuery namedQuery = namedQuery("Employee", "employee.delete.dept");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dept");

        assertNotNull(
            "The type of :dept should have been found",
            type
        );

        assertEquals(
            "The wrong type for :dept was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_14() throws Exception {

        // SELECT e FROM Employee e WHERE e.department = :dept AND e.salary > :base
        IQuery namedQuery = namedQuery("Employee", "employee.deptBase");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dept");

        assertNotNull(
            "The type of :dept should have been found",
            type
        );

        assertEquals(
            "The wrong type for :dept was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_15() throws Exception {

        // SELECT e FROM Employee e WHERE e.name IN :type
        IQuery namedQuery = namedQuery("Employee", "employee.in");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":type");

        assertNotNull(
            "The type of :type should have been found",
            type
        );

        assertEquals(
            "The wrong type for :type was retrieved",
            getType(namedQuery, Collection.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_16() throws Exception {

        // SELECT e FROM Employee e WHERE e.name = ?1 ORDER BY e.name
        IQuery namedQuery = namedQuery("Employee", "employee.?1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType("?1");

        assertNotNull(
            "The type of ?1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for ?1 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_17() throws Exception {

        // SELECT e FROM Employee e WHERE e.salary = (SELECT MAX(e.salary) FROM Employee a WHERE a.department = :dept)
        IQuery namedQuery = namedQuery("Employee", "employee.dept");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":dept");

        assertNotNull(
            "The type of :dept should have been found",
            type
        );

        assertEquals(
            "The wrong type for :dept was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_18() throws Exception {

        // UPDATE Employee e SET e.manager = ?1 WHERE e.department = ?2
        IQuery namedQuery = namedQuery("Employee", "employee.update.positional");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType("?1");

        assertNotNull(
            "The type of ?1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for ?1 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_19() throws Exception {

        // UPDATE Employee e SET e.manager = ?1 WHERE e.department = ?2
        IQuery namedQuery = namedQuery("Employee", "employee.update.positional");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType("?2");

        assertNotNull(
            "The type of ?2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for ?2 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_20() throws Exception {

        String jpqlQuery = "SELECT c From Customer c where c.home.city IN(:city)";
        IQuery namedQuery = new JavaQuery(getPersistenceUnit(), jpqlQuery);

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":city");

        assertNotNull("The type of :city should have been found", type);

        assertEquals(
            "The wrong type for :city was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_21() throws Exception {

        // select object(o) FROM Order o Where SQRT(o.totalPrice) > :doubleValue
        IQuery namedQuery = namedQuery("Order", "order.doubleValue");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":doubleValue");

        assertNotNull(
            "The type of :dept should have been found",
            type
        );

        assertEquals(
            "The wrong type for :dept was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_22() throws Exception {

        // SELECT DISTINCT p From Product p where p.shelfLife.soldDate NOT BETWEEN :date1 AND :newdate
        IQuery namedQuery = namedQuery("Product", "product.date");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":date1");

        assertNotNull(
            "The type of :date1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for :date1 was retrieved",
            getType(namedQuery, Date.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_23() throws Exception {

        // Select Distinct Object(p) from Product p where (p.quantity > (500 + :int1)) AND (p.partNumber IS NULL))
        IQuery namedQuery = namedQuery("Product", "product.int1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":int1");

        assertNotNull(
            "The type of :dept should have been found",
            type
        );

        assertEquals(
            "The wrong type for :dept was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_24() throws Exception {

        // SELECT DISTINCT p From Product p where p.shelfLife.soldDate NOT BETWEEN :date1 AND :newdate
        IQuery namedQuery = namedQuery("Product", "product.date");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":newdate");

        assertNotNull(
            "The type of :newdate should have been found",
            type
        );

        assertEquals(
            "The wrong type for :newdate was retrieved",
            getType(namedQuery, Date.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_25() throws Exception {

        // SELECT e FROM Employee e WHERE EXISTS (SELECT p FROM Project p JOIN p.employees emp WHERE emp = e AND p.name = :name)
        IQuery namedQuery = namedQuery("Employee", "employee.subquery1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType(":name");

        assertNotNull(
            "The type of :name should have been found",
            type
        );

        assertEquals(
            "The wrong type for :name was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ParameterType_26() throws Exception {

        // SELECT e FROM Employee e WHERE 2 < ALL(SELECT a FROM Address a WHERE 2 < ANY(SELECT d FROM Dept WHERE a.city = ?1)
        IQuery namedQuery = namedQuery("Address", "address.subquery.subquery");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getParameterType("?1");

        assertNotNull(
            "The type of ?1 should have been found",
            type
        );

        assertEquals(
            "The wrong type for ?1 was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_01() throws Exception {

        // SELECT ABS(p.quantity) FROM Product p
        IQuery namedQuery = namedQuery("Product", "product.abs");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of ABS(p.quantity) should have been found",
            type
        );

        assertEquals(
            "The wrong type for ABS(p.quantity) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_02() throws Exception {

        // SELECT ABS(o.totalPrice) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.abs");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of ABS(o.totalPrice) should have been found",
            type
        );

        assertEquals(
            "The wrong type for ABS(o.totalPrice) was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_03() throws Exception {

        // SELECT ABS(p.id) FROM Project p
        IQuery namedQuery = namedQuery("Project", "project.abs");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of ABS(p.id) should have been found",
            type
        );

        assertEquals(
            "The wrong type for ABS(p.id) was retrieved",
            getType(namedQuery, Float.class),
            type
        );
    }

    @Test
    public final void test_ResultType_04() throws Exception {

        // SELECT 2 + 2.2F FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.addition1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of 2 + 2.2F should have been found",
            type
        );

        assertEquals(
            "The wrong type for 2 + 2.2F was retrieved",
            getType(namedQuery, Float.class),
            type
        );
    }

    @Test
    public final void test_ResultType_05() throws Exception {

        // SELECT AVG(e.salary) + 2E2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.addition2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of AVG(salary) + 2E2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for AVG(salary) + 2E2 was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_06() throws Exception {

        // SELECT e.salary + 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.addition3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.salary + 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.salary + 2 was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_07() throws Exception {

        // SELECT e.name + 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.addition4");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name + 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name + 2 was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_08() throws Exception {

        // SELECT AVG(p.quantity) FROM Product p
        IQuery namedQuery = namedQuery("Product", "product.quantity");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of AVG(p.quantity) should have been found",
            type
        );

        assertEquals(
            "The wrong type for AVG(p.quantity) was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_09() throws Exception {

        // SELECT CASE WHEN e.name = 'Java Persistence Query Language' THEN 'Java Persistence Query Language'
        //             WHEN 1 + 2 THEN SUBSTRING(e.name, 0, 2)
        //             ELSE e.name
        //        END
        // FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.case1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of CASE(...) should have been found",
            type
        );

        assertEquals(
            "The wrong type for CASE(...) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_10() throws Exception {

        // SELECT CASE WHEN e.name = 'JPQL' THEN e.working
        //             WHEN 1 + 2 THEN TRUE
        //             ELSE p.completed
        //        END
        // FROM Employee e, Project p
        IQuery namedQuery = namedQuery("Employee", "employee.case2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of CASE(...) should have been found",
            type
        );

        assertEquals(
            "The wrong type for CASE(...) was retrieved",
            getType(namedQuery, Boolean.class),
            type
        );
    }

    @Test
    public final void test_ResultType_11() throws Exception {

        // SELECT CASE WHEN e.name = 'JPQL' THEN e.working
        //             WHEN 1 + 2 THEN SUBSTRING(e.name, 0, 2)
        //             ELSE e.dept
        //        END
        // FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.case3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of CASE(...) should have been found",
            type
        );

        assertEquals(
            "The wrong type for CASE(...) was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_12() throws Exception {

        // SELECT e FROM Employee E
        IQuery namedQuery = namedQuery("Employee", "employee.caseInsensitive");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e should have been found",
            type
        );

        assertEquals(
            "The wrong type for e was retrieved",
            mappedType(namedQuery, "Employee"),
            type
        );
    }

    @Test
    public final void test_ResultType_13() throws Exception {

        // SELECT COALESCE(o.price, o.price) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.coalesce1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of COALESCE(o.price, o.price) should have been found",
            type
        );

        assertEquals(
            "The wrong type for COALESCE(o.price, o.price) was retrieved",
            getType(namedQuery, BigInteger.class),
            type
        );
    }

    @Test
    public final void test_ResultType_14() throws Exception {

        // SELECT COALESCE(o.totalPrice, SQRT(o.realPrice)) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.coalesce2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of COALESCE(o.totalPrice, SQRT(o.realPrice)) should have been found",
            type
        );

        assertEquals(
            "The wrong type for COALESCE(o.totalPrice, SQRT(o.realPrice)) was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_15() throws Exception {

        // SELECT COALESCE(o.number, e.name) FROM Order o, Employee e
        IQuery namedQuery = namedQuery("Order", "order.coalesce3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of COALESCE(o.number, e.name) should have been found",
            type
        );

        assertEquals(
            "The wrong type for COALESCE(o.number, e.name) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_16() throws Exception {

        // SELECT COALESCE(o.price, o.number) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.coalesce4");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of COALESCE(o.price, o.number) should have been found",
            type
        );

        assertEquals(
            "The wrong type for COALESCE(o.price, o.number) was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_17() throws Exception {

        // SELECT e.name, d.dname FROM Employee e, Dept d
        IQuery namedQuery = namedQuery("Employee", "employee.collection");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of (e.name, d.dname) should have been found",
            type
        );

        assertEquals(
            "The wrong type for (e.name, d.dname) was retrieved",
            getType(namedQuery, Object[].class),
            type
        );
    }

    @Test
    public final void test_ResultType_18() throws Exception {

        // SELECT c FROM Address a JOIN a.customerList c
        IQuery namedQuery = namedQuery("Address", "address.collection");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of c should have been found",
            type
        );

        assertEquals(
            "The wrong type for c was retrieved",
            mappedType(namedQuery, "Customer"),
            type
        );
    }

    @Test
    public final void test_ResultType_19() throws Exception {

        // SELECT CONCAT(a.street, a.city) FROM Address a
        IQuery namedQuery = namedQuery("Address", "address.concat");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of CONCAT(a.street, a.city) should have been found",
            type
        );

        assertEquals(
            "The wrong type for CONCAT(a.street, a.city) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_20() throws Exception {

        // select count(c) FROM Customer c JOIN c.aliases a GROUP BY a.alias HAVING a.alias = SUBSTRING(:string1, :int1, :int2)
        IQuery namedQuery = namedQuery("Customer", "customer.substring");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of count(c) should have been found",
            type
        );

        assertEquals(
            "The wrong type for count(c) was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_21() throws Exception {

        // select count(c) FROM Customer c JOIN c.aliases a GROUP BY a.alias HAVING a.alias = SUBSTRING(:string1, :int1, :int2)
        IQuery namedQuery = namedQuery("Customer", "customer.substring");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of count(c) should have been found",
            type
        );

        assertEquals(
            "The wrong type for count(c) was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_22() throws Exception {

        // SELECT CURRENT_DATE FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.date1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of CURRENT_DATE should have been found",
            type
        );

        assertEquals(
            "The wrong type for CURRENT_DATE was retrieved",
            getType(namedQuery, java.sql.Date.class),
            type
        );
    }

    @Test
    public final void test_ResultType_23() throws Exception {

        // SELECT {d '2008-12-31'} FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.date2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of {d '2008-12-31'} should have been found",
            type
        );

        assertEquals(
            "The wrong type for {d '2008-12-31'} was retrieved",
            getType(namedQuery, java.sql.Date.class),
            type
        );
    }

    @Test
    public final void test_ResultType_24() throws Exception {

        // DELETE FROM Employee e WHERE e.department = :dept
        IQuery namedQuery = namedQuery("Employee", "employee.delete.dept");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The object type should have been returned",
            type
        );

        assertEquals(
            "The wrong type was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_25() throws Exception {

        // SELECT 2 / 2.2F FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.division1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of 2 / 2.2F should have been found",
            type
        );

        assertEquals(
            "The wrong type for 2 / 2.2F was retrieved",
            getType(namedQuery, Float.class),
            type
        );
    }

    @Test
    public final void test_ResultType_26() throws Exception {

        // SELECT AVG(e.salary) / 2E2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.division2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of AVG(salary) / 2E2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for AVG(salary) / 2E2 was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_27() throws Exception {

        // SELECT e.salary / 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.division3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.salary / 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.salary / 2 was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_28() throws Exception {

        // SELECT e.name / 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.division4");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name / 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name / 2 was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_29() throws Exception {

        // SELECT ENTRY(e) FROM Alias a JOIN a.ids e
        IQuery namedQuery = namedQuery("Alias", "alias.entry");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of ENTRY(e) should have been found",
            type
        );

        assertEquals(
            "The wrong type for ENTRY(e) was retrieved",
            getType(namedQuery, Map.Entry.class),
            type
        );
    }

    @Test
    public final void test_ResultType_30() throws Exception {

        // SELECT CASE WHEN e.name = 'Pascal' THEN jpql.query.EnumType.FIRST_NAME
        //             WHEN e.name = 'JPQL'   THEN jpql.query.EnumType.LAST_NAME
        //             ELSE jpql.query.EnumType.NAME
        //        END
        // FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.enum");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of the case should have been found",
            type
        );

        assertEquals(
            "The wrong type for 2 - 2.2F was retrieved",
            helper.getTypeRepository().getType("jpql.query.EnumType"),
            type
        );
    }

    @Test
    public final void test_ResultType_31() throws Exception {

        // SELECT INDEX(c) FROM Address a JOIN a.customerList c
        IQuery namedQuery = namedQuery("Address", "address.index");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of INDEX(e) should have been found",
            type
        );

        assertEquals(
            "The wrong type for INDEX(c) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_32() throws Exception {

        // SELECT c.lastName FROM Address a JOIN a.customerList AS c
        IQuery namedQuery = namedQuery("Address", "address.stateField");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The object type should have been returned",
            type
        );

        assertEquals(
            "The wrong type was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_33() throws Exception {

        // SELECT KEY(k) FROM Alias a JOIN a.ids k
        IQuery namedQuery = namedQuery("Alias", "alias.key1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of KEY(k) should have been found",
            type
        );

        assertEquals(
            "The wrong type for KEY(k) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_34() throws Exception {

        // SELECT TRUE FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.true");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of TRUE should have been found",
            type
        );

        assertEquals(
            "The wrong type for TRUE was retrieved",
            getType(namedQuery, Boolean.class),
            type
        );
    }

    @Test
    public final void test_ResultType_35() throws Exception {

        // SELECT FALSE FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.false");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of FALSE should have been found",
            type
        );

        assertEquals(
            "The wrong type for FALSE was retrieved",
            getType(namedQuery, Boolean.class),
            type
        );
    }

    @Test
    public final void test_ResultType_36() throws Exception {

        // SELECT LENGTH(a.street) FROM Address a
        IQuery namedQuery = namedQuery("Address", "address.length");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of LENGTH(a.street) should have been found",
            type
        );

        assertEquals(
            "The wrong type for LENGTH(a.street) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_37() throws Exception {

        // SELECT LOCATE(a.street, 'Arco Drive') FROM Address a
        IQuery namedQuery = namedQuery("Address", "address.locate");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of LOCATE(a.street, 'Arco Drive') should have been found",
            type
        );

        assertEquals(
            "The wrong type for LOCATE(a.street, 'Arco Drive') was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_38() throws Exception {

        // SELECT LOWER(e.name) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.lower");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of LOWER(e.name) should have been found",
            type
        );

        assertEquals(
            "The wrong type for LOWER(e.name) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_39() throws Exception {

        // SELECT MAX(p.quantity) FROM Product p
        IQuery namedQuery = namedQuery("Product", "product.max");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of MAX(p.quantity) should have been found",
            type
        );

        assertEquals(
            "The wrong type for MAX(p.quantity) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_40() throws Exception {

        // SELECT MAX(e.salary) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.max");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of MAX(e.salary) should have been found",
            type
        );

        assertEquals(
            "The wrong type for MAX(e.salary) was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_41() throws Exception {

        // SELECT MIN(p.quantity) FROM Product p
        IQuery namedQuery = namedQuery("Product", "product.min");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of MIN(p.quantity) should have been found",
            type
        );

        assertEquals(
            "The wrong type for MIN(p.quantity) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_42() throws Exception {

        // SELECT MIN(e.salary) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.min");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of MIN(e.salary) should have been found",
            type
        );

        assertEquals(
            "The wrong type for MIN(e.salary) was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_43() throws Exception {

        // SELECT MOD(e.salary, e.empId) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.mod");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of MOD(e.salary, e.empId) should have been found",
            type
        );

        assertEquals(
            "The wrong type for MOD(e.salary, e.empId) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_44() throws Exception {

        // SELECT 2 * 2.2F FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.multiplication1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of 2 * 2.2F should have been found",
            type
        );

        assertEquals(
            "The wrong type for 2 * 2.2F was retrieved",
            getType(namedQuery, Float.class),
            type
        );
    }

    @Test
    public final void test_ResultType_45() throws Exception {

        // SELECT AVG(e.salary) * 2E2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.multiplication2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of AVG(salary) * 2E2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for AVG(salary) * 2E2 was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_46() throws Exception {

        // SELECT e.salary * 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.multiplication3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.salary * 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.salary * 2 was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_47() throws Exception {

        // SELECT e.name * 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.multiplication4");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name * 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name * 2 was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_48() throws Exception {

        // SELECT NEW java.lang.Vector(d.empList) FROM Dept d
        IQuery namedQuery = namedQuery("Dept", "dept.new1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of NEW java.lang.Vector(d.empList) should have been found",
            type
        );

        assertEquals(
            "The wrong type for NEW java.lang.Vector(d.empList) was retrieved",
            getType(namedQuery, Vector.class),
            type
        );
    }

    @Test
    public final void test_ResultType_49() throws Exception {

        // SELECT NULLIF(e.name, 'JPQL') FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.nullif1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of NULLIF(e.name, 'JPQL') should have been found",
            type
        );

        assertEquals(
            "The wrong type for NULLIF(e.name, 'JPQL') was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_50() throws Exception {

        // SELECT NULLIF(2 + 2, 'JPQL') FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.nullif2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of NULLIF(2 + 2, 'JPQL') should have been found",
            type
        );

        assertEquals(
            "The wrong type for NULLIF(2 + 2, 'JPQL') was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_51() throws Exception {

        // SELECT Distinct Object(c) From Customer c, IN(c.home.phones) p where p.area LIKE :area
        IQuery namedQuery = namedQuery("Customer", "customer.area");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of Object(c) should have been found",
            type
        );

        assertEquals(
            "The wrong type for Object(c) was retrieved",
            getType(namedQuery, "jpql.query.Customer"),
            type
        );
    }

    @Test
    public final void test_ResultType_52() throws Exception {

        // select object(o) FROM Order o Where SQRT(o.totalPrice) > :doubleValue
        IQuery namedQuery = namedQuery("Order", "order.doubleValue");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of object(o) should have been found",
            type
        );

        assertEquals(
            "The wrong type for object(o) was retrieved",
            getType(namedQuery, "jpql.query.Order"),
            type
        );
    }

    @Test
    public final void test_ResultType_53() throws Exception {

        // Select Distinct Object(p) from Product p where (p.quantity > (500 + :int1)) AND (p.partNumber IS NULL))
        IQuery namedQuery = namedQuery("Product", "product.int1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of Object(p) should have been found",
            type
        );

        assertEquals(
            "The wrong type for Object(p) was retrieved",
            getType(namedQuery, "jpql.query.Product"),
            type
        );
    }

    @Test
    public final void test_ResultType_54() throws Exception {

        // SELECT a.alias FROM Alias AS a WHERE (a.alias IS NULL AND :param1 IS NULL) OR a.alias = :param1
        IQuery namedQuery = namedQuery("Alias", "alias.param1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of a.alias should have been found",
            type
        );

        assertEquals(
            "The wrong type for a.alias was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_55() throws Exception {

        // select c.firstName FROM Customer c Group By c.firstName HAVING c.firstName = concat(:fname, :lname)
        IQuery namedQuery = namedQuery("Customer", "customer.name");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of c.firstName should have been found",
            type
        );

        assertEquals(
            "The wrong type for c.firstName was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_56() throws Exception {

        // select Dept.floorNumber from Dept Dept
        IQuery namedQuery = namedQuery("Dept", "dept.floorNumber");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of Dept.floorNumber should have been found",
            type
        );

        assertEquals(
            "The wrong type for Dept.floorNumber was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_57() throws Exception {

        // SELECT c from Customer c where c.home.city IN :city
        IQuery namedQuery = namedQuery("Customer", "customer.city");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of c should have been found",
            type
        );

        assertEquals(
            "The wrong type for c was retrieved",
            getType(namedQuery, "jpql.query.Customer"),
            type
        );
    }

    @Test
    public final void test_ResultType_58() throws Exception {

        // SELECT DISTINCT p From Product p where p.shelfLife.soldDate NOT BETWEEN :date1 AND :newdate
        IQuery namedQuery = namedQuery("Product", "product.date");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of p should have been found",
            type
        );

        assertEquals(
            "The wrong type for p was retrieved",
            getType(namedQuery, "jpql.query.Product"),
            type
        );
    }

    @Test
    public final void test_ResultType_59() throws Exception {

        // SELECT e.name AS n From Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.resultVariable1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name as n should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name as n was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_60() throws Exception {

        // SELECT e.name n From Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.resultVariable2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name as n should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name as n was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_61() throws Exception {

        // SELECT e.salary / 1000D n From Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.resultVariable3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.salary / 1000D n as n should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.salary / 1000D n as n was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_62() throws Exception {

        // SELECT SIZE(c) FROM Address a JOIN a.customerList c
        IQuery namedQuery = namedQuery("Address", "address.size");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SIZE(c) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SIZE(c) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_63() throws Exception {

        // SELECT SQRT(o.totalPrice) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.sqrt");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SQRT(o.totalPrice) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SQRT(o.totalPrice) was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_64() throws Exception {

        // SELECT 2 / 2.2F FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.substraction1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of 2 - 2.2F should have been found",
            type
        );

        assertEquals(
            "The wrong type for 2 - 2.2F was retrieved",
            getType(namedQuery, Float.class),
            type
        );
    }

    @Test
    public final void test_ResultType_65() throws Exception {

        // SELECT AVG(e.salary) - 2E2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.substraction2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of AVG(salary) / 2E2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for AVG(salary) / 2E2 was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_66() throws Exception {

        // SELECT e.name - 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.substraction3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.name - 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.name - 2 was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_67() throws Exception {

        // SELECT e.salary - 2 FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.substraction4");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of e.salary - 2 should have been found",
            type
        );

        assertEquals(
            "The wrong type for e.salary - 2 was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_68() throws Exception {

        // SELECT SUBSTRING(a.state, 0, 1) FROM Address a
        IQuery namedQuery = namedQuery("Address", "address.length");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SUBSTRING(a.state, 0, 1) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SUBSTRING(a.state, 0, 1) was retrieved",
            getType(namedQuery, Integer.class),
            type
        );
    }

    @Test
    public final void test_ResultType_69() throws Exception {

        // SELECT SUM(e.salary) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.sum");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SUM(e.salary) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SUM(p.quantity) was retrieved",
            getType(namedQuery, Long.class),
            type
        );
    }

    @Test
    public final void test_ResultType_70() throws Exception {

        // SELECT SUM(o.totalPrice) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.sum1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SUM(o.totalPrice) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SUM(o.totalPrice) was retrieved",
            getType(namedQuery, Double.class),
            type
        );
    }

    @Test
    public final void test_ResultType_71() throws Exception {

        // SELECT SUM(o.totalPrice) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.sum2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SUM(o.price) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SUM(o.price) was retrieved",
            getType(namedQuery, BigInteger.class),
            type
        );
    }

    @Test
    public final void test_ResultType_72() throws Exception {

        // SELECT SUM(o.realPrice) FROM Order o
        IQuery namedQuery = namedQuery("Order", "order.sum3");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of SUM(o.realPrice) should have been found",
            type
        );

        assertEquals(
            "The wrong type for SUM(o.realPrice) was retrieved",
            getType(namedQuery, BigDecimal.class),
            type
        );
    }

    @Test
    public final void test_ResultType_73() throws Exception {

        // SELECT TRIM(e.name) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.trim");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of TRIM(e.name) should have been found",
            type
        );

        assertEquals(
            "The wrong type for TRIM(e.name) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_74() throws Exception {

        // UPDATE Employee e SET e.manager = ?1 WHERE e.department = ?2
        IQuery namedQuery = namedQuery("Employee", "employee.update.positional");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The Object type should have been returned",
            type
        );

        assertEquals(
            "The wrong type was retrieved",
            getType(namedQuery, Object.class),
            type
        );
    }

    @Test
    public final void test_ResultType_75() throws Exception {

        // SELECT UPPER(e.name) FROM Employee e
        IQuery namedQuery = namedQuery("Employee", "employee.upper");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of UPPER(e.name) should have been found",
            type
        );

        assertEquals(
            "The wrong type for UPPER(e.name) was retrieved",
            getType(namedQuery, String.class),
            type
        );
    }

    @Test
    public final void test_ResultType_76() throws Exception {

        // SELECT VALUE(v) FROM Alias a JOIN a.ids v
        IQuery namedQuery = namedQuery("Alias", "alias.value1");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of VALUE(v) should have been found",
            type
        );

        assertEquals(
            "The wrong type for VALUE(v) was retrieved",
            getType(namedQuery, Date.class),
            type
        );
    }

    @Test
    public final void test_ResultType_77() throws Exception {

        // SELECT v FROM Alias a JOIN a.ids v
        IQuery namedQuery = namedQuery("Alias", "alias.value2");

        AbstractJPQLQueryHelper helper = buildQueryHelper(namedQuery);
        IType type = helper.getResultType();

        assertNotNull(
            "The type of v should have been found",
            type
        );

        assertEquals(
            "The wrong type for v was retrieved",
            getType(namedQuery, Date.class),
            type
        );
    }

    protected ITypeRepository typeRepository(IQuery query) {
        return query.getProvider().getTypeRepository();
    }
}
