package test.beast.integration; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Test; import beast.core.BEASTObject; import beast.core.Input; import beast.util.AddOnManager; import beast.util.XMLParser; import junit.framework.TestCase; public class XMLElementNameTest extends TestCase { /** * test that Inputs have a unique name * It can happen that a derived class uses the same Input name as one of its ancestors */ @Test public void test_NameUniqueness() { List<String> pluginNames = AddOnManager.find(beast.core.BEASTObject.class, AddOnManager.IMPLEMENTATION_DIR); List<String> improperInputs = new ArrayList<String>(); for (String beastObjectName : pluginNames) { try { BEASTObject beastObject = (BEASTObject) Class.forName(beastObjectName).newInstance(); List<Input<?>> inputs = beastObject.listInputs(); Set<String> names = new HashSet<String>(); for (Input<?> input : inputs) { String name = input.getName(); if (names.contains(name)) { improperInputs.add(beastObjectName + "." + name); break; } names.add(name); } } catch (InstantiationException e) { // ignore } catch (Exception e) { // ignore } } if (improperInputs.size() > 0) { String str = improperInputs.toString(); str = str.replaceAll(",", "\n"); System.err.println("Input names are not unique:\n" + str); } // not activated till problem with naming is solved assertTrue("Input names are not unique: " + improperInputs.toString(), improperInputs.size() == 0); } /** * test that Inputs that use reserved names have the correct type * */ @Test public void test_ReservedElementNames() { // retrieve list of reserved names and their classes XMLParser parser = new XMLParser(); HashMap<String, String> element2ClassMap = parser.getElement2ClassMap(); // allow 'parameter' for any of the various parameter derivatives, not just RealParameter element2ClassMap.put("parameter", "beast.core.parameter.Parameter"); // check each beastObject List<String> pluginNames = AddOnManager.find(beast.core.BEASTObject.class, AddOnManager.IMPLEMENTATION_DIR); List<String> improperInputs = new ArrayList<String>(); for (String beastObjectName : pluginNames) { try { BEASTObject beastObject = (BEASTObject) Class.forName(beastObjectName).newInstance(); // check each input List<Input<?>> inputs = beastObject.listInputs(); for (Input<?> input : inputs) { if (element2ClassMap.containsKey(input.getName())) { if (beastObject.getClass() == null) { input.determineClass(beastObject); } Class<?> type = input.getType(); String baseType = element2ClassMap.get(input.getName()); if (!isDerivedType(type, baseType)) { improperInputs.add(beastObjectName + "." + input.getName()); } } } } catch (InstantiationException e) { // ignore } catch (Exception e) { // ignore } } if (improperInputs.size() > 0) { String str = improperInputs.toString(); str = str.replaceAll(",", "\n"); System.err.println("Reserved element names used for wrong types in:\n" + str); } // not activated till problem with naming is solved assertTrue("Reserved element names used for wrong types in: " + improperInputs.toString(), improperInputs.size() == 0); } /** * true if type is a class equal to or derived from baseType * */ boolean isDerivedType(Class<?> type, String baseType) { if (baseType.equals(type.getName())) { return true; } Class<?> superType = type.getSuperclass(); if (!superType.equals(Object.class)) { return isDerivedType(superType, baseType); } return false; } } // class XMLElementNameTest