/*******************************************************************************
 * Copyright (c) 2006 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:
 *     Matthew Webster - initial implementation
 *******************************************************************************/
package org.aspectj.weaver;

import java.util.ArrayList;

import junit.framework.TestCase;

import org.aspectj.weaver.tools.AbstractTrace;
import org.aspectj.weaver.tools.DefaultTrace;
import org.aspectj.weaver.tools.Traceable;

public abstract class AbstractTraceTest extends TestCase {

	protected AbstractTrace trace;

	public void testIsTraceEnabled() {
		DefaultTrace trace = new DefaultTrace(getClass());
		assertFalse(trace.isTraceEnabled());
	}

	public void testEnterWithThisAndArgs() {
		trace.enter("testEnterWithThisAndArgs",this,new Object[] { "arg1", "arg2" });
	}

	public void testEnterWithThisAndArray() {
		Object arg1 = new String[] { "s1", "s2" };
		Object arg2 = new char[] { 'a', 'b', 'c' };
		trace.enter(getName(),this,new Object[] { arg1, arg2 });
	}

	public void testEnterWithThisAndCollection() {
		Object arg1 = new ArrayList();
		trace.enter(getName(),this,new Object[] { arg1 });
	}

	public void testEnterWithThisAndTraceable () {
		Object arg1 = new Traceable() {

			public String toTraceString() {
				return getClass().getName() + "[Traceable]";
			}
			
		};
		trace.enter(getName(),this,new Object[] { arg1 });
	}

	public void testEnterWithThisAndToStringException () {
		Object arg1 = new Object() {

			public String toString() {
				throw new RuntimeException("toString() can throw an Exception");
			}
			
		};
		trace.enter(getName(),this,new Object[] { arg1 });
	}

	public void testEnterWithThisAndHashCodeException () {
		Object arg1 = new Object() {

			public int hashCode() {
				throw new RuntimeException("hashCode can throw an Exception");
			}
			
		};
		trace.enter(getName(),this,new Object[] { arg1 });
	}

	public void testEnterWithThisAndClassLoader () {
		Object arg1 = new ClassLoader() {

			public String toString() {
				throw new Error("Don't call ClassLoader.toString()");
			}
			
		};
		trace.enter(getName(),this,new Object[] { arg1 });
	}

	public void testEnterWithThis() {
		trace.enter("testEnterWithThis",this);
	}

	public void testEnter() {
		trace.enter("testEnter");
	}

	public void testExitWithReturn() {
		trace.exit("testExitWithReturn","ret");
	}

	public void testExitWithThrowable() {
		trace.exit("testExitWithThrowable",new RuntimeException());
	}

	public void testExit() {
		trace.exit("testExit");
	}

	public void testEvent() {
		trace.event("testEvent");
	}

	public void testEventWithThisAndArgs() {
		trace.event("testEventWithThisAndArgs",this,new Object[] { "arg1", "arg2" });
	}

	public void testEventWithThisAndArg() {
		trace.event("testEventWithThisAndArg",this,"arg1");
	}

	public void testDebug() {
		trace.debug("debug");
	}

	public void testInfo() {
		trace.info("information");
	}

	public void testWarn() {
		trace.warn("warning");
	}

	public void testWarnWithException() {
		trace.warn("warning",new RuntimeException("warning"));
	}

	public void testError() {
		trace.error("error");
	}

	public void testErrorWithException() {
		trace.error("error",new RuntimeException("error"));
	}

	public void testFatal() {
		trace.fatal("fatal");
	}

	public void testFatalWithException() {
		trace.fatal("fatal",new RuntimeException("fatal"));
	}

}
