/*******************************************************************************
 * Copyright (c) 2004, 2012 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Markus Schorn (Wind River Systems)
 *******************************************************************************/

/*
 * Created on Nov 1, 2004
 */
package org.eclipse.cdt.core.tests;

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

/**
 * Wraps a test case to check for its failure.
 * @author aniefer
 */
public class FailingTest extends TestCase {
	private TestCase test = null;
	private int bugNum = -1;

	public FailingTest(TestCase test, int bugNumber) {
		this.test = test;
		this.bugNum = bugNumber;
		String name = "Failing " + test.getName();
		if (bugNum > 0) {
			name += " [bug " + bugNum + "]";
		}
		setName(name);
	}

	public FailingTest(TestCase test) {
		this(test, -1);
	}

	/* (non-Javadoc)
	 * @see junit.framework.Test#run(junit.framework.TestResult)
	 */
	@Override
	public void run(TestResult result) {
		result.startTest(this);

		TestResult r = new TestResult();
		test.run(r);
		if (r.failureCount() == 1) {
			TestFailure failure = r.failures().nextElement();
			String msg = failure.exceptionMessage();
			if (msg != null && msg.startsWith("Method \"" + test.getName() + "\"")) {
				result.addFailure(this, new AssertionFailedError(msg));
			}
		} else if (r.errorCount() == 0 && r.failureCount() == 0) {
			String err = "Unexpected success"; //$NON-NLS-1$
			if (bugNum != -1)
				err += ", bug #" + bugNum; //$NON-NLS-1$
			result.addFailure(this, new AssertionFailedError(err));
		}

		result.endTest(this);
	}
}
