//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.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.analysisresult.Violation;
import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.core.dependencies.Dependency;
import org.dtangler.core.dependencies.TestDependable;
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 CompositeAnalyzerTest {
@Test
public void testAllViolationsAreCollected() {
CompositeAnalyzer analyzer = new CompositeAnalyzer();
MockAnalyzer analyzer1 = new MockAnalyzer();
Dependency dependency1 = new Dependency(new TestDependable("foo"),
new TestDependable("bar"));
Dependency dependency2 = new Dependency(new TestDependable("foo"),
new TestDependable("bay"));
Dependencies dependencies = new Dependencies();
Violation violation1 = new MockViolation("v1");
Violation violation2 = new MockViolation("v2");
Violation violation3 = new MockViolation("v3");
analyzer1.addViolation(dependency1, violation1);
MockAnalyzer analyzer2 = new MockAnalyzer();
analyzer2.addViolation(dependency1, violation2);
analyzer2.addViolation(dependency2, violation3);
analyzer.add(analyzer1);
analyzer.add(analyzer2);
analyzer.analyze(dependencies);
Map<Dependency, Set<Violation>> violations = analyzer.getViolations();
assertEquals(2, violations.size());
assertTrue(violations.keySet().contains(dependency1));
assertTrue(violations.keySet().contains(dependency2));
assertEquals(2, violations.get(dependency1).size());
assertTrue(violations.get(dependency1).contains(violation1));
assertTrue(violations.get(dependency1).contains(violation2));
assertEquals(1, violations.get(dependency2).size());
assertTrue(violations.get(dependency2).contains(violation3));
}
@Test
public void testIsInvalidIfOneResultIsInvalid() {
CompositeAnalyzer analyzer = new CompositeAnalyzer();
analyzer.add(new MockAnalyzer(true));
analyzer.add(new MockAnalyzer(true));
Dependencies dependencies = new Dependencies();
analyzer.analyze(dependencies);
assertTrue(analyzer.isValidResult());
analyzer.add(new MockAnalyzer(false));
analyzer.analyze(dependencies);
assertFalse(analyzer.isValidResult());
}
@Test
public void testAddMultipleViolationsToSameDependency() {
Dependency dependency = new Dependency(new TestDependable("Foo"),
new TestDependable("Bar"));
Rule packageRule = new Rule(Rule.Type.cannotDepend,
new SingleRuleMember("package1.Foo"),
createSet(new SingleRuleMember("package2.Bar")));
Rule classRule = new Rule(Rule.Type.cannotDepend, new SingleRuleMember(
"Foo"), createSet(new SingleRuleMember("Bar")));
Violation violation1 = new RuleViolation(dependency, packageRule);
Violation violation2 = new RuleViolation(dependency, classRule);
DependencyAnalyzer analyzer = new MockAnalyzer();
analyzer.addViolation(dependency, violation1);
analyzer.addViolation(dependency, violation2);
Map<Dependency, Set<Violation>> allViolations = analyzer
.getViolations();
Set<Violation> values = new HashSet(allViolations.get(dependency));
assertEquals(2, values.size());
assertTrue(values.contains(violation1));
assertTrue(values.contains(violation2));
}
private Set<RuleMember> createSet(SingleRuleMember... items) {
return new HashSet(Arrays.asList(items));
}
}