/*******************************************************************************
 * Copyright (c) 2005, 2009 SAP. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     SAP - initial API and implementation
 ******************************************************************************/

package org.eclipse.persistence.testing.tests.wdf.jpa1.query;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.eclipse.persistence.testing.framework.wdf.Bugzilla;
import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;

@SuppressWarnings("unchecked")
public class TestSetFunctions extends JPA1Base {

    private void verifyBigDecimal(EntityManager em, String txt, BigDecimal expected) {
        Query query = em.createQuery(txt);
        List result = query.getResultList();
        verify(result.size() == 1, "wrong resultcount");
        Iterator iter = result.iterator();
        verify(iter.hasNext(), "no row found");
        BigDecimal bigDecimal = (BigDecimal) iter.next();
        verify(bigDecimal.compareTo(expected) == 0, "wrong result: " + bigDecimal);
        verify(!iter.hasNext(), "too many rows found");
    }

    private void verifyDouble(EntityManager em, String txt, Double expected) {
        Query query = em.createQuery(txt);
        List result = query.getResultList();
        verify(result.size() == 1, "wrong resultcount");
        Iterator iter = result.iterator();
        verify(iter.hasNext(), "no row found");
        Double doubleValue = (Double) iter.next();
        verify(doubleValue.compareTo(expected) == 0, "wrong result: " + doubleValue);
        verify(!iter.hasNext(), "too many rows found");
    }

    @Override
    protected void setup() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            env.beginTransaction(em);
            em.persist(new Employee(1, "Ulla", "Schmidt", null, BigDecimal.valueOf(5000)));
            em.persist(new Employee(2, "Knut", "M\u00fcller", null, BigDecimal.valueOf(6000)));
            em.persist(new Employee(3, "Kuno", "Maier", null, BigDecimal.valueOf(10000)));
            env.commitTransactionAndClear(em);
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testSum() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select sum(e.salary) from Employee e", BigDecimal.valueOf(21000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testMin() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select min(e.salary) from Employee e", BigDecimal.valueOf(5000));
            verifyBigDecimal(em, "select min(e.salary) from Employee e where e.firstname like 'K%'", BigDecimal.valueOf(6000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testFindEmployeeWithMinimalSalary() {
        // TODO subqueries not finished yet
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            Query query = em
                    .createQuery("select e from Employee e where e.salary = (select min (e2.salary) from Employee e2) ");
            List result = query.getResultList();
            Iterator iterator = result.iterator();
            verify(iterator.hasNext(), "no row found");
            Employee first = (Employee) iterator.next();
            verify(first.getId() == 1, "wrong employee");
            verify(!iterator.hasNext(), "too many rows");
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testMax() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select max(e.salary) from Employee e", BigDecimal.valueOf(10000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testAverage() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyDouble(em, "select avg(e.salary) from Employee e", Double.valueOf(7000));
        } finally {
            closeEntityManager(em);
        }
    }
}
