/*******************************************************************************
 * 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.relation;

import javax.persistence.EntityManager;

import org.eclipse.persistence.testing.framework.wdf.Bugzilla;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Cubicle;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.CubiclePrimaryKeyClass;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Department;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Office;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.UniqueColorOffice;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;

public class TestMap extends JPA1Base {

    @Test
    @Bugzilla(bugid=300485)
    public void testEmptyOffice() {
        final Integer officeId = Integer.valueOf(1);
        final EntityManager em = getEnvironment().getEntityManager();
        try {
            getEnvironment().beginTransaction(em);
            final Office office = new Office();
            office.setId(officeId.intValue());
            office.setCapacity(10);
            em.persist(office);
            getEnvironment().commitTransactionAndClear(em);
            getEnvironment().beginTransaction(em);
            final Office storedOffice = em.find(Office.class, officeId);
            verify(storedOffice != null, "office not stored");
            verify(storedOffice.getCapacity() == 10L, "wrong capacity: " + storedOffice.getCapacity());
            verify(storedOffice.isCapacityValid(), "invalid capacity");
            getEnvironment().commitTransactionAndClear(em);
            for (final Employee employee : storedOffice.getOccupants()) {
                verify(false, "Strangers in cubicles: " + employee.getLastName());
            }
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    @Bugzilla(bugid=300485)
    public void testOffice() {
        final Integer officeId = Integer.valueOf(2);
        final EntityManager em = getEnvironment().getEntityManager();
        try {
            getEnvironment().beginTransaction(em);
            final Office office = new Office();
            office.setId(officeId.intValue());
            office.setCapacity(10);
            em.persist(office);
            final Department department = new Department(1, "R&D");
            em.persist(department);
            for (int floor = 0; floor < 3; floor++) {
                for (int place = 10; place < 13; place++) {
                    final Employee employee = new Employee(floor * 3 + place, "first", "last", department);
                    em.persist(employee);
                    final Cubicle cubicle = new Cubicle(Integer.valueOf(floor), Integer.valueOf(place), "green", employee);
                    employee.setCubicle(cubicle);
                    em.persist(cubicle);
                    office.addCubicle(cubicle);
                }
            }
            getEnvironment().commitTransactionAndClear(em);
            getEnvironment().beginTransaction(em);
            final Office storedOffice = em.find(Office.class, officeId);
            verify(storedOffice.isCapacityValid(), "invalid capacity");
            verify(storedOffice.getCubicles().size() == 9, "Wrong number of cubicles: " + storedOffice.getCubicles().size()
                    + " (expected: " + office.getCubicles().size() + ").");
            for (final Employee employee : storedOffice.getOccupants()) {
                verify(10 <= employee.getId() && employee.getId() < 20, "Strangers in cubicles");
            }
            for (int place = 10; place < 13; place++) {
                final CubiclePrimaryKeyClass testKey = new CubiclePrimaryKeyClass(Integer.valueOf(2), Integer.valueOf(place));
                final Cubicle cubicle = storedOffice.getCubicles().get(testKey);
                final Employee employee = cubicle.getEmployee();
                verify(employee.getId() == place + 6, "Wrong occupant of cubicle with id (floor: " + cubicle.getFloor()
                        + ", place: " + cubicle.getPlace() + ").");
            }
            getEnvironment().commitTransactionAndClear(em);
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testColorOffice() {
        final String[] colors = new String[] { "red", "green", "blue" };
        final Integer officeId = Integer.valueOf(3);
        final EntityManager em = getEnvironment().getEntityManager();
        try {
            getEnvironment().beginTransaction(em);
            final UniqueColorOffice office = new UniqueColorOffice();
            office.setId(officeId.intValue());
            office.setCapacity(5);
            em.persist(office);
            final Department department = new Department(2, "HR");
            em.persist(department);
            for (int i = 0; i < colors.length; i++) {
                final int floor = 10 + i;
                final int place = i;
                final int emplyoeeId = 100 + i;
                final Employee employee = new Employee(emplyoeeId, "first", "last", department);
                em.persist(employee);
                final Cubicle cubicle = new Cubicle(Integer.valueOf(floor), Integer.valueOf(place), colors[i], employee);
                employee.setCubicle(cubicle);
                em.persist(cubicle);
                office.addCubicle(cubicle);
            }
            getEnvironment().commitTransactionAndClear(em);
            getEnvironment().beginTransaction(em);
            final UniqueColorOffice storedOffice = em.find(UniqueColorOffice.class, officeId);
            verify(storedOffice.getCubicles().size() == colors.length, "Wrong number of cubicles: "
                    + storedOffice.getCubicles().size() + " (expected: " + office.getCubicles().size() + ").");
            for (final Employee employee : storedOffice.getOccupants()) {
                verify(100 <= employee.getId() && employee.getId() < 100 + colors.length, "Strangers in cubicles");
            }
            for (final String color : colors) {
                final Cubicle cubicle = storedOffice.getCubicles().get(color);
                verify(cubicle != null, getEnvironment() + ": no cubicle with color " + color + " found.");
                final Employee employee = cubicle.getEmployee();
                verify(color.equals(colors[employee.getId() - 100]), "Wrong occupant of cubicle with color " + color + ".");
            }
            storedOffice.getCubicles().remove(colors[0]);
            getEnvironment().commitTransactionAndClear(em);
            getEnvironment().beginTransaction(em);
            final UniqueColorOffice officeWithoutRedCubicle = em.find(UniqueColorOffice.class, officeId);
            verify(!officeWithoutRedCubicle.getCubicles().containsKey(colors[0]), "didnt remove " + colors[0] + " cubicle");
            for (int i = 1; i < colors.length; i++) {
                final String color = colors[i];
                final Cubicle cubicle = officeWithoutRedCubicle.getCubicles().get(color);
                verify(cubicle != null, getEnvironment() + ": no cubicle with color " + color + " found.");
                final Employee employee = cubicle.getEmployee();
                verify(color.equals(colors[employee.getId() - 100]), "Wrong occupant of cubicle with color " + color + ".");
            }
            getEnvironment().commitTransactionAndClear(em);
        } finally {
            closeEntityManager(em);
        }
    }
}
