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

@SuppressWarnings("nls")
public class TestBuiltInFunctionExpressions extends QueryTest {

    @Test
    public void testConcatHandling0() {
        /* 0 */assertValidQuery("SELECT c FROM City c where 'a' = concat('a', 'a')");
    }

    @Test
    public void testConcatHandling1() {
        /* 1 */assertValidQuery("SELECT c FROM City c where 'a' = concat(concat('a', 'a'), concat('a', 'a'))");
    }

    @Test
    public void testConcatHandling2() {
        /* 2 */assertValidQuery("SELECT p FROM Person p where 'a' = concat(p.string, p.string)");
    }

    @Test
    public void testConcatHandling3() {
        /* 3 */assertValidQuery("SELECT p FROM Person p where 'a' = concat(5, 5)");
    }

    @Test
    public void testConcatHandling4() {
        /* 4 */assertValidQuery("SELECT p FROM Person p where 'a' = concat(?1, ?1)");
    }

    @ToBeInvestigated
    @Test
    public void testConcatHandling5() {
        /* 5 */assertValidQuery("SELECT p FROM Person p where 'a' = concat(max(p.string), min(p.string))");
    }

    @Test
    public void testConcatHandling6() {
        /* 6 */assertValidQuery("SELECT p FROM Person p where 'a' = concat((select max(p1.string) from Person p1), (select max(p1.string) from Person p1))");
    }

    @Test
    public void testConcatHandling7() {
        /* 7 */assertInvalidQuery("SELECT p FROM Person p where 'a' = concat(p, 4 * 5)");
    }

    @Test
    public void testSubstringHandling() {
        /* -- */assertValidQuery("UPDATE Person p SET p.string = CONCAT('288', SUBSTRING(p.string, LOCATE(p.string, '-'), 4))");
    }

    @Test
    public void testSubstringHandling8() {
        /* 8 */assertValidQuery("SELECT p FROM Person p where 'a' = substring('a', 4, 5)");
    }

    @Test
    public void testSubstringHandling9() {
        /* 9 */assertValidQuery("SELECT p FROM Person p where 'a' = substring(p.string, p.integer, p.integer)");
    }

    @Test
    public void testSubstringHandling10() {
        /* 10 */assertValidQuery("SELECT p FROM Person p where 'a' = substring(p.string, 2 + 3, 3 * 2)");
    }

    @Test
    public void testSubstringHandling11() {
        /* 11 */assertValidQuery("SELECT p FROM Person p where 'a' = substring(?1, ?2, ?2)");
    }

    @Test
    public void testSubstringHandling12() {
        /* 12 */assertValidQuery("SELECT p FROM Person p where 'a' = substring(substring('a', 2, 3), abs(2), abs(-2))");
    }

    @ToBeInvestigated
    @Test
    public void testSubstringHandling13() {
        /* 13 */assertValidQuery("SELECT p FROM Person p where 'a' = substring(max(p.string), min(p.integer), max(p.integer))");
    }

    @Test
    public void testSubstringHandling14() {
        /* 14 */assertValidQuery("SELECT p FROM Person p where 'a' = substring((select max(p1.string) from Person p1), (select max(p1.integer) from Person p1), (select max(p1.integer) from Person p1))");
    }

    @Test
    public void testTrimHandling15() {
        /* 15 */assertValidQuery("SELECT p FROM Person p where 'a' = trim('a')");
    }

    @Test
    public void testTrimHandling16() {
        /* 16 */assertInvalidQuery("SELECT p FROM Person p where 'a' = trim(p)");
    }

    @Test
    public void testTrimHandling17() {
        /* 17 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(p.string)");
    }

    @Test
    public void testTrimHandling18() {
        /* 18 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(:one)");
    }

    @Test
    public void testTrimHandling19() {
        /* 19 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(trim('a'))");
    }

    @ToBeInvestigated
    @Test
    public void testTrimHandling20() {
        /* 20 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(max(p.string))");
    }

    @Test
    public void testTrimHandling21() {
        /* 21 */assertValidQuery("SELECT p FROM Person p where 'a' = trim((select max(p1.string) from Person p1))");
    }

