/*******************************************************************************
 * 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(".");
	}
}
