/*
* Sonar XML Plugin
* Copyright (C) 2010 Matthijs Galesloot
* dev@sonar.codehaus.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sonar.plugins.xml.checks;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.sonar.api.profiles.RulesProfile;
import org.sonar.api.resources.File;
import org.sonar.api.rules.ActiveRule;
import org.sonar.api.rules.ActiveRuleParam;
import org.sonar.api.rules.AnnotationRuleParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.utils.SonarException;
import org.sonar.api.utils.ValidationMessages;
import org.sonar.plugins.xml.AbstractXmlPluginTester;
public abstract class AbstractCheckTester extends AbstractXmlPluginTester {
private static final String INCORRECT_NUMBER_OF_VIOLATIONS = "Incorrect number of violations";
private static final String repositoryKey = "Xml";
private void configureDefaultParams(AbstractPageCheck check, Rule rule) {
ValidationMessages validationMessages = ValidationMessages.create();
RulesProfile rulesProfile = getProfileDefinition().createProfile(validationMessages);
ActiveRule activeRule = rulesProfile.getActiveRule(rule);
assertNotNull("Could not find activeRule", activeRule);
try {
if (activeRule.getActiveRuleParams() != null) {
for (ActiveRuleParam param : activeRule.getActiveRuleParams()) {
Object value = PropertyUtils.getProperty(check, param.getRuleParam().getKey());
if (value instanceof Integer) {
value = Integer.parseInt(param.getValue());
} else {
value = param.getValue();
}
PropertyUtils.setProperty(check, param.getRuleParam().getKey(), value);
}
}
} catch (IllegalAccessException e) {
throw new SonarException(e);
} catch (InvocationTargetException e) {
throw new SonarException(e);
} catch (NoSuchMethodException e) {
throw new SonarException(e);
}
}
private Rule getRule(String ruleKey, Class<? extends AbstractPageCheck> checkClass) {
AnnotationRuleParser parser = new AnnotationRuleParser();
List<Rule> rules = parser.parse(repositoryKey, Arrays.asList(new Class[] { checkClass }));
for (Rule rule : rules) {
if (rule.getKey().equals(ruleKey)) {
return rule;
}
}
return null;
}
protected AbstractPageCheck instantiateCheck(Class<? extends AbstractPageCheck> checkClass, String... params) {
try {
AbstractPageCheck check = checkClass.newInstance();
Rule rule = getRule(checkClass.getSimpleName(), checkClass);
assertNotNull("Could not find rule", rule);
check.setRule(rule);
configureDefaultParams(check, rule);
for (int i = 0; i < params.length / 2; i++) {
BeanUtils.setProperty(check, params[i * 2], params[i * 2 + 1]);
assertNotNull(BeanUtils.getProperty(check, params[i * 2]));
}
return check;
} catch (IllegalAccessException e) {
throw new SonarException(e);
} catch (InstantiationException e) {
throw new SonarException(e);
} catch (InvocationTargetException e) {
throw new SonarException(e);
} catch (NoSuchMethodException e) {
throw new SonarException(e);
}
}
protected XmlSourceCode parseAndCheck(Reader reader, Class<? extends AbstractPageCheck> checkClass, String... params) {
return parseAndCheck(reader, null, null, checkClass, params);
}
protected XmlSourceCode parseAndCheck(Reader reader, java.io.File file, String code, Class<? extends AbstractPageCheck> checkClass,
String... params) {
AbstractPageCheck check = instantiateCheck(checkClass, params);
XmlSourceCode xmlSourceCode = new XmlSourceCode(new File(file == null ? "test" : file.getPath()), file);
xmlSourceCode.setCode(code);
check.validate(xmlSourceCode);
return xmlSourceCode;
}
protected void parseCheckAndAssert(String fragment, Class<? extends AbstractPageCheck> clazz, int numViolations, String... params) {
Reader reader = new StringReader(fragment);
XmlSourceCode sourceCode = parseAndCheck(reader, null, fragment, clazz, params);
assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, numViolations, sourceCode.getViolations().size());
}
}