    @Test
    public void testTrimHandling22() {
        /* 22 */assertInvalidQuery("SELECT p FROM Person p where 'a' = trim(1+1)");
    }

    @Test
    public void testTrimHandling28() {
        /* 28 */assertValidQuery("SELECT p FROM Person p where trim(trailing from 'a') = 'a'");
    }

    @Test
    public void testTrimHandling29() {
        /* 29 */assertValidQuery("SELECT p FROM Person p where trim(leading from 'a') = 'a'");
    }

    @Test
    public void testTrimHandling30() {
        /* 30 */assertInvalidQuery("SELECT p FROM Person p where 'a' = trim(1 from 'a')");
    }

    @ToBeInvestigated
    @Test
    public void testTrimHandling31() {
        /* 31 */assertInvalidQuery("SELECT p FROM Person p where 'a' = trim('12' from 'a')");
    }

    @Test
    public void testTrimWithTrimCharacter23() {
        /* 23 */assertValidQuery("SELECT p FROM Person p where 'a' = trim('a' from 'a')");
    }

    @Test
    public void testTrimWithTrimCharacter24() {
        /* 24 */assertValidQuery("SELECT p FROM Person p where trim(both 'a' from 'a') = 'a'");
    }

    @Test
    public void testTrimWithTrimCharacter25() {
        /* 25 */assertValidQuery("SELECT p FROM Person p where trim(trailing 'a' from 'a') = 'a'");
    }

    @Test
    public void testTrimWithTrimCharacter26() {
        /* 26 */assertValidQuery("SELECT p FROM Person p where trim(leading 'a' from 'a') = 'a'");
    }

    @Test
    public void testTrimWithTrimCharacter27() {
        /* 27 */assertValidQuery("SELECT p FROM Person p where trim(both from 'a') = 'a'");
    }

    @Test
    public void testTrimWithTrimCharacter33() {
        /* 33 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(:one from 'a')");
        /* 34 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(:one from 'a')");
    }

    @Test
    public void testTrimWithTrimCharacter34() {
        /* 34 */assertValidQuery("SELECT p FROM Person p where 'a' = trim(:one from 'a')");
    }

    @Test
    public void testUpperHandling35() {
        /* 35 */assertValidQuery("SELECT p FROM Person p where upper('a') = lower('a')");
    }

    @Test
    public void testUpperHandling36() {
        /* 36 */assertInvalidQuery("SELECT p FROM Person p where upper(p) = lower(p)");
    }

    @Test
    public void testUpperHandling37() {
        /* 37 */assertValidQuery("SELECT p FROM Person p where upper(p.string) = lower(p.string)");
    }

    @Test
    public void testUpperHandling38() {
        /* 38 */assertValidQuery("SELECT p FROM Person p where upper(:one) = lower(:one)");
    }

    @Test
    public void testUpperHandling39() {
        /* 39 */assertValidQuery("SELECT p FROM Person p where upper(trim('a')) = lower(trim('a'))");
    }

    @ToBeInvestigated
    @Test
    public void testUpperHandling40() {
        /* 40 */assertValidQuery("SELECT p FROM Person p where upper(min(p.string)) = lower(max(p.string))");
    }

    @Test
    public void testUpperHandling41() {
        /* 41 */assertValidQuery("SELECT p FROM Person p where upper((select max(p1.string) from Person p1)) = lower((select max(p1.string) from Person p1))");
    }

    @Test
    public void testUpperHandling42() {
        /* 42 */assertValidQuery("SELECT p FROM Person p where upper(2*2) = lower(1+1)");
    }

    @Test
    public void testLengthHandling43() {
        /* 43 */assertValidQuery("SELECT p FROM Person p where length('a') = 666");
    }

    @Test
    public void testLengthHandling44() {
        /* 44 */assertInvalidQuery("SELECT p FROM Person p where length(p) = 666");
    }

    @Test
    public void testLengthHandling45() {
        /* 45 */assertValidQuery("SELECT p FROM Person p where length(p.string) = 666");
    }

