blob: b735a57f8ac1f7f79640e2be9b12f8205e557b61 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 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.ui.tests.harness.util;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
* <code>CallHistory</code> is used to record the invocation
* of methods within a target object. This is useful during
* lifecycle testing for an object.
* <p>
* To use <code>CallHistory</code> ..
* <ol>
* <li>Create a CallHistory in the target or pass one in.</li>
* <li>Invoke some test scenario. </li>
* <li>If a method is called on the target record the invocation
* in the call history</li>
* <li>Verify the call history after the test scenario is
* complete.</li>
* </ol>
* </p><p>
* Each <code>CallHistory</code> has a target which is used to
* verify the method names passed to the history. If an invalid
* name is passed an <code>IllegalArgumentException</code> will
* be thrown.
* </p>
*/
public class CallHistory {
private ArrayList methodList;
private Class classType;
/**
* Creates a new call history for an object.
*
* @param target the call history target.
*/
public CallHistory(Object target) {
methodList = new ArrayList();
classType = target.getClass();
}
/**
* Throws an exception if the method name is invalid
* for the given target class.
*/
private void testMethodName(String methodName) {
Method[] methods = classType.getMethods();
for (int i = 0; i < methods.length; i++)
if (methods[i].getName().equals(methodName))
return;
throw new IllegalArgumentException("Target class ("
+ classType.getName() + ") does not contain method: "
+ methodName);
}
/**
* Adds a method name to the call history.
*
* @param methodName the name of a method
*/
public void add(String methodName) {
testMethodName(methodName);
methodList.add(methodName);
}
/**
* Clears the call history.
*/
public void clear() {
methodList.clear();
}
/**
* Returns whether a list of methods have been called in
* order.
*
* @param testNames an array of the method names in the order they are expected
* @return <code>true</code> if the methods were called in order
*/
public boolean verifyOrder(String[] testNames)
throws IllegalArgumentException {
int testIndex = 0;
int testLength = testNames.length;
if (testLength == 0)
return true;
for (int nX = 0; nX < methodList.size(); nX++) {
String methodName = (String) methodList.get(nX);
String testName = testNames[testIndex];
testMethodName(testName);
if (testName.equals(methodName))
++testIndex;
if (testIndex >= testLength)
return true;
}
return false;
}
/**
* Returns whether a method has been called.
*
* @param methodName a method name
* @return <code>true</code> if the method was called
*/
public boolean contains(String methodName) {
testMethodName(methodName);
return methodList.contains(methodName);
}
/**
* Returns whether a list of methods were called.
*
* @param methodNames a list of methods
* @return <code>true</code> if the methods were called
*/
public boolean contains(String[] methodNames) {
for (int i = 0; i < methodNames.length; i++) {
testMethodName(methodNames[i]);
if (!methodList.contains(methodNames[i]))
return false;
}
return true;
}
/**
* Returns whether the list of methods called is empty.
*
* @return <code>true</code> iff the list of methods is empty
*/
public boolean isEmpty() {
return methodList.isEmpty();
}
/**
* Prints the call history to the console.
*/
public void printToConsole() {
for (int i = 0; i < methodList.size(); i++)
System.out.println(methodList.get(i));
}
}