package test.beast.integration; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import org.junit.Test; import beast.core.BEASTObject; import beast.core.Description; import beast.core.Input; import beast.util.AddOnManager; import junit.framework.TestCase; public class DocumentationTest extends TestCase { { System.setProperty("beast.is.junit.testing", "true"); } /** * Check all plug-ins have a proper description so that * everything is at least moderately well documented. * */ @Test public void testDescriptions() { final List<String> pluginNames = AddOnManager.find(beast.core.BEASTObject.class, AddOnManager.IMPLEMENTATION_DIR); final List<String> undocumentedPlugins = new ArrayList<String>(); for (final String beastObjectName : pluginNames) { try { final Class<?> pluginClass = Class.forName(beastObjectName); final Annotation[] classAnnotations = pluginClass.getAnnotations(); boolean hasSatisfactoryDescription = false; for (final Annotation annotation : classAnnotations) { if (annotation instanceof Description) { final Description description = (Description) annotation; final String descriptionString = description.value(); if (isProperDocString(descriptionString)) { hasSatisfactoryDescription = true; } } } if (!hasSatisfactoryDescription) { undocumentedPlugins.add(beastObjectName); } } catch (Exception e) { } } assertTrue("No proper description for: " + undocumentedPlugins.toString(), undocumentedPlugins.size() == 0); } // testDescriptions /** * Check all inputs of plug-ins have a proper tip text, again * to facilitate proper documentation. * */ @Test public void testInputTipText() { final List<String> pluginNames = AddOnManager.find(beast.core.BEASTObject.class, AddOnManager.IMPLEMENTATION_DIR); final List<String> undocumentedInputs = new ArrayList<String>(); for (final String beastObjectName : pluginNames) { try { final BEASTObject beastObject = (BEASTObject) Class.forName(beastObjectName).newInstance(); final List<Input<?>> inputs = beastObject.listInputs(); for (final Input<?> input : inputs) { boolean hasSatisfactoryDescription = false; final String tipText = input.getTipText(); if (isProperDocString(tipText)) { hasSatisfactoryDescription = true; } if (!hasSatisfactoryDescription) { undocumentedInputs.add(beastObjectName + ":" + input.getName()); } } } catch (Exception e) { } } assertTrue("No proper input tip text (at least " + N_WORDS + " words and " + N_CHARS + " characters) for: " + undocumentedInputs.toString(), undocumentedInputs.size() == 0); } // testInputTipText /** * run DocMaker. This can pick up incorrectly initialised inputs of lists * and some other initialisation stuff * */ @Test public void test_DocMaker() throws Exception { // this code runs just fine stand alone, but not in ant. TODO: figure out why // String [] args = {"."}; // DocMaker b = new DocMaker(args); // b.generateDocs(); // // clean up // String [] files = new File(".").list(); // for (String fileName : files) { // if (fileName.endsWith(".html")) { // new File(fileName).delete(); // } // } } // test_DocMaker private final int N_WORDS = 4; private final int N_CHARS = 15; // description of at least 15 chars and at least 4 words is satisfactory?!? // TODO: needs a bit more smarts to prevent as df a hsf jasd;fajasdf boolean isProperDocString(final String str) { // check length if (str.length() < N_CHARS) { return false; } // count nr of words final String[] words = str.split("\\s+"); if (words.length < N_WORDS) { return false; } return true; } // isProperDocString } // class DocumentationTest