/*
 * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1.query;

import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated;
import org.junit.Test;

public class TestFromClauses extends QueryTest {

    /*
     * JPA 1.0 specification, 4.4.2: An identification variable must not be a reserved identifier or have the same name as any
     * entity in the same persistence unit: Identification variables are case insensitive.
     */
    @Test
    public void testSimpleFrom() {
        /* 0 */assertValidQuery("SELECT c FROM City c");
        /* 1 */assertValidQuery("SELECT c FROM City as C");
        /* 2 */assertInvalidQuery("SELECT c FROM NoExist as c");
        /* 3 */assertValidQuery("SELECT C FROM City as c");
        /* 4 assertInvalidQuery("SELECT city FROM City city"); */
        /* 6 */assertInvalidQuery("SELECT c FROM City c, Person C");
        assertValidQuery("SELECT bfa.enumOrdinal FROM BasicTypesFieldAccess bfa WHERE bfa.enumOrdinal = org.eclipse.persistence.testing.models.wdf.jpa1.types.UserDefinedEnum.EMIL");
    }

    @Test
    @ToBeInvestigated
    public void testSimpleFrom5() {
        /* 5 */assertInvalidQuery("SELECT city FROM City City");
    }

    @Test
    public void testJoinFrom() {
        /* 7 */assertValidQuery("SELECT c FROM City c join c.cops as c1 where c1.id = 3");
        /* 8 */assertValidQuery("SELECT c FROM City c join c.cops c1 join c1.partner c2 where c2.id = 3");
        /* 11 */assertValidQuery("SELECT c FROM City c join fetch c.cops, Informer i inner join fetch i.informingCops");
        /* 12 */assertValidQuery("SELECT c FROM City c join c.cops c1 inner join c1.partner as c2 left join c2.partner c3 left outer join c3.informers c4 left outer join fetch c4.informingCops");
        /* 13 */assertValidQuery("select c from City as c join c.cops c1, in (c1.partner.attachedCriminals) crim where crim.attachedCop = c1");
        /* 14 */assertInvalidQuery("select c from City as c join c.cops c1, in (c1.partner) crim where crim.attachedCop = c1");
    }

    @Test
    @ToBeInvestigated
    public void testJoinFrom9() {
        /* 9 */assertInvalidQuery("SELECT c FROM Cop c join c.partner.attachedCriminals c1 where c1.id = 3");
    }

    @Test
    @ToBeInvestigated
    public void testJoinFrom10() {
        /* 10 */assertInvalidQuery("SELECT c FROM City c join c.type c1");
    }

    @Test
    @ToBeInvestigated
    public void testExistsSubquery15() {
        /* 15 */assertValidQuery("select c from City as c where exists (select c from City c)");
    }

    @Test
    @ToBeInvestigated
    public void testExistsSubquery17() {

        /* 17 */assertValidQuery("select c from City as c where exists (select c1 from City c1 where exists (select c1 from City c1))");
    }

    @Test
    @ToBeInvestigated
    public void testExistsSubquery18() {
        /* 18 */assertValidQuery("select c from City as c where exists (select c1 from City c1 where exists (select c from City c))");
    }
}
