//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.analysis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.analysisresult.Violation;
import org.dtangler.core.cycleanalysis.DependencyCycle;
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.ruleanalysis.Rule;
import org.dtangler.core.ruleanalysis.RuleMember;
import org.dtangler.core.ruleanalysis.RuleViolation;
import org.dtangler.core.ruleanalysis.SingleRuleMember;
import org.junit.Before;
import org.junit.Test;
public class ChildViolationFinderTest {
private Dependencies dependencies = new Dependencies();
ChildViolationFinder finder;
private Dependable package1 = new TestDependable("eg.foo", TestScope.scope2);
private Dependable package2 = new TestDependable("eg.bar", TestScope.scope2);
private Dependable package3 = new TestDependable("eg.bay", TestScope.scope2);
private Dependable fooClass1 = new TestDependable("eg.foo.Class1",
TestScope.scope3);
private Dependable fooClass2 = new TestDependable("eg.foo.Class2",
TestScope.scope3);
private Dependable barClass1 = new TestDependable("eg.bar.Class1",
TestScope.scope3);
private Dependable barClass2 = new TestDependable("eg.bar.Class2",
TestScope.scope3);
private Dependable barClass3 = new TestDependable("eg.bar.Class3",
TestScope.scope3);
private Dependable bayClass1 = new TestDependable("eg.bay.Class1",
TestScope.scope3);
private Dependable bayClass2 = new TestDependable("eg.bay.Class2",
TestScope.scope3);
@Before
public void setUp() {
dependencies.addChild(package1, fooClass1);
dependencies.addChild(package1, fooClass2);
dependencies.addChild(package2, barClass1);
dependencies.addChild(package2, barClass2);
dependencies.addChild(package2, barClass3);
dependencies.addChild(package3, bayClass1);
dependencies.addChild(package3, bayClass2);
finder = new ChildViolationFinder(dependencies);
}
@Test
public void testFindCyclesInsideParents() {
Map<Dependable, Set<Violation>> childViolations = new HashMap();
childViolations = finder
.findChildViolationsForParents(createCycleViolationMap());
assertEquals(1, childViolations.size());
assertTrue(childViolations.containsKey(package2));
Set<Violation> violationsForPackage2 = childViolations.get(package2);
assertEquals(2, violationsForPackage2.size());
assertTrue(violationsForPackage2.contains(new ChildViolation(package2,
new DependencyCycle(Arrays.asList(barClass1, barClass2)))));
assertTrue(violationsForPackage2.contains(new ChildViolation(package2,
new DependencyCycle(Arrays.asList(barClass2, barClass3)))));
}
private Map<Dependency, Set<Violation>> createCycleViolationMap() {
Map<Dependency, Set<Violation>> violations = new HashMap();
addDependencyCycle(fooClass1, bayClass1, violations);
addDependencyCycle(barClass1, barClass2, violations);
addDependencyCycle(barClass2, barClass3, violations);
return violations;
}
private void addDependencyCycle(Dependable part1, Dependable part2,
Map<Dependency, Set<Violation>> violations) {
violations.put(new Dependency(part1, part2), new HashSet(Arrays
.asList(new DependencyCycle(Arrays.asList(part1, part2)))));
}
@Test
public void testFindRuleViolationsInsideParents() {
Map<Dependable, Set<Violation>> childViolations = new HashMap();
finder = new ChildViolationFinder(dependencies);
childViolations = finder
.findChildViolationsForParents(createRuleViolationMap());
assertEquals(2, childViolations.size());
assertTrue(childViolations.containsKey(package1));
assertTrue(childViolations.containsKey(package2));
Set<Violation> violationsForPackage1 = childViolations.get(package1);
assertEquals(1, violationsForPackage1.size());
assertTrue(violationsForPackage1.contains(new ChildViolation(package1,
createRuleViolation(fooClass1, fooClass2))));
Set<Violation> violationsForPackage2 = childViolations.get(package2);
assertEquals(2, violationsForPackage2.size());
assertTrue(violationsForPackage2.contains(new ChildViolation(package2,
createRuleViolation(barClass1, barClass3))));
assertTrue(violationsForPackage2.contains(new ChildViolation(package2,
createRuleViolation(barClass2, barClass3))));
}
private RuleViolation createRuleViolation(Dependable dependant,
Dependable dependee) {
Dependency dependency = new Dependency(dependant, dependee);
Rule rule = createRule(dependant, dependee);
return new RuleViolation(dependency, rule);
}
private Map<Dependency, Set<Violation>> createRuleViolationMap() {
Map<Dependency, Set<Violation>> violations = new HashMap();
addRuleViolation(fooClass1, fooClass2, violations);
addRuleViolation(fooClass1, barClass2, violations);
addRuleViolation(barClass1, barClass3, violations);
addRuleViolation(barClass2, barClass3, violations);
return violations;
}
private void addRuleViolation(Dependable dependant, Dependable dependee,
Map<Dependency, Set<Violation>> violations) {
Dependency dependency = new Dependency(dependant, dependee);
RuleViolation violation = createRuleViolation(dependant, dependee);
violations.put(dependency, new HashSet(Arrays.asList(violation)));
}
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);
}
}