//This product is provided under the terms of EPL (Eclipse Public License)
//version 1.0.
//
//The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.core.acceptancetests.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.analysis.ChildViolation;
import org.dtangler.core.analysis.configurableanalyzer.ConfigurableDependencyAnalyzer;
import org.dtangler.core.analysisresult.AnalysisResult;
import org.dtangler.core.analysisresult.Violation;
import org.dtangler.core.configuration.Arguments;
import org.dtangler.core.configuration.ParserConstants;
import org.dtangler.core.dependencies.Dependable;
import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.core.dependencies.Dependency;
import org.dtangler.core.dependencies.TestDependable;
import org.dtangler.core.dependencies.TestScope;
import org.dtangler.core.input.ArgumentBuilder;
import org.dtangler.core.input.CommandLineParser;
import org.dtangler.core.ruleanalysis.Rule;
import org.dtangler.core.ruleanalysis.RuleMember;
import org.dtangler.core.ruleanalysis.RuleViolation;
import org.dtangler.core.ruleanalysis.SingleRuleMember;
import org.junit.Test;
public class ViolationsAndScopesTest {
private final String rulesKey = CommandLineParser
.getKeyString(ParserConstants.RULES_KEY);
private String fooName = "eg.foo";
private String barName = "eg.bar";
private Dependable packageFoo = new TestDependable(fooName,
TestScope.scope2);
private Dependable packageBar = new TestDependable(barName,
TestScope.scope2);
private String fooClass1Name = "eg.foo.Class1";
private String fooClass2Name = "eg.foo.Class2";
private String barClass3Name = "eg.bar.Class3";
private String barClass4Name = "eg.bar.Class4";
private String barClass5Name = "eg.bar.Class5";
private Dependable fooClass1 = new TestDependable(fooClass1Name,
TestScope.scope3);
private Dependable fooClass2 = new TestDependable(fooClass2Name,
TestScope.scope3);
private Dependable barClass3 = new TestDependable(barClass3Name,
TestScope.scope3);
private Dependable barClass4 = new TestDependable(barClass4Name,
TestScope.scope3);
private Dependable barClass5 = new TestDependable(barClass5Name,
TestScope.scope3);
private Dependencies createDependencies() {
Dependencies dependencies = new Dependencies();
dependencies.addChild(packageFoo, fooClass1);
dependencies.addChild(packageFoo, fooClass2);
dependencies.addChild(packageBar, barClass3);
dependencies.addChild(packageBar, barClass4);
dependencies.addChild(packageBar, barClass5);
return dependencies;
}
@Test
public void testPackagePackageRules() {
Dependencies dependencies = createDependencies();
dependencies.addDependencies(packageFoo, createMap(packageBar));
dependencies.addDependencies(fooClass1, createMap(barClass3));
String[] rules = { rulesKey + fooName + " "
+ ParserConstants.CANNOT_DEPEND + " " + barName };
Arguments arguments = new ArgumentBuilder().build(rules);
AnalysisResult analysisResult = new ConfigurableDependencyAnalyzer(
arguments).analyze(dependencies);
assertEquals(2, analysisResult.getAllViolations().size());
assertFalse(analysisResult.isValid());
}
@Test
public void testPackageClassRules() {
Dependencies dependencies = createDependencies();
dependencies.addDependencies(packageFoo, createMap(packageBar));
dependencies
.addDependencies(fooClass1, createMap(barClass3, barClass5));
String[] rules = { rulesKey + fooName + " "
+ ParserConstants.CANNOT_DEPEND + barClass3Name
+ ParserConstants.SMALL_SEPARATOR + barClass4Name };
Arguments args = new ArgumentBuilder().build(rules);
AnalysisResult analysisResult = new ConfigurableDependencyAnalyzer(args)
.analyze(dependencies);
assertEquals(1, analysisResult.getAllViolations().size());
assertFalse(analysisResult.isValid());
}
@Test
public void testClassPackageRules() {
Dependencies dependencies = createDependencies();
dependencies.addDependencies(packageFoo, createMap(packageBar));
dependencies
.addDependencies(fooClass1, createMap(fooClass2, barClass5));
dependencies.addDependencies(fooClass2, createMap(barClass3, barClass4,
barClass5));
String[] rules = { rulesKey + fooClass1Name + " "
+ ParserConstants.CANNOT_DEPEND + " " + barName };
Arguments args = new ArgumentBuilder().build(rules);
AnalysisResult analysisResult = new ConfigurableDependencyAnalyzer(args)
.analyze(dependencies);
assertEquals(1, analysisResult.getAllViolations().size());
assertFalse(analysisResult.isValid());
}
@Test
public void testClassClassRules() {
Dependencies dependencies = createDependencies();
dependencies.addDependencies(packageFoo, createMap(packageBar));
dependencies.addDependencies(fooClass1, createMap(barClass3));
dependencies.addDependencies(fooClass2, createMap(barClass5));
dependencies.addDependencies(barClass4, createMap(barClass5));
String[] rules = { rulesKey + fooClass2Name + " "
+ ParserConstants.CANNOT_DEPEND + " " + barClass5Name };
Arguments args = new ArgumentBuilder().build(rules);
AnalysisResult analysisResult = new ConfigurableDependencyAnalyzer(args)
.analyze(dependencies);
assertEquals(1, analysisResult.getAllViolations().size());
assertFalse(analysisResult.isValid());
}
@Test
public void testAllViolationsIncludeChildViolations() {
String[] rules = { rulesKey + fooClass1Name + " "
+ ParserConstants.CANNOT_DEPEND + " " + fooClass2Name
+ ParserConstants.BIG_SEPARATOR + fooClass2Name + " "
+ ParserConstants.CANNOT_DEPEND + " " + barClass3Name };
Arguments args = new ArgumentBuilder().build(rules);
Dependencies dependencies = createDependencies();
dependencies.addDependencies(fooClass1, createMap(fooClass2));
dependencies.addDependencies(fooClass2, createMap(barClass3));
dependencies.addDependencies(packageFoo, createMap(packageBar));
AnalysisResult analysisResult = new ConfigurableDependencyAnalyzer(args)
.analyze(dependencies);
Set<Violation> allViolations = analysisResult.getAllViolations();
assertEquals(3, allViolations.size());
assertTrue(allViolations.contains(new ChildViolation(packageFoo,
createRuleViolation(fooClass1, fooClass2))));
assertFalse(analysisResult.isValid());
}
private RuleViolation createRuleViolation(Dependable dependant,
Dependable dependee) {
Dependency dependency = new Dependency(dependant, dependee);
Rule rule = createRule(dependant, dependee);
return new RuleViolation(dependency, rule);
}
private Rule createRule(Dependable left, Dependable... right) {
Set<RuleMember> rightSide = new HashSet();
for (Dependable dep : right) {
rightSide.add(new SingleRuleMember(dep.getDisplayName()));
}
return new Rule(Rule.Type.cannotDepend, new SingleRuleMember(left
.getDisplayName()), rightSide);
}
protected Map<Dependable, Integer> createMap(Dependable... items) {
Map<Dependable, Integer> result = new HashMap();
for (Dependable item : items) {
result.put(item, 1);
}
return result;
}
}