/*
 * 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.DefaultRefactoringTool;
import org.eclipse.persistence.jpa.jpql.tools.RefactoringTool;
import org.eclipse.persistence.jpa.tests.jpql.UniqueSignature;
import org.junit.Test;
import static org.junit.Assert.*;

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

    private RefactoringTool buildRefactoringTool(String jpqlQuery) throws Exception {
        return new DefaultRefactoringTool(getPersistenceUnit(), getJPQLQueryBuilder(), jpqlQuery);
    }

    @Test
    public void test_RenameClassName_1() throws Exception {

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

        String expected = "SELECT NEW java.util.ArrayList(a.employees) FROM Address A";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_2() throws Exception {

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

        String expected = "SELECT NEW org.eclipse.persistence.Type.Vector(a.employees) FROM Address A";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_3() throws Exception {

        String jpqlQuery = "SELECT NEW org.eclipse.persistence.Vector(a.employees) FROM Address A";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameClassName("org.eclipse.persistence.AbstractSession", "org.eclipse.persistence.session.Session");

        assertEquals(jpqlQuery, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_4() throws Exception {

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

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.FIRST_NAME";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_5() throws Exception {

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

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_6() throws Exception {

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

        String expected = "SELECT p FROM Product p WHERE p.enumType = org.eclipse.persistence.Type.EnumType.FIRST_NAME";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameClassName_7() throws Exception {

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

        assertEquals(jpqlQuery, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameEntityName_1() throws Exception {

        String jpqlQuery = "SELECT a FROM Address A";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameEntityName("Address", "Employee");

        String expected = "SELECT a FROM Employee A";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameEntityName_2() throws Exception {

        String jpqlQuery = "SELECT a FROM Address A WHERE EXISTS(SELECT e FROM Employee e)";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameEntityName("Employee", "Manager");

        String expected = "SELECT a FROM Address A WHERE EXISTS(SELECT e FROM Manager e)";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameEnumConstant_1() throws Exception {

        String jpqlQuery = "UPDATE Employee SET name = jakarta.persistence.AccessType.FIELD";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameEnumConstant("jakarta.persistence.AccessType.FIELD", "jakarta.persistence.AccessType.PROPERTY");

        String expected = "UPDATE Employee SET name = jakarta.persistence.AccessType.PROPERTY";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameEnumConstant_2() throws Exception {

        String jpqlQuery = "UPDATE Employee e SET e.name = e.lName";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameEnumConstant("jakarta.persistence.AccessType.FIELD", "jakarta.persistence.AccessType.PROPERTY");

        assertEquals(jpqlQuery, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameFieldName_1() throws Exception {

        String jpqlQuery = "SELECT e.address.zip FROM Employee e";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameField("jpql.query.Employee", "address", "addr");

        String expected = "SELECT e.addr.zip FROM Employee e";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameFieldName_2() throws Exception {

        String jpqlQuery = "SELECT e.address.zipcode FROM Employee e";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameField("jpql.query.Address", "zip", "zipcode");

        assertEquals(jpqlQuery, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameVariable_1() throws Exception {

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

        String expected = "SELECT addr FROM Address addr";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameVariable_2() throws Exception {

        String jpqlQuery = "SELECT a FROM Address a JOIN a.employees ad";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameVariable("a", "addr");

        String expected = "SELECT addr FROM Address addr JOIN addr.employees ad";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameVariable_3() throws Exception {

        String jpqlQuery = "SELECT a FROM Address a WHERE EXISTS(SELECT e FROM a.employee)";
        RefactoringTool refactoringTool = buildRefactoringTool(jpqlQuery);
        refactoringTool.renameVariable("a", "addr");

        String expected = "SELECT addr FROM Address addr WHERE EXISTS(SELECT e FROM addr.employee)";
        assertEquals(expected, refactoringTool.toActualText());
    }

    @Test
    public void test_RenameVariable_4() throws Exception {

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

        assertEquals(jpqlQuery, refactoringTool.toActualText());
    }
}
