/*
 * Copyright (c) 2011, 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 org.eclipse.persistence.jpa.jpql.tools.BasicRefactoringTool;
import org.eclipse.persistence.jpa.jpql.tools.DefaultBasicRefactoringTool;
import org.eclipse.persistence.jpa.tests.jpql.UniqueSignature;
import org.junit.Test;
import static org.eclipse.persistence.jpa.tests.jpql.JPQLQueries2_0.*;

/**
 * The abstract definition of a unit-test that tests {@link BasicRefactoringTool BasicRefactoringTool} when the JPA version is 2.0.
 *
 * @version 2.5
 * @since 2.4
 * @author Pascal Filion
 */
@UniqueSignature
@SuppressWarnings("nls")
public final class BasicRefactoringToolTest2_0 extends AbstractBasicRefactoringToolTest {

    private BasicRefactoringTool buildRefactoringTool(String jpqlQuery) throws Exception {
        return new DefaultBasicRefactoringTool(jpqlQuery, getGrammar(), getPersistenceUnit());
    }

    @Test
    public void test_RenameEntityName_1() throws Exception {

        // SELECT TYPE(employee) FROM Employee employee WHERE TYPE(employee) <> Exempt
        String jpqlQuery = query_007();
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT TYPE(employee) FROM Employee employee WHERE TYPE(employee) <> ".length();
        String oldValue = "Exempt";
        String newValue = "Exemption";
        refactoringTool.renameEntityName(oldValue, newValue);

        String expected = "SELECT TYPE(employee) FROM Employee employee WHERE TYPE(employee) <> Exemption";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEntityName_2() throws Exception {

        // SELECT e.name,
        //        CASE TYPE(e) WHEN Exempt THEN 'Exempt'
        //                     WHEN Contractor THEN 'Contractor'
        //                     WHEN Intern THEN 'Intern'
        //                     ELSE 'NonExempt'
        //        END
        // FROM Employee e, Contractor c
        // WHERE e.dept.name = 'Engineering'

        String jpqlQuery = query_002();
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = jpqlQuery.indexOf("Contractor THEN");
        int offset2 = jpqlQuery.indexOf("Contractor c");
        String oldValue1 = "Contractor";
        String newValue1 = "Manager";
        refactoringTool.renameEntityName(oldValue1, newValue1);

        int offset3 = jpqlQuery.indexOf("Exempt THEN");
        String oldValue2 = "Exempt";
        String newValue2 = "Exemption";
        refactoringTool.renameEntityName(oldValue2, newValue2);

        int offset4 = jpqlQuery.indexOf("Employee e");
        String oldValue3 = "Employee";
        String newValue3 = "Address";
        refactoringTool.renameEntityName(oldValue3, newValue3);

        String expected = "SELECT e.name, " +
                          "       CASE TYPE(e) WHEN Exemption THEN 'Exempt' " +
                          "                    WHEN Manager THEN 'Contractor' " +
                          "                    WHEN Intern THEN 'Intern' " +
                          "                    ELSE 'NonExempt' " +
                          "       END " +
                          "FROM Address e, Manager c " +
                          "WHERE e.dept.name = 'Engineering'";

        testChanges(
            refactoringTool,
            jpqlQuery,
            expected,
            new int[]    {   offset2,   offset4,   offset1,   offset3 },
            new String[] { oldValue1, oldValue3, oldValue1, oldValue2 },
            new String[] { newValue1, newValue3, newValue1, newValue2 }
        );
    }

    @Test
    public void test_RenameEntityName_3() throws Exception {

        // SELECT e FROM Employee e WHERE TYPE(e) IN (Exempt, Contractor)
        String jpqlQuery = query_004();
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT e FROM Employee e WHERE TYPE(e) IN (Exempt, ".length();
        String oldValue = "Contractor";
        String newValue = "GeneralContractor";
        refactoringTool.renameEntityName(oldValue, newValue);

        String expected = "SELECT e FROM Employee e WHERE TYPE(e) IN (Exempt, GeneralContractor)";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEntityName_4() throws Exception {

        // SELECT TYPE(employee) FROM Employee employee WHERE TYPE(employee) <> Exempt
        String jpqlQuery = query_007();
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT TYPE(employee) FROM ".length();
        String oldValue = "Employee";
        String newValue = "Address";
        refactoringTool.renameEntityName(oldValue, newValue);

        String expected = "SELECT TYPE(employee) FROM Address employee WHERE TYPE(employee) <> Exempt";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEntityName_5() throws Exception {

        String jpqlQuery = "SELECT p FROM Project p WHERE TYPE(p) <> LargeProject";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT p FROM Project p WHERE TYPE(p) <> ".length();
        String oldValue = "LargeProject";
        String newValue = "LProject";
        refactoringTool.renameEntityName(oldValue, newValue);

        String expected = "SELECT p FROM Project p WHERE TYPE(p) <> LProject";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameResultVariable_1() throws Exception {

        String jpqlQuery = "SELECT NEW java.util.Vector(a.employees) AS u FROM Address A ORDER BY u";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT NEW java.util.Vector(a.employees) AS ".length();
        int offset2 = "SELECT NEW java.util.Vector(a.employees) AS u FROM Address A ORDER BY ".length();
        String oldValue = "u";
        String newValue = "v";
        refactoringTool.renameResultVariable(oldValue, newValue);

        String expected = "SELECT NEW java.util.Vector(a.employees) AS v FROM Address A ORDER BY v";
        testChanges(refactoringTool, jpqlQuery, expected, oldValue, newValue, offset2, offset1);
    }

    @Test
    public void test_RenameResultVariable_2() throws Exception {

        String jpqlQuery = "SELECT e.name AS n FROM Employee e";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        String oldValue = "u";
        String newValue = "v";
        refactoringTool.renameResultVariable(oldValue, newValue);

        testHasNoChanges(refactoringTool);
    }

    @Test
    public void test_RenameResultVariable_3() throws Exception {

        String jpqlQuery = "SELECT e.name AS n, 2 + 2 o FROM Address A";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT e.name AS n, 2 + 2 ".length();
        String oldValue = "o";
        String newValue = "value";
        refactoringTool.renameResultVariable(oldValue, newValue);

        String expected = "SELECT e.name AS n, 2 + 2 value FROM Address A";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameResultVariable_4() throws Exception {

        String jpqlQuery = "SELECT e.name AS n, e.age a FROM Address A ORDER BY n";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT e.name AS ".length();
        int offset2 = "SELECT e.name AS n, e.age a FROM Address A ORDER BY ".length();
        String oldValue = "n";
        String newValue = "name";
        refactoringTool.renameResultVariable(oldValue, newValue);

        String expected = "SELECT e.name AS name, e.age a FROM Address A ORDER BY name";
        testChanges(refactoringTool, jpqlQuery, expected, oldValue, newValue, offset2, offset1);
    }

    @Test
    public void test_RenameResultVariable_5() throws Exception {

        String jpqlQuery = "SELECT e.name AS n, e.age a FROM Address A ORDER BY n, a";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT e.name AS ".length();
        int offset2 = "SELECT e.name AS n, e.age a FROM Address A ORDER BY ".length();
        String oldValue1 = "n";
        String newValue1 = "name";
        refactoringTool.renameResultVariable(oldValue1, newValue1);

        int offset3 = "SELECT e.name AS n, e.age ".length();
        int offset4 = "SELECT e.name AS n, e.age a FROM Address A ORDER BY n, ".length();
        String oldValue2 = "a";
        String newValue2 = "age";
        refactoringTool.renameResultVariable(oldValue2, newValue2);

        String expected = "SELECT e.name AS name, e.age age FROM Address A ORDER BY name, age";

        testChanges(
            refactoringTool,
            jpqlQuery,
            expected,
            new int[]    {   offset4,   offset2,   offset3,   offset1 },
            new String[] { oldValue2, oldValue1, oldValue2, oldValue1 },
            new String[] { newValue2, newValue1, newValue2, newValue1 }
        );
    }
}
