/*******************************************************************************
 * Copyright (c) 1998, 2013 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 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:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.workbenchintegration;

import java.util.Iterator;
import java.util.Vector;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;


/**
 * bug: 5677655
 * Used to compare the order of queries contained in the DescriptorQueryManager so that 
 * XML files written out the same as they were read in wrt query order.  
 */
public class ProjectXMLQueryManagerQueryOrderTest extends AutoVerifyTestCase {
    Vector original, current; //list of queries to compare

    public ProjectXMLQueryManagerQueryOrderTest() {
    }

    public void test() {
        original = current = null;

        Project initialProj = (new EmployeeWorkbenchIntegrationSystem()).getInitialProject();
        ClassDescriptor initialDescriptor = 
            initialProj.getDescriptor(org.eclipse.persistence.testing.models.employee.domain.Employee.class);

        Project readinProj = this.getSession().getProject();
        ClassDescriptor currentDescriptor = 
            readinProj.getDescriptor(org.eclipse.persistence.testing.models.employee.domain.Employee.class);
        original = initialDescriptor.getDescriptorQueryManager().getAllQueries();
        current = currentDescriptor.getDescriptorQueryManager().getAllQueries();
    }


    protected void verify() {
        if (original.size() != current.size()) {
            throw new TestErrorException("The number of queries read was not equal to the number originally.");
        }

        Iterator orig = original.iterator();
        Iterator curr = current.iterator();
        while (orig.hasNext()) {
            DatabaseQuery origQuery = (DatabaseQuery)orig.next();
            int argumentTypesSize = 0;
            if (origQuery.getArguments() != null) {
                argumentTypesSize = origQuery.getArguments().size();
            }
            Vector argumentTypes = new Vector();
            for (int i = 0; i < argumentTypesSize; i++) {
                argumentTypes.addElement(origQuery.getArgumentTypeNames().get(i));
            }

            DatabaseQuery currentQuery = (DatabaseQuery)curr.next();
            if ((origQuery.getName() != currentQuery.getName()) && 
                ((origQuery.getName() == null) || !origQuery.getName().equals(currentQuery.getName())))
                if (!argumentTypes.equals(currentQuery.getArgumentTypeNames())) {
                    throw new TestErrorException("A query in the descriptor query manager does not match the original based on arguments");
                }
        }
    }
}