    @Test
    public void testLengthHandling46() {
        /* 46 */assertValidQuery("SELECT p FROM Person p where length(:one) = 666");
    }

    @Test
    public void testLengthHandling47() {
        /* 47 */assertValidQuery("SELECT p FROM Person p where length(trim('a')) = 666");
    }

    @ToBeInvestigated
    @Test
    public void testLengthHandling48() {
        /* 48 */assertValidQuery("SELECT p FROM Person p where length(min(p.string)) = 666");
    }

    @Test
    public void testLengthHandling49() {
        /* 49 */assertValidQuery("SELECT p FROM Person p where length((select max(p1.string) from Person p1)) = 666");
    }

    @Test
    public void testLengthHandling50() {
        /* 50 */assertValidQuery("SELECT p FROM Person p where length(2*2) = 666");
    }

    @Test
    public void testLocateHandling51() {
        /* 51 */assertValidQuery("SELECT p FROM Person p where 666 = locate('a', 'b', 5)");
    }

    @Test
    public void testLocateHandling52() {
        /* 52 */assertValidQuery("SELECT p FROM Person p where 666 = locate(p.string, p.string, p.integer)");
    }

    @Test
    public void testLocateHandling53() {
        /* 53 */assertValidQuery("SELECT p FROM Person p where 666 = locate(p.string, p.string, 3 * 2)");
    }

    @Test
    public void testLocateHandling54() {
        /* 54 */assertValidQuery("SELECT p FROM Person p where 666 = locate(?1, ?1, ?2)");
    }

    @Test
    public void testLocateHandling55() {
        /* 55 */assertValidQuery("SELECT p FROM Person p where 666 = locate(substring('a', 2, 3), upper('abs(2)'), abs(-2))");
    }

    @ToBeInvestigated
    @Test
    public void testLocateHandling56() {
        /* 56 */assertValidQuery("SELECT p FROM Person p where 666 = locate(max(p.string), min(p.string), max(p.integer))");
    }

    @Test
    public void testLocateHandling57() {
        /* 57 */assertValidQuery("SELECT p FROM Person p where 666 = locate((select max(p1.string) from Person p1), (select max(p1.string) from Person p1), (select max(p1.integer) from Person p1))");
    }

    @Test
    public void testLocateHandling58() {
        /* 58 */assertValidQuery("SELECT p FROM Person p where 666 = locate('a', 'b')");
    }

    @Test
    public void testAbsHandling59() {
        /* 59 */assertValidQuery("SELECT p FROM Person p where 666 = abs(5+10.3)");
    }

    @Test
    public void testAbsHandling60() {
        /* 60 */assertValidQuery("SELECT p FROM Person p where 666 = abs(666)");
    }

    @Test
    public void testAbsHandling61() {
        /* 61 */assertValidQuery("SELECT p FROM Person p where 666 = abs(p._float)");
    }

    @Test
    public void testAbsHandling62() {
        /* 62 */assertValidQuery("SELECT p FROM Person p where 666 = abs(p.integer)");
    }

    @ToBeInvestigated
    @Test
    public void testAbsHandling63() {
        /* 63 */assertInvalidQuery("SELECT p FROM Person p where 666 = abs(p.string)");
    }

    @Test
    public void testAbsHandling64() {
        /* 64 */assertValidQuery("SELECT p FROM Person p where abs((select max(p1.bigInteger) from Person p1)) = 666");
    }

    @ToBeInvestigated
    @Test
    public void testAbsHandling65() {
        /* 65 */assertValidQuery("SELECT p FROM Person p where abs(max(p._float)) = 666");
    }

    @Test
    public void testAbsHandling66() {
        /* 66 */assertValidQuery("SELECT p FROM Person p where abs(abs(p._float)) = 666");
    }

    @Test
    public void testAbsHandling67() {
        /* 67 */assertValidQuery("SELECT p FROM Person p where 666 = abs(?1)");
    }

    @ToBeInvestigated
    @Test
    public void testAbsHandling68() {
        /* 68 */assertInvalidQuery("SELECT p FROM Person p where 666 = abs(p)");
    }

