/*******************************************************************************
 * Copyright (c) 2000, 2012 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.debug.jdi.tests;

import java.util.Enumeration;

import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestFailure;
import junit.framework.TestResult;

/**
 * Tests a <code>TestResult</code>
 */
public class TextTestResult extends TestResult {

	/**
	 * @see junit.framework.TestResult#addError(junit.framework.Test, java.lang.Throwable)
	 */
	@Override
	public synchronized void addError(Test test, Throwable t) {
		super.addError(test, t);
		System.out.println("E");
	}
	/**
	 * @see junit.framework.TestResult#addFailure(junit.framework.Test, junit.framework.AssertionFailedError)
	 */
	@Override
	public synchronized void addFailure(Test test, AssertionFailedError t) {
		super.addFailure(test, t);
		System.out.print("F");
	}
	/**
	 * Prints failures to the standard output
	 */
	public synchronized void print() {
		printHeader();
		printErrors();
		printFailures();
	}
	/**
	 * Prints the errors to the standard output
	 */
	public void printErrors() {
		if (errorCount() != 0) {
			if (errorCount() == 1)
				System.out.println("There was " + errorCount() + " error:");
			else
				System.out.println("There were " + errorCount() + " errors:");

			int i = 1;
			for (Enumeration<?> e = errors(); e.hasMoreElements(); i++) {
				TestFailure failure = (TestFailure) e.nextElement();
				System.out.println(i + ") " + failure.failedTest());
				failure.thrownException().printStackTrace();
				System.out.println();
			}
		}
	}
	/**
	 * Prints failures to the standard output
	 */
	public void printFailures() {
		if (failureCount() != 0) {
			if (failureCount() == 1)
				System.out.println("There was " + failureCount() + " failure:");
			else
				System.out.println(
					"There were " + failureCount() + " failures:");

			int i = 1;
			for (Enumeration<?> e = failures(); e.hasMoreElements(); i++) {
				TestFailure failure = (TestFailure) e.nextElement();
				System.out.print(i + ") " + failure.failedTest());
				Throwable t = failure.thrownException();
				if (t.getMessage() != null)
					System.out.println(" \"" + t.getMessage() + "\"");
				else {
					System.out.println();
					failure.thrownException().printStackTrace();
				}
			}
		}
	}
	/**
	 * Prints the header of the report
	 */
	public void printHeader() {
		if (wasSuccessful()) {
			System.out.println();
			System.out.print("OK");
			System.out.println(" (" + runCount() + " tests)");

		} else {
			System.out.println();
			System.out.println("!!!FAILURES!!!");
			System.out.println("Test Results:");
			System.out.println(
				"Run: "
					+ runCount()
					+ " Failures: "
					+ failureCount()
					+ " Errors: "
					+ errorCount());
		}
	}
	/**
	 * @see junit.framework.TestResult#startTest(junit.framework.Test)
	 */
	@Override
	public synchronized void startTest(Test test) {
		super.startTest(test);
		System.out.print(".");
	}
}
