blob: a4a2d296467f651be22fe23f6fde0b0f13fe1bfd [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 complex.toolkit;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.sun.star.uno.UnoRuntime;
import static org.junit.Assert.*;
/**
* provides assertion capabilities not found in {@link org.junit.Assert}
* @author frank.schoenheit@oracle.com
*/
public class Assert
{
// --------------------------------------------------------------------------------------------------------
/** invokes a given method on a given object, and assures a certain exception is caught
* @param i_message
* is the message to print when the check fails
* @param i_object
* is the object to invoke the method on
* @param i_methodName
* is the name of the method to invoke
* @param i_methodArgs
* are the arguments to pass to the method.
* @param i_argClasses
* are the classes to assume for the arguments of the methods
* @param i_expectedExceptionClass
* is the class of the exception to be caught. If this is null,
* it means that <em>no</em> exception must be throw by invoking the method.
*/
public static void assertException( final String i_message, final Object i_object, final String i_methodName,
final Class[] i_argClasses, final Object[] i_methodArgs, final Class i_expectedExceptionClass )
{
Class objectClass = i_object.getClass();
boolean noExceptionAllowed = ( i_expectedExceptionClass == null );
boolean caughtExpected = noExceptionAllowed ? true : false;
try
{
Method method = impl_getMethod( objectClass, i_methodName, i_argClasses );
method.invoke(i_object, i_methodArgs );
}
catch ( NoSuchMethodException e )
{
StringBuilder message = new StringBuilder();
message.append( "no such method: " ).append( objectClass.getName() ).append( "." ).append( i_methodName ).append( "( " );
for ( int i=0; i<i_argClasses.length; ++i )
{
message.append( i_argClasses[i].getName() );
if ( i<i_argClasses.length - 1 )
message.append( ", " );
}
message.append( " )" );
fail( message.toString() );
}
catch ( InvocationTargetException e )
{
caughtExpected = noExceptionAllowed
? false
: ( e.getTargetException().getClass().equals( i_expectedExceptionClass ) );
}
catch( Exception e )
{
caughtExpected = false;
}
assertTrue( i_message, caughtExpected );
}
/**
* retrieves a method, given by name and parameter signature, from the given class
*
* The method does somewhat more than simply calling {@link Class.getMethod}. In particular, it recognizes
* primitiive parameter types, and attempts to find a method taking the given primitive type, instead of the
* type represented by the parameter class.
*
* For instance, if you have a method <code>foo( int )</code>, {@link Class.getMethod} would not return this
* method when you pass <code>Integer.class</code>. <code>impl_getMethod</code> will recognize this, and
* properly retrieve the method.
*
* Note: <code>impl_getMethod</code> is limited in that it will not try all possible combinations of primitive
* and non-primitive types. That is, a method like <code>foo( int, Integer, int )</code> is likely to not be
* found.
*
* @param i_obbjectClass
* @param i_methodName
* @param i_argClasses
* @return
*/
private static Method impl_getMethod( final Class i_objectClass, final String i_methodName, final Class[] i_argClasses ) throws NoSuchMethodException
{
try
{
return i_objectClass.getMethod( i_methodName, i_argClasses );
}
catch ( NoSuchMethodException ex )
{
}
int substitutedTypes = 0;
int substitutedTypesLastRound = 0;
final Class[][] substitutionTable = new Class[][] {
new Class[] { Long.class, long.class },
new Class[] { Integer.class, int.class },
new Class[] { Short.class, short.class },
new Class[] { Byte.class, byte.class },
new Class[] { Double.class, double.class },
new Class[] { Float.class, float.class },
new Class[] { Character.class, char.class }
};
do
{
substitutedTypes = 0;
final Class[] argClasses = new Class[ i_argClasses.length ];
for ( int i=0; i < argClasses.length; ++i )
{
argClasses[i] = i_argClasses[i];
if ( substitutedTypes > substitutedTypesLastRound )
continue;
for ( int c=0; c<substitutionTable.length; ++c )
{
if ( i_argClasses[i].equals( substitutionTable[c][0] ) )
{
argClasses[i] = substitutionTable[c][1];
++substitutedTypes;
break;
}
}
}
if ( substitutedTypes == substitutedTypesLastRound )
throw new NoSuchMethodException();
substitutedTypesLastRound = substitutedTypes;
try
{
return i_objectClass.getMethod( i_methodName, argClasses );
}
catch ( NoSuchMethodException e )
{
}
}
while ( substitutedTypes > 0 );
throw new NoSuchMethodException();
}
/** invokes a given method on a given object, and assures a certain exception is caught
* @param i_message is the message to print when the check fails
* @param i_object is the object to invoke the method on
* @param i_methodName is the name of the method to invoke
* @param i_methodArgs are the arguments to pass to the method. Those implicitly define
* the classes of the arguments of the method which is called.
* @param i_expectedExceptionClass is the class of the exception to be caught. If this is null,
* it means that <em>no</em> exception must be throw by invoking the method.
*/
public static void assertException( final String i_message, final Object i_object, final String i_methodName,
final Object[] i_methodArgs, final Class i_expectedExceptionClass )
{
Class[] argClasses = new Class[ i_methodArgs.length ];
for ( int i=0; i<i_methodArgs.length; ++i )
argClasses[i] = i_methodArgs[i].getClass();
assertException( i_message, i_object, i_methodName, argClasses, i_methodArgs, i_expectedExceptionClass );
}
/** invokes a given method on a given object, and assures a certain exception is caught
* @param i_object is the object to invoke the method on
* @param i_methodName is the name of the method to invoke
* @param i_methodArgs are the arguments to pass to the method. Those implicitly define
* the classes of the arguments of the method which is called.
* @param i_expectedExceptionClass is the class of the exception to be caught. If this is null,
* it means that <em>no</em> exception must be throw by invoking the method.
*/
public static void assertException( final Object i_object, final String i_methodName, final Object[] i_methodArgs,
final Class i_expectedExceptionClass )
{
assertException(
"did not catch the expected exception (" +
( ( i_expectedExceptionClass == null ) ? "none" : i_expectedExceptionClass.getName() ) +
") while calling " + i_object.getClass().getName() + "." + i_methodName,
i_object, i_methodName, i_methodArgs, i_expectedExceptionClass );
}
/** invokes a given method on a given object, and assures a certain exception is caught
* @param i_object is the object to invoke the method on
* @param i_methodName is the name of the method to invoke
* @param i_methodArgs are the arguments to pass to the method
* @param i_argClasses are the classes to assume for the arguments of the methods
* @param i_expectedExceptionClass is the class of the exception to be caught. If this is null,
* it means that <em>no</em> exception must be throw by invoking the method.
*/
public static void assertException( final Object i_object, final String i_methodName, final Class[] i_argClasses,
final Object[] i_methodArgs, final Class i_expectedExceptionClass )
{
assertException(
"did not catch the expected exception (" +
( ( i_expectedExceptionClass == null ) ? "none" : i_expectedExceptionClass.getName() ) +
") while calling " + i_object.getClass().getName() + "." + i_methodName,
i_object, i_methodName, i_argClasses, i_methodArgs, i_expectedExceptionClass );
}
// --------------------------------------------------------------------------------------------------------
public static void assertException( Object i_object, Class _unoInterfaceClass, String i_methodName, Object[] i_methodArgs,
Class i_expectedExceptionClass )
{
assertException( UnoRuntime.queryInterface( _unoInterfaceClass, i_object ), i_methodName,
i_methodArgs, i_expectedExceptionClass );
}
}