/*
 * 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 java.util.HashSet;
import java.util.Set;

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

public class TestUpdateDeleteClause extends QueryTest {

    @Test
    public void testDelete() {
        // TODO parser/mapper have to be fixed
        /* 0 assertValidQuery("delete FROM Cop c where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)"); */
        // TODO parser/mapper have to be fixed
        /* 1 assertValidQuery("delete FROM Cop as c where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)"); */
        /* 2 */assertValidQuery("delete FROM Cop c where exists(select avg(c1.id) from Cop c1)");
        assertValidQuery("DELETE FROM Cop");
        // TODO parser/mapper have to be fixed
        /* 3 assertValidQuery("delete FROM Cop c where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)"); */
    }

    @Test
    @ToBeInvestigated
    // @TestProperties(unsupportedDatabaseVendors = { DatabaseVendor.OPEN_SQL })
    public void testUpdate() {

        /* 4 */assertInvalidUpdateExecution("update Cop c set p.ianko = 4 where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)");
        /* 5 */assertInvalidUpdateExecution("update Cop c set C.p.ianko = 4 where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)");
        assertValidUpdateExecution("UPDATE Cop SET id=1");
        // TODO parser/mapper have to be fixed
        /* 6 assertInvalidQuery("update Cop set C.p.ianko = 4 where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)"); */
        /* 7 */assertInvalidUpdateExecution("update Cop set partner.id = 4 where avg(c.id) > 3.5 and exists(select avg(c1.id) from Cop c1)");
        // TODO parser/mapper have to be fixed
        /* 8 assertValidQuery("update Cop set id = null where exists(select avg(c1.id) from Cop c1)"); */
        assertValidUpdateExecution("update Cop set id = 1 where exists(select avg(c.id) from Cop c)");

        /* 9 */assertInvalidUpdateExecution("update Cop set id = 'null' where exists(select avg(c1.id) from Cop c1)");

        // TODO parser/mapper have to be fixed
        /* 10 assertValidQuery("update Cop set partner = null"); */
        /* 11 assertValidQuery("update Cop set tesla.integer = 5"); */
        /* 12 assertInvalidQuery("update Cop set partner.partner = null"); */
        /* 13 assertInvalidQuery("update Cop set attachedCriminals = null"); */
    }

    @Test
    public void testUpdateWithArguments() {

        Set<InputParameterHolder> par1 = new HashSet<InputParameterHolder>();
        par1.add(new InputParameterHolder("var2", "string"));
        par1.add(new InputParameterHolder("var1", 2));
        assertValidQueryWithParameters("UPDATE Department d SET d.name=:var2 WHERE d.id=:var1 ", par1);

        par1.clear();
        par1.add(new InputParameterHolder("var1", 1));
        par1.add(new InputParameterHolder("var2", 2));
        assertValidQueryWithParameters("UPDATE Cop c SET c.id=:var1, c.tesla.integer=:var2", par1);

        par1.clear();
        par1.add(new InputParameterHolder("var1", 1));
        par1.add(new InputParameterHolder("var2", 2));
        assertValidQueryWithParameters("UPDATE Cop c SET c.id = :var2 WHERE c.id=:var1", par1);
    }
}
