/*******************************************************************************
 * Copyright (c) 2004, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.autotests;

import java.net.URL;

import junit.framework.TestResult;
import junit.framework.TestSuite;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.tests.TestPlugin;

/**
 * @since 3.1
 */
public class AutoTestSuite extends TestSuite {
    private AutoTestLogger logger;
    
    public AutoTestSuite(URL expectedResults) {
        if (expectedResults == null) {
            logger = new AutoTestLogger();
        } else {
            try {
                logger = new AutoTestLogger(expectedResults);
            } catch (WorkbenchException e) {
                logger = new AutoTestLogger();
                e.printStackTrace();
            }
        }
    }
    
    protected AutoTestLogger getLog() {
        return logger;
    }
    
    public void addWrapper(AutoTest test) {
        addTest(new AutoTestWrapper(test, logger));
    }
    
    /* (non-Javadoc)
     * @see junit.framework.TestSuite#run(junit.framework.TestResult)
     */
    public void run(TestResult result) {
        super.run(result);

        IPath statePath = Platform.getStateLocation(TestPlugin.getDefault().getBundle());
        
        String testName = this.getName();
        if (testName == null) {
            testName = this.getClass().getName();
        }
        
        if (!logger.getErrors().isEmpty()) {
            IPath errorsPath = statePath.append(testName).append("errors.xml");
            
            System.out.println("Errors detected. Results written to " + errorsPath.toString());

            XMLMemento output = XMLMemento.createWriteRoot("errors");
            logger.getErrors().saveState(output);
            try {
                XmlUtil.write(errorsPath.toFile(), output);
            } catch (WorkbenchException e) {
                e.printStackTrace();
            }
        }
        
        if (!logger.getUnknownTests().isEmpty()) {

            IPath unknownPath = statePath.append(testName).append("newtests.xml");
            
            System.out.println("New tests detected. Results written to " + unknownPath.toString());

            XMLMemento output = XMLMemento.createWriteRoot("unknown");
            logger.getUnknownTests().saveState(output);
            try {
                XmlUtil.write(unknownPath.toFile(), output);
            } catch (WorkbenchException e) {
                e.printStackTrace();
            }
        }
    }
    
    private int findInArray(String[] hayStack, String needle) {
        for (int i = 0; i < hayStack.length; i++) {
            String next = hayStack[i];
            if (next.equals(needle)) {
                return i;
            }
        }
        
        return hayStack.length;
    }
}
