/*
 * Copyright 2002-2006 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.parsing;

import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.easymock.MockControl;
import org.easymock.AbstractMatcher;
import org.springframework.core.io.AbstractResource;
import org.springframework.test.AssertThrows;

import java.io.InputStream;

/**
 * Unit tests for the {@link FailFastProblemReporter} class.
 *
 * @author Rick Evans
 */
public final class FailFastProblemReporterTests extends TestCase {

	public void testError() throws Exception {
		new AssertThrows(BeanDefinitionParsingException.class) {
			public void test() throws Exception {
				FailFastProblemReporter reporter = new FailFastProblemReporter();
				reporter.error(new Problem("VGER", new ParseState(),
						new IllegalArgumentException(),
						new Location(new NullResource("here"), null)));
			}
		}.runTest();
	}

	public void testWarn() throws Exception {
		IllegalArgumentException rootCause = new IllegalArgumentException();
		Problem problem = new Problem("VGER", new ParseState(),
				rootCause, new Location(new NullResource("here"), null));

		MockControl mockLog = MockControl.createControl(Log.class);
		Log log = (Log) mockLog.getMock();
		log.isWarnEnabled();
		mockLog.setReturnValue(true);
		log.warn(null, rootCause);
		mockLog.setMatcher(new AbstractMatcher() {
			public boolean matches(Object[] expected, Object[] actual) {
				Assert.assertEquals(2, actual.length);
				Assert.assertTrue(actual[1] instanceof IllegalArgumentException);
				return true;
			}
		});
		mockLog.replay();

		FailFastProblemReporter reporter = new FailFastProblemReporter();
		reporter.setLogger(log);
		reporter.warning(problem);

		mockLog.verify();
	}


	private static final class NullResource extends AbstractResource {

		private String description;


		public NullResource(String description) {
			this.description = description;
		}


		public String getDescription() {
			return this.description;
		}

		public InputStream getInputStream() {
			throw new UnsupportedOperationException();
		}

	}

}

@@ -790,27 +790,31 @@
 asymock.
-MockControl
+AbstractMatcher
 ;%0Aimport
@@ -827,32 +827,29 @@
 asymock.
-AbstractMatcher;
+MockControl;%0A
 %0Aimport 
@@ -876,24 +876,27 @@
 core.io.
-Abstract
+Descriptive
 Resource
@@ -948,126 +948,60 @@
 s;%0A%0A
-import java.io.InputStream;%0A%0A/**%0A * Unit tests for the %7B@link FailFastProblemReporter%7D class.%0A *%0A * @author Rick Evans
+/**%0A * @author Rick Evans%0A * @author Juergen Hoeller
 %0A */
@@ -1322,35 +1322,64 @@
 %22VGER%22, new 
-ParseState(
+Location(new DescriptiveResource(%22here%22)
 ),%0A%09%09%09%09%09%09new
@@ -1371,24 +1371,30 @@
 e%22)),%0A%09%09%09%09%09%09
+null, 
 new IllegalA
@@ -1415,60 +1415,8 @@
 on()
-,%0A%09%09%09%09%09%09new Location(new NullResource(%22here%22), null)
 ));%0A
@@ -1596,41 +1596,8 @@
 ER%22,
- new ParseState(),%0A%09%09%09%09rootCause,
  new
@@ -1610,20 +1610,27 @@
 ion(new 
-Null
+Descriptive
 Resource
@@ -1641,14 +1641,50 @@
 re%22)
-, null
+),%0A%09%09%09%09null, new IllegalArgumentException(
 ));%0A
@@ -2291,356 +2291,6 @@
 %09%7D%0A%0A
-%0A%09private static final class NullResource extends AbstractResource %7B%0A%0A%09%09private String description;%0A%0A%0A%09%09public NullResource(String description) %7B%0A%09%09%09this.description = description;%0A%09%09%7D%0A%0A%0A%09%09public String getDescription() %7B%0A%09%09%09return this.description;%0A%09%09%7D%0A%0A%09%09public InputStream getInputStream() %7B%0A%09%09%09throw new UnsupportedOperationException();%0A%09%09%7D%0A%0A%09%7D%0A%0A
 %7D%0A

use DescriptiveResource instead of custom NullResource