package husaccttest.validate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import husacct.validate.ValidateServiceImpl;
import husacct.validate.domain.configuration.ActiveRuleType;
import husacct.validate.domain.configuration.ActiveViolationType;
import husacct.validate.domain.validation.Severity;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import junit.framework.AssertionFailedError;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.DOMBuilder;
import org.junit.Before;
import org.junit.Test;
import org.xml.sax.SAXException;
public class ImportExportWorkspaceTest {
private ValidateServiceImpl validate;
@Before
public void setup() {
validate = new ValidateServiceImpl();
}
@Test
public void testExportingAndImporting() throws URISyntaxException, ParserConfigurationException, SAXException, IOException, DatatypeConfigurationException {
testImporting();
checkSeveritiesTheSameAsSeveritiesElement(validate.getConfiguration()
.getAllSeverities(), validate.getWorkspaceData().getChild("severities"));
checkSeveritiesPerTypesPerProgrammingLanguagesTheSameAsSeveritiesPerTypesPerProgrammingLanguagesElement(
validate.getConfiguration().getAllSeveritiesPerTypesPerProgrammingLanguages(),
validate.getWorkspaceData().getChild("severitiesPerTypesPerProgrammingLanguages"));
checkActiveViolationTypesTheSameAsActiveViolationTypesElement(validate
.getConfiguration().getActiveViolationTypes(), validate.getWorkspaceData().getChild("activeViolationTypes"));
}
private void testImporting() throws URISyntaxException, ParserConfigurationException, SAXException, IOException, DatatypeConfigurationException {
ClassLoader.getSystemResource("husaccttest/validate/Testfile_ImportExportTest.xml").toURI();
DocumentBuilderFactory domfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dombuilder = domfactory.newDocumentBuilder();
File file = new File(ClassLoader.getSystemResource("husaccttest/validate/Testfile_ImportExportTest.xml").toURI());
DOMBuilder domBuilder = new DOMBuilder();
Document document = domBuilder.build(dombuilder.parse(file));
validate.loadWorkspaceData(document.getRootElement());
checkSeveritiesTheSameAsSeveritiesElement(validate.getConfiguration().getAllSeverities(),document.getRootElement().getChild("severities"));
checkSeveritiesPerTypesPerProgrammingLanguagesTheSameAsSeveritiesPerTypesPerProgrammingLanguagesElement(
validate.getConfiguration().getAllSeveritiesPerTypesPerProgrammingLanguages(),
document.getRootElement().getChild("severitiesPerTypesPerProgrammingLanguages"));
checkActiveViolationTypesTheSameAsActiveViolationTypesElement(validate
.getConfiguration().getActiveViolationTypes(), document.getRootElement().getChild("activeViolationTypes"));
}
private void checkSeveritiesTheSameAsSeveritiesElement(List<Severity> severities, Element severitiesElement) {
assertEquals(severitiesElement.getChildren().size(), severities.size());
for(int i = 0; i < severitiesElement.getChildren().size(); i++) {
Element severityElement = severitiesElement.getChildren().get(i);
Severity severity = severities.get(i);
checkSeverityTheSameAsSeverityElement(severity, severityElement);
}
}
private void checkSeveritiesPerTypesPerProgrammingLanguagesTheSameAsSeveritiesPerTypesPerProgrammingLanguagesElement(
HashMap<String, HashMap<String, Severity>> severitiesPerTypesPerProgrammingLanguages,
Element severitiesPerTypesPerProgrammingLanguagesElement) {
assertEquals(severitiesPerTypesPerProgrammingLanguages.size(), severitiesPerTypesPerProgrammingLanguagesElement.getChildren().size());
for(Entry<String, HashMap<String, Severity>> severityPerTypePerProgrammingLanguage : severitiesPerTypesPerProgrammingLanguages.entrySet()) {
for(Element severityPerTypePerProgrammingLanguageElement : severitiesPerTypesPerProgrammingLanguagesElement.getChildren()) {
if(severityPerTypePerProgrammingLanguageElement.getAttribute("language").getValue().equals(severityPerTypePerProgrammingLanguage.getKey())) {
checkSeverityPerTypePerProgrammingLanguageTheSameAsSeverityPerTypePerProgrammingLanguageElement(
severityPerTypePerProgrammingLanguage, severityPerTypePerProgrammingLanguageElement);
}
}
}
}
private void checkActiveViolationTypesTheSameAsActiveViolationTypesElement(Map<String, List<ActiveRuleType>> activeViolationTypes, Element child) {
int i = 0;
for(Entry<String, List<ActiveRuleType>> activeViolationType : activeViolationTypes.entrySet()) {
Element activeViolationTypeElement = child.getChildren().get(i);
assertEquals(activeViolationType.getKey(), activeViolationTypeElement.getAttributeValue("language"));
for(int ruleTypeIndex = 0; ruleTypeIndex < activeViolationTypeElement.getChildren().size(); ruleTypeIndex++) {
Element activeRuleTypeElement = activeViolationTypeElement.getChildren().get(ruleTypeIndex);
assertNotNull(containsActiveRuleType(activeRuleTypeElement.getAttributeValue("type"), activeViolationType.getValue()));
ActiveRuleType activeRuleType = containsActiveRuleType(activeRuleTypeElement.getAttributeValue("type"), activeViolationType.getValue());
assertEquals(activeRuleType.getRuleType(), activeRuleTypeElement.getAttributeValue("type"));
for(Element violationTypesElement : activeRuleTypeElement
.getChildren("violationTypes")) {
for(int violationTypesRootIndex = 0; violationTypesRootIndex < violationTypesElement
.getChildren().size(); violationTypesRootIndex++) {
assertNotNull(containsActiveViolationType(
violationTypesElement.getChildren()
.get(violationTypesRootIndex)
.getChildText("violationKey"),
activeRuleType.getViolationTypes()));
ActiveViolationType violationType = containsActiveViolationType(
violationTypesElement.getChildren()
.get(violationTypesRootIndex)
.getChildText("violationKey"),
activeRuleType.getViolationTypes());
assertEquals(
violationType.getType(),
violationTypesElement.getChildren()
.get(violationTypesRootIndex)
.getChildText("violationKey"));
assertEquals(
violationType.isEnabled(),
Boolean.parseBoolean(violationTypesElement
.getChildren()
.get(violationTypesRootIndex)
.getChildText("enabled")));
}
}
}
i++;
}
}
private ActiveRuleType containsActiveRuleType(String key, List<ActiveRuleType> activeViolationTypes) {
for(ActiveRuleType activeRuleType : activeViolationTypes) {
if(activeRuleType.getRuleType().equals(key)) {
return activeRuleType;
}
}
return null;
}
private ActiveViolationType containsActiveViolationType(String key, List<ActiveViolationType> activeViolationTypes) {
for(ActiveViolationType activeViolationType : activeViolationTypes) {
if(activeViolationType.getType().equals(key)) {
return activeViolationType;
}
}
return null;
}
private void checkSeverityTheSameAsSeverityElement(Severity severity, Element severityElement) {
assertEquals(severity.getSeverityKey(), severityElement.getChildText("severityKey"));
assertEquals(severity.getColor(), new Color(Integer.parseInt(severityElement.getChildText("color"))));
}
private void checkSeverityPerTypePerProgrammingLanguageTheSameAsSeverityPerTypePerProgrammingLanguageElement(
Entry<String, HashMap<String, Severity>> severityPerTypePerProgrammingLanguage, Element severityPerTypePerProgrammingLanguageElement) {
assertEquals(severityPerTypePerProgrammingLanguageElement.getChildren().size(), severityPerTypePerProgrammingLanguage.getValue().size());
for(Entry<String, Severity> severityPerType : severityPerTypePerProgrammingLanguage.getValue().entrySet()) {
String severityId = findSeverityPerTypeElement(severityPerTypePerProgrammingLanguageElement, severityPerType);
assertEquals(severityId, severityPerType.getValue().getId().toString());
}
}
private String findSeverityPerTypeElement(Element severityPerTypePerProgrammingLanguageElement, Entry<String, Severity> severityPerType) {
for(Element severityPerTypeElement : severityPerTypePerProgrammingLanguageElement.getChildren()) {
if(severityPerTypeElement.getChildText("typeKey").equals(severityPerType.getKey())) {
return severityPerTypeElement.getChildText("severityId");
}
}
throw new AssertionFailedError("There was an error finding a type by the key: " + severityPerType.getKey());
}
}