    @Test
    public void testSqrtHandling69() {
        /* 69 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(5+10.3)");
    }

    @Test
    public void testSqrtHandling70() {
        /* 70 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(666)");
    }

    @Test
    public void testSqrtHandling71() {
        /* 71 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(p._float)");
    }

    @Test
    public void testSqrtHandling72() {
        /* 72 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(p.integer)");
    }

    @ToBeInvestigated
    @Test
    public void testSqrtHandling73() {
        /* 73 */assertInvalidQuery("SELECT p FROM Person p where 666 = sqrt(p.string)");
    }

    @Test
    public void testSqrtHandling74() {
        /* 74 */assertValidQuery("SELECT p FROM Person p where sqrt((select max(p1.bigInteger) from Person p1)) = 666");
    }

    @ToBeInvestigated
    @Test
    public void testSqrtHandling75() {
        /* 75 */assertValidQuery("SELECT p FROM Person p where sqrt(max(p._float)) = 666");
    }

    @Test
    public void testSqrtHandling76() {
        /* 76 */assertValidQuery("SELECT p FROM Person p where sqrt(sqrt(p._float)) = 666");
    }

    @Test
    public void testSqrtHandling77() {
        /* 77 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(?1)");
    }

    @Test
    public void testSqrtHandling78() {
        /* 78 */assertValidQuery("SELECT p FROM Person p where 666 = sqrt(?1)");
    }

    @Test
    public void testModHandling79() {
        /* 79 */assertValidQuery("SELECT p FROM Person p where 666 = mod(5+10,5+10)");
    }

    @Test
    public void testModHandling80() {
        /* 80 */assertValidQuery("SELECT p FROM Person p where 666 = mod(666, 666)");
    }

    @Test
    public void testModHandling81() {
        /* 81 */assertValidQuery("SELECT p FROM Person p where 666 = mod(p._float, p._float)");
    }

    @Test
    public void testModHandling82() {
        /* 82 */assertValidQuery("SELECT p FROM Person p where 666 = mod(p.integer, p.integer)");
    }

    @Test
    public void testModHandling83() {
        /* 83 */assertValidQuery("SELECT p FROM Person p where 666 = mod(p.string, p.string)");
    }

    @Test
    public void testModHandling84() {
        /* 84 */assertValidQuery("SELECT p FROM Person p where mod((select max(p1.bigInteger) from Person p1), (select max(p1.bigInteger) from Person p1)) = 666");
    }

    @ToBeInvestigated
    @Test
    public void testModHandling85() {
        /* 85 */assertValidQuery("SELECT p FROM Person p where mod(max(p.integer), max(p.integer)) = 666");
    }

    @Test
    public void testModHandling86() {
        /* 86 */assertValidQuery("SELECT p FROM Person p where mod(abs(p.integer), abs(p.integer)) = 666");
    }

    @Test
    public void testModHandling87() {
        /* 87 */assertValidQuery("SELECT p FROM Person p where 666 = mod(?1, ?1)");
    }

    @Test
    public void testModHandling88() {
        /* 88 */assertInvalidQuery("SELECT p FROM Person p where 666 = mod(p, p)");
    }

    @Test
    public void testSizeHandling89() {
        /* 89 */assertInvalidQuery("SELECT c FROM Cop c where 666 = size(c.partner)");
    }

    @Test
    public void testSizeHandling90() {
        /* 90 */assertValidQuery("SELECT c FROM Cop c where 666 = size(c.attachedCriminals)");
    }

    @Test
    public void testSizeHandling91() {
        /* 91 */assertValidQuery("SELECT c FROM Cop c where 666 = size(c.informers)");
    }

    @Test
    public void testSizeHandling92() {
        /* 92 */assertInvalidQuery("SELECT c FROM Cop c where 666 = size(c.id)");
    }

    @Test
    public void testSizeHandling93() {
        /* 93 */assertInvalidQuery("SELECT c FROM Cop c where 666 = size(c.tesla)");
    }

    @Test
    public void testSizeHandling94() {
        /* 94 */assertInvalidQuery("SELECT c FROM Cop c where 666 = size(c.tesla.integer)");
    }

}
