/*
 * 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 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;

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

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

    @Test
    public void test_RenameAttribute_1() throws Exception {

        String jpqlQuery = "SELECT e.address.zip FROM Employee e";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT e.".length();
        String typeName = "jpql.query.Employee";
        String oldValue = "address";
        String newValue = "addr";
        refactoringTool.renameAttribute(typeName, oldValue, newValue);

        String expected = "SELECT e.addr.zip FROM Employee e";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameAttribute_2() throws Exception {

        String jpqlQuery = "SELECT e.address.zipcode FROM Employee e";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        String typeName = "jpql.query.Address";
        String oldValue = "zip";
        String newValue = "postalcode";
        refactoringTool.renameAttribute(typeName, oldValue, newValue);

        testHasNoChanges(refactoringTool);
    }

    @Test
    public void test_RenameAttribute_3() throws Exception {

        String jpqlQuery = "SELECT e.address.zip FROM Employee e";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT e.address.".length();
        String typeName = "jpql.query.Address";
        String oldValue = "zip";
        String newValue = "postalcode";
        refactoringTool.renameAttribute(typeName, oldValue, newValue);

        String expected = "SELECT e.address.postalcode FROM Employee e";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_1() throws Exception {

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

        int offset = "SELECT NEW ".length();
        String oldValue = "java.util.Vector";
        String newValue = "java.util.ArrayList";
        refactoringTool.renameClassName(oldValue, newValue);

        String expected = "SELECT NEW java.util.ArrayList(a.employees) FROM Address A";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_2() throws Exception {

        String jpqlQuery = "SELECT NEW org.eclipse.persistence.Collection.Vector(a.employees) FROM Address A";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT NEW ".length();
        String oldValue = "org.eclipse.persistence.Collection";
        String newValue = "org.eclipse.persistence.Type";
        refactoringTool.renameClassName(oldValue, newValue);

        String expected = "SELECT NEW org.eclipse.persistence.Type.Vector(a.employees) FROM Address A";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_3() throws Exception {

        String jpqlQuery = "SELECT NEW org.eclipse.persistence.Vector(a.employees) FROM Address A";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        String oldValue = "org.eclipse.persistence.AbstractSession";
        String newValue = "org.eclipse.persistence.session.Session";
        refactoringTool.renameClassName(oldValue, newValue);

        testHasNoChanges(refactoringTool);
    }

    @Test
    public void test_RenameClassName_4() throws Exception {

        String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.query.EnumType.FIRST_NAME";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT p FROM Product p WHERE p.enumType = ".length();
        String oldValue = "jpql.query.EnumType";
        String newValue = "org.eclipse.persistence.Type";
        refactoringTool.renameClassName(oldValue, newValue);

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.FIRST_NAME";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_5() throws Exception {

        String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.query.EnumType.";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT p FROM Product p WHERE p.enumType = ".length();
        String oldValue = "jpql.query.EnumType";
        String newValue = "org.eclipse.persistence.Type";
        refactoringTool.renameClassName(oldValue, newValue);

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_6() throws Exception {

        String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.query.Employee.EnumType.FIRST_NAME";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT p FROM Product p WHERE p.enumType = ".length();
        String oldValue = "jpql.query.Employee";
        String newValue = "org.eclipse.persistence.Type";
        refactoringTool.renameClassName(oldValue, newValue);

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.EnumType.FIRST_NAME";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameClassName_7() throws Exception {

        String jpqlQuery = "SELECT p FROM Product p WHERE p.enumType = jpql.query.EnumType.FIRST_NAME";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameClassName("jpql.query.Employee", "org.eclipse.persistence.Type");

        testHasNoChanges(refactoringTool);
    }

    @Test
    public void test_RenameEntityName_1() throws Exception {

        String jpqlQuery = "SELECT a FROM Address A";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

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

        String expected = "SELECT a FROM Employee A";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEntityName_2() throws Exception {

        String jpqlQuery = "SELECT a FROM Address A WHERE EXISTS(SELECT e FROM Employee e)";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "SELECT a FROM Address A WHERE EXISTS(SELECT e FROM ".length();
        String oldValue = "Employee";
        String newValue = "Manager";
        refactoringTool.renameEntityName(oldValue, newValue);

        String expected = "SELECT a FROM Address A WHERE EXISTS(SELECT e FROM Manager e)";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEnumConstant_1() throws Exception {

        String jpqlQuery = "UPDATE Employee SET name = jakarta.persistence.AccessType.FIELD";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset = "UPDATE Employee SET name = ".length();
        String oldValue = "jakarta.persistence.AccessType.FIELD";
        String newValue = "jakarta.persistence.AccessType.PROPERTY";
        refactoringTool.renameEnumConstant(oldValue, newValue);

        String expected = "UPDATE Employee SET name = jakarta.persistence.AccessType.PROPERTY";
        testChange(refactoringTool, jpqlQuery, expected, offset, oldValue, newValue);
    }

    @Test
    public void test_RenameEnumConstant_2() throws Exception {

        String jpqlQuery = "UPDATE Employee e SET e.name = e.lName";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        String oldValue = "jakarta.persistence.AccessType.FIELD";
        String newValue = "jakarta.persistence.AccessType.PROPERTY";
        refactoringTool.renameEnumConstant(oldValue, newValue);

        testHasNoChanges(refactoringTool);
    }

    @Test
    public void test_RenameVariable_1() throws Exception {

        String jpqlQuery = "SELECT a FROM Address A";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT ".length();
        int offset2 = "SELECT a FROM Address ".length();
        String oldValue = "a";
        String newValue = "addr";
        refactoringTool.renameVariable(oldValue, newValue);

        String expected = "SELECT addr FROM Address addr";
        testChanges(refactoringTool, jpqlQuery, expected, oldValue, newValue, offset2, offset1);
    }

    @Test
    public void test_RenameVariable_2() throws Exception {

        String jpqlQuery = "SELECT a FROM Address a JOIN a.employees ad";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT ".length();
        int offset2 = "SELECT a FROM Address ".length();
        int offset3 = "SELECT a FROM Address a JOIN ".length();
        String oldValue = "a";
        String newValue = "addr";
        refactoringTool.renameVariable("a", "addr");

        String expected = "SELECT addr FROM Address addr JOIN addr.employees ad";
        testChanges(refactoringTool, jpqlQuery, expected, oldValue, newValue, offset3, offset2, offset1);
    }

    @Test
    public void test_RenameVariable_3() throws Exception {

        String jpqlQuery = "SELECT a FROM Address a WHERE EXISTS(SELECT e FROM a.employee)";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);

        int offset1 = "SELECT ".length();
        int offset2 = "SELECT a FROM Address ".length();
        int offset3 = "SELECT a FROM Address a WHERE EXISTS(SELECT e FROM ".length();
        String oldValue = "a";
        String newValue = "addr";
        refactoringTool.renameVariable("a", "addr");

        String expected = "SELECT addr FROM Address addr WHERE EXISTS(SELECT e FROM addr.employee)";
        testChanges(refactoringTool, jpqlQuery, expected, oldValue, newValue, offset3, offset2, offset1);
    }

    @Test
    public void test_RenameVariable_4() throws Exception {

        String jpqlQuery = "SELECT FROM Address";
        BasicRefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameVariable("a", "addr");

        testHasNoChanges(refactoringTool);
    }
}
