blob: 684df9873d77e57cc1e4cdca346a3776d677f86c [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 2001-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.MissingResourceException;
import com.ibm.icu.dev.test.TestDataModule.DataMap;
import com.ibm.icu.dev.test.TestDataModule.DataModuleFormatError;
import com.ibm.icu.dev.test.TestDataModule.Factory;
import com.ibm.icu.dev.test.TestDataModule.TestData;
/**
* Ray: An adapter class for TestDataMoule to make it like TestFmwk
*
* A convenience extension of TestFmwk for use by data module-driven tests.
*
* Tests can implement this if they make extensive use of information in a
* TestDataModule.
*
* Subclasses can allow for test methods that don't use data from the module by
* overriding validateMethod to return true for these methods. Tests are also
* free to instantiate their own modules and run from them, though care should
* be taken not to interfere with the methods in this class.
*
* See CollationTest for an example.
*/
public abstract class ModuleTest extends TestFmwk {
private TestDataModule m;
protected TestData t = null;
private String localeName = null;
private String baseName = null;
abstract protected void processModules();
protected ModuleTest(String baseName, String locName) {
localeName = locName;
this.baseName = baseName;
}
protected Target getTargets(String targetName) {
if (params.doMethods()) {
Target target = null;
if (!validate()) {
return null;
}
Iterator testData = m.getTestDataIterator();
if (testData != null) {
try {
Method method = getClass()
.getMethod("processModules", (Class[])null);
while (testData.hasNext()) {
target = new MethodTarget(((TestData) testData.next())
.getName(), method).setNext(target);
}
} catch (Exception e) {
e.printStackTrace();
throw new IllegalStateException(e.getMessage());
}
}
return target;
} else {
return null;
}
}
/**
*
* TestFmwk calls this before trying to run a suite of tests. The test suite
* if valid if a module whose name is the name of this class + "Data" can be
* opened. Subclasses can override this if there are different or additional
* data required.
*/
protected boolean validate() {
try {
m = Factory.get(baseName, localeName);
} catch (DataModuleFormatError e) {
e.printStackTrace();
m = null;
} catch(MissingResourceException e){
warnln("Could not load data: "+e.getMessage());
}
return m != null;
}
/**
* TestFmwk calls this before trying to invoke a test method. The method is
* valid if there is test data with the name of this method in the module.
* Subclasses can override this to allow for tests that do not require test
* data from the module, or if there are different or additional data
* required.
*/
protected boolean validateMethod(String methodName) {
return openTestData(methodName);
}
/**
* Override of TestFmwk method to get the test suite description from the
* DESCRIPTION field of the module info.
*/
protected String getDescription() {
DataMap info = moduleInfo();
if (info != null) {
// return info.getString(TestDataModule.DESCRIPTION);
}
return null;
}
/**
* Override of TestFmwk method to get the test method description from the
* DESCRIPTION field of the test info.
*/
protected String getMethodDescription(String methodName) {
if (openTestData(methodName)) {
DataMap info = testInfo();
if (info != null) {
// return info.getString(TestDataModule.DESCRIPTION);
}
}
return null;
}
/**
* Open the test data in the module with the given name, and return true if
* success. The current test is reset.
*
* @throws DataModuleFormatError
*/
protected boolean openTestData(String name) {
try {
t = m == null ? null : m.getTestData(name);
} catch (DataModuleFormatError e) {
return false;
}
return t != null;
}
/**
* Get information on this module. Returns null if no module open or no info
* for the module.
*/
private DataMap moduleInfo() {
return m == null ? null : m.getInfo();
}
/**
* Get information on this test. Returns null if no module open or no test
* open or not info for this test.
*/
private DataMap testInfo() {
return t == null ? null : t.getInfo();
}
public void msg(String message, int level, boolean incCount, boolean newln) {
if (level == ERR && t != null) {
//t.stopIteration();
}
super.msg(message, level, incCount, newln);
}
}