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

import org.junit.Test;
import static org.eclipse.persistence.jpa.tests.jpql.JPQLQueries2_1.*;
import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*;

/**
 * @version 2.4
 * @since 2.4
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public final class JPQLQueriesTest2_1 extends JPQLParserTest {

    @Test
    public void test_Query_001() {

        // Select e
        // From Employee e Join TREAT(e.projects AS LargeProject) lp
        // Where lp.budget = :value

        ExpressionTester selectStatement = selectStatement(
            select(variable("e")),
            from("Employee", "e", joinTreatAs("e.projects", "LargeProject", "lp")),
            where(path("lp.budget").equal(inputParameter(":value")))
        );

        testQuery(query_001(), selectStatement);
    }

    @Test
    public void test_Query_002() {

        // Select e
        // From Employee e Join TREAT(e.projects LargeProject) lp

        ExpressionTester selectStatement = selectStatement(
            select(variable("e")),
            from("Employee", "e", joinTreat("e.projects", "LargeProject", "lp"))
        );

        testQuery(query_002(), selectStatement);
    }

    @Test
    public void test_Query_003() {

        // SELECT TREAT(TREAT(p.project LargeProject).parent AS LargeProject).endDate
      // FROM Product p

        ExpressionTester selectStatement = selectStatement(
            select(
                path(
                    treatAs(
                        path(treat("p.project", "LargeProject"), "parent"),
                        entity("LargeProject")
                    ),
                    "endDate"
                )
            ),
            from("Product", "p")
        );

        testQuery(query_003(), selectStatement);
    }
}
