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

// Contributors:
//     Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.tests.jpql.tools;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.jpa.jpql.tools.ContentAssistExtension;
import org.eclipse.persistence.jpa.jpql.tools.ContentAssistProposals;
import org.eclipse.persistence.jpa.jpql.tools.ContentAssistProposals.ClassType;
import org.eclipse.persistence.jpa.jpql.tools.ResultQuery;
import org.eclipse.persistence.jpa.jpql.utility.CollectionTools;
import org.junit.Test;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.*;
import static org.junit.Assert.*;

/**
 * Unit-test for {@link ContentAssistExtension} when the JPQL grammar is extended with EclipseLink.
 *
 * @version 2.5
 * @since 2.5
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public final class EclipseLinkContentAssistExtensionTest extends AbstractContentAssistExtensionTest {


    @Override
    protected ContentAssistExtension buildContentAssistExtension() {
        return new ContentAssistExtension() {
            @Override
            public Iterable<String> classNames(String prefix, ClassType type) {
                if (type == ClassType.INSTANTIABLE) {
                    return filter(EclipseLinkContentAssistExtensionTest.this.classNames(), prefix);
                }
                return filter(EclipseLinkContentAssistExtensionTest.this.enumTypes(), prefix);
            }
            @Override
            public Iterable<String> columnNames(String tableName, String prefix) {
                return filter(EclipseLinkContentAssistExtensionTest.this.columnNames(tableName), prefix);
            }
            @Override
            public Iterable<String> tableNames(String prefix) {
                return filter(EclipseLinkContentAssistExtensionTest.this.tableNames(), prefix);
            }
        };
    }

    private void test_buildQuery(String jpqlQuery,
                                 int position,
                                 String proposal,
                                 String expectedJpqlQuery,
                                 int expectedPosition,
                                 boolean insert) {

        ContentAssistProposals proposals = buildContentAssistProposals(jpqlQuery, position);
        ResultQuery result = proposals.buildQuery(jpqlQuery, proposal, position, insert);
        assertEquals(expectedJpqlQuery, result.getQuery());
        assertEquals(expectedPosition,  result.getPosition());
    }

    @Test
    public void test_buildQuery_001_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('') EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE''') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_001_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('') EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_002_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('') EMP";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_002_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('') EMP";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_003_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_003_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_004_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'E";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_004_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_005_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE() EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_005_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE() EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_006_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_006_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE".length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_007_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_007_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_008_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(E";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_008_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(E";
        int position = jpqlQuery.length();
        String proposal = "'EMPLOYEE'";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE'";
        int expectedPosition = expectedJpqlQuery.length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_buildQuery_009_Insert() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A = 100";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A".length();
        String proposal = "ADDRESS_ID";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.ADDRESS_ID = 100";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.ADDRESS_ID".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, true);
    }

    @Test
    public void test_buildQuery_009_Override() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A = 100";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A".length();
        String proposal = "ADDRESS_ID";

        String expectedJpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.ADDRESS_ID = 100";
        int expectedPosition = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.ADDRESS_ID".length();

        test_buildQuery(jpqlQuery, position, proposal, expectedJpqlQuery, expectedPosition, false);
    }

    @Test
    public void test_classNames_001() {

        String jpqlQuery = "SELECT e FROM Employee e, ";
        int position = jpqlQuery.length();
        testHasTheseProposals(jpqlQuery, position, classNames());
    }

    @Test
    public void test_classNames_002() {

        String jpqlQuery = "SELECT e FROM Employee e, jpql.query.Employee emp";
        int position = "SELECT e FROM Employee e, jpql.query.Employee".length();
        testHasTheseProposals(jpqlQuery, position, filter(classNames(), "jpql.query.Employee"));
    }

    @Test
    public void test_classNames_003() {

        String jpqlQuery = "SELECT e FROM Employee e, jpql.query.";
        int position = jpqlQuery.length();
        testHasTheseProposals(jpqlQuery, position, filter(classNames(), "jpql.query."));
    }

    @Test
    public void test_classNames_004() {

        String jpqlQuery = "SELECT e FROM Employee e, jpql.query.Employee emp";
        int position = "SELECT e FROM Employee e, jpql.query.".length();
        testHasTheseProposals(jpqlQuery, position, filter(classNames(), "jpql.query."));
    }

    @Test
    public void test_classNames_005() throws Exception {

        String jpqlQuery = "SELECT e FROM Employee e, jpql.query.Employee emp";
        int position = "SELECT e FROM Employee e, ".length();

        List<String> proposals = new ArrayList<>();
        proposals.add(IN);
        CollectionTools.addAll(proposals, entityNames());
        CollectionTools.addAll(proposals, classNames());

        testHasTheseProposals(jpqlQuery, position, proposals);
    }

    @Test
    public void test_columnNames_01() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, columnNames("EMPLOYEE"));
    }

    @Test
    public void test_columnNames_02() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.F";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(columnNames("EMPLOYEE"), "F"));
    }

    @Test
    public void test_columnNames_03() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.FIRST_NAME";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.".length();
        testHasOnlyTheseProposals(jpqlQuery, position, columnNames("EMPLOYEE"));
    }

    @Test
    public void test_columnNames_04() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.FIRST_NAME";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(columnNames("EMPLOYEE"), "FIRST_NAME"));
    }

    @Test
    public void test_columnNames_05() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE EMP.A";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(columnNames("EMPLOYEE"), "A"));
    }

    @Test
    public void test_columnNames_06() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP WHERE e.";
        int position = jpqlQuery.length();
        testDoesNotHaveTheseProposals(jpqlQuery, position, columnNames("EMPLOYEE"));
    }

    @Test
    public void test_columnNames_07() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A = 100";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.".length();
        testDoesNotHaveTheseProposals(jpqlQuery, position, columnNames("EMPLOYEE"));
    }

    @Test
    public void test_columnNames_08() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A = 100";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP, TABLE('ADDRESS') a WHERE e.name = EMP.LAST_NAME and a.A".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(columnNames("ADDRESS"), "A"));
    }

    @Test
    public void test_tableNames_01() {

        String jpqlQuery = "SELECT e FROM Employee e, ";
        int position = jpqlQuery.length();
        testDoesNotHaveTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_02() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_03() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('";
        int position = jpqlQuery.length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_04() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('')";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_05() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('')";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_06() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE')";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_07() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE')";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_08() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E')";
        int position = "SELECT e FROM Employee e, TABLE('E".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "E"));
    }

    @Test
    public void test_tableNames_09() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE')";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "EMPLOYEE"));
    }

    @Test
    public void test_tableNames_10() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE')";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "EMPLOYEE"));
    }

    @Test
    public void test_tableNames_11() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = "SELECT e FROM Employee e, TABLE('E".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "E"));
    }

    @Test
    public void test_tableNames_12() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = "SELECT e FROM Employee e, TABLE('".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_13() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('E";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_14() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE('EMPLOYEE') EMP";
        int position = "SELECT e FROM Employee e, TABLE('EMPLOYEE'".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "EMPLOYEE"));
    }

    @Test
    public void test_tableNames_15() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE() EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_16() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(EMPLOYEE) EMP";
        int position = "SELECT e FROM Employee e, TABLE(".length();
        testHasOnlyTheseProposals(jpqlQuery, position, tableNames());
    }

    @Test
    public void test_tableNames_17() {

        String jpqlQuery = "SELECT e FROM Employee e, TABLE(EMPLOYEE) EMP";
        int position = "SELECT e FROM Employee e, TABLE(EMPLOYEE".length();
        testHasOnlyTheseProposals(jpqlQuery, position, filter(tableNames(), "EMPLOYEE"));
    }
}
