/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.InputStream;
import java.util.Properties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import net.sourceforge.pmd.ant.SourceLanguage;
import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.util.ResourceLoader;
/**
* Base test class for {@link LanguageVersion} implementations. <br>
* Each language implementation should subclass this and provide a data method.
*
* <pre>
* @Parameters
* public static Collection<Object[]> data() {
* return Arrays.asList(new Object[][] {
* { MyLanguageModule.NAME, MyLanguageModule.TERSE_NAME, "1.1",
* LanguageRegistry.getLanguage(MyLanguageModule.NAME).getVersion("1.1") },
* { MyLanguageModule.NAME, MyLanguageModule.TERSE_NAME, "1.2",
* LanguageRegistry.getLanguage(MyLanguageModule.NAME).getVersion("1.2") },
*
* // doesn't exist
* { MyLanguageModule.NAME, MyLanguageModule.TERSE_NAME, "1.3",
* null }
* });
* </pre>
*
* <p>For the parameters, see the constructor
* {@link #AbstractLanguageVersionTest(String, String, String, LanguageVersion)}.</p>
*/
@RunWith(Parameterized.class)
public class AbstractLanguageVersionTest {
private String name;
private String version;
private String simpleTerseName;
private String terseName;
private LanguageVersion expected;
/**
* Creates a new {@link AbstractLanguageVersionTest}
*
* @param name
* the name under which the language module is registered
* @param terseName
* the terse name under which the language module is registered
* @param version
* the specific version of the language version
* @param expected
* the expected {@link LanguageVersion} instance
*/
public AbstractLanguageVersionTest(String name, String terseName, String version, LanguageVersion expected) {
this.name = name;
this.version = version;
this.simpleTerseName = terseName;
this.terseName = terseName;
if (version != null && !version.isEmpty()) {
this.terseName += " " + version;
}
this.expected = expected;
}
/**
* Checks that the expected {@link LanguageVersion} can be found by the
* combination of {@link #terseName} and {@link #version}.
*/
@Test
public void testGetLanguageVersionForTerseName() {
assertEquals(expected, LanguageRegistry.findLanguageVersionByTerseName(terseName));
}
/**
* Checks that the expected {@link LanguageVersion} can be found via
* {@link #name} and {@link #version}.
*/
@Test
public void testFindVersionsForLanguageNameAndVersion() {
SourceLanguage sourceLanguage = new SourceLanguage();
sourceLanguage.setName(name);
sourceLanguage.setVersion(version);
Language language = LanguageRegistry.getLanguage(sourceLanguage.getName());
LanguageVersion languageVersion = null;
if (language != null) {
languageVersion = language.getVersion(sourceLanguage.getVersion());
}
assertEquals(expected, languageVersion);
}
/**
* Makes sure, that for each language a "rulesets.properties" file exists.
*
* @throws Exception
* any error
*/
@Test
public void testRegisteredRulesets() throws Exception {
// only check for languages, that support rules
if (expected == null || expected.getLanguage().getRuleChainVisitorClass() == null) {
return;
}
Properties props = new Properties();
String rulesetsProperties = "rulesets/" + simpleTerseName + "/rulesets.properties";
try (InputStream inputStream = ResourceLoader.loadResourceAsStream(rulesetsProperties);) {
props.load(inputStream);
}
String rulesetFilenames = props.getProperty("rulesets.filenames");
assertNotNull(rulesetFilenames);
RuleSetFactory factory = new RuleSetFactory();
if (rulesetFilenames.trim().isEmpty()) {
return;
}
String[] rulesets = rulesetFilenames.split(",");
for (String r : rulesets) {
InputStream stream = ResourceLoader.loadResourceAsStream(r);
assertNotNull(stream);
stream.close();
RuleSet ruleset = factory.createRuleSet(r);
assertNotNull(ruleset);
}
}
}