// 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.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.dtangler.core.analysisresult.AnalysisResult; import org.dtangler.core.analysisresult.Violation; import org.dtangler.core.analysisresult.Violation.Severity; import org.dtangler.core.dependencies.Dependable; import org.dtangler.core.dependencies.Dependency; import org.dtangler.core.dependencies.TestDependable; import org.dtangler.core.dependencies.TestScope; import org.dtangler.core.ruleanalysis.RuleViolation; import org.dtangler.core.testutil.ruleanalysis.MockRule; import org.junit.Before; import org.junit.Test; public class AnalysisResultTest { private Dependable d1; private Dependable d2; private Dependable d3; private Dependable d4; private Dependable d5; private Dependency d1d2; private Dependency d1d3; private Dependency d1d4; private Dependency d1d5; Map<Dependency, Set<Violation>> violations; @Before public void setUp() { violations = new HashMap(); d1 = new TestDependable("d1"); d2 = new TestDependable("d2"); d3 = new TestDependable("d3"); d4 = new TestDependable("d4"); d5 = new TestDependable("d5"); d1d2 = new Dependency(d1, d2); d1d3 = new Dependency(d1, d3); d1d4 = new Dependency(d2, d4); d1d5 = new Dependency(d1, d5); } @Test public void testBasicProperties() { AnalysisResult result = new AnalysisResult(new HashMap(), new HashSet(), true); assertTrue(result.isValid()); assertFalse(result.hasViolations()); addRuleViolation(d1d2, Arrays.asList(d1d3)); result = new AnalysisResult(violations, Collections.EMPTY_SET, false); assertFalse(result.isValid()); assertTrue(result.hasViolations()); } @Test public void testViolations() { addRuleViolation(d1d2, Arrays.asList(d1d3, d1d4)); addRuleViolation(d1d3, Arrays.asList(d1d2, d1d5)); AnalysisResult result = new AnalysisResult(violations, Collections.EMPTY_SET, true); assertTrue(result.hasViolations(d1d2)); assertTrue(result.hasViolations(d1d3)); assertFalse(result.hasViolations(d1d4)); assertFalse(result.hasViolations(d1d5)); Set<Violation> allViolations = result.getAllViolations(); assertEquals(4, allViolations.size()); assertTrue(allViolations.contains(new RuleViolation(d1d2, new MockRule()))); assertTrue(allViolations.contains(new RuleViolation(d1d3, new MockRule()))); assertTrue(allViolations.contains(new RuleViolation(d1d4, new MockRule()))); assertTrue(allViolations.contains(new RuleViolation(d1d5, new MockRule()))); Set<Violation> violationsd1d2 = result.getViolations(d1d2); assertEquals(2, violationsd1d2.size()); assertTrue(violationsd1d2.contains(new RuleViolation(d1d3, new MockRule()))); assertTrue(violationsd1d2.contains(new RuleViolation(d1d4, new MockRule()))); Set<Violation> violationsd1d3 = result.getViolations(d1d3); assertEquals(2, violationsd1d3.size()); assertTrue(violationsd1d3.contains(new RuleViolation(d1d2, new MockRule()))); assertTrue(violationsd1d3.contains(new RuleViolation(d1d5, new MockRule()))); assertEquals(0, result.getViolations(d1d4).size()); assertEquals(0, result.getViolations(d1d5).size()); } @Test public void testGetViolationsForDependables() { Dependency d2d3 = new Dependency(d2, d3); violations.put(d1d2, createViolationSet(createViolation("violation1", d1), createViolation("violation2", d1, d2))); violations.put(d2d3, createViolationSet(createViolation("violation3", d2, d3))); AnalysisResult result = new AnalysisResult(violations, Collections.EMPTY_SET, true); assertViolationsByName(result.getViolations(new HashSet(Arrays.asList( d1, d2, d3, d4, d5))), "violation1", "violation2", "violation3"); assertViolationsByName(result.getViolations(new HashSet(Arrays .asList(d1))), "violation1", "violation2"); assertViolationsByName(result.getViolations(new HashSet(Arrays .asList(d2))), "violation2", "violation3"); assertViolationsByName(result.getViolations(new HashSet(Arrays .asList(d3))), "violation3"); } @Test public void testGetChildViolationsForDependables() { Set<Violation> childViolations = new HashSet(); childViolations.addAll(new HashSet(Arrays.asList(new ChildViolation(d1, createViolation("violationName", new TestDependable("sub1", TestScope.scope2)))))); AnalysisResult result = new AnalysisResult(violations, childViolations, true); assertViolationsByName(result.getChildViolations(new HashSet(Arrays .asList(d1, d2, d3))), "d1 contains a violation: violationName"); assertEquals(0, result.getChildViolations( new HashSet(Arrays.asList(d2, d3, d4, d5))).size()); } private Violation createViolation(String name, Dependable... appliesTo) { return new MockViolation(name, Severity.warning, new HashSet(Arrays .asList(appliesTo))); } private Set<Violation> createViolationSet(Violation... violations) { return new HashSet(Arrays.asList(violations)); } private void assertViolationsByName(Set<Violation> actual, String... expected) { Set<String> expectedNames = new HashSet(Arrays.asList(expected)); assertEquals(expected.length, actual.size()); for (Violation v : actual) assertTrue(expectedNames.contains(v.asText())); } @Test public void testSeverity() { Violation w1 = new MockViolation("w1", Severity.warning); Violation w2 = new MockViolation("w2", Severity.warning); Violation e1 = new MockViolation("e1", Severity.error); Set<Violation> list = new HashSet<Violation>(); list.addAll(Arrays.asList(w1, w2, e1)); violations.put(d1d2, list); AnalysisResult result = new AnalysisResult(violations, Collections.EMPTY_SET, true); assertEquals(2, result.getViolations(d1d2, Severity.warning).size()); assertTrue(result.getViolations(d1d2, Severity.warning).contains(w1)); assertTrue(result.getViolations(d1d2, Severity.warning).contains(w2)); assertEquals(1, result.getViolations(d1d2, Severity.error).size()); assertTrue(result.getViolations(d1d2, Severity.error).contains(e1)); } @Test public void testGetChildViolationsBySeverity() { Violation w1 = new MockViolation("w1", Severity.warning, Collections .singleton(d1)); Violation w2 = new MockViolation("w2", Severity.warning, new HashSet( Arrays.asList(d1, d2))); Violation e1 = new MockViolation("e1", Severity.error, Collections .singleton(d1)); Set<Violation> childViolations = new HashSet(); childViolations.addAll(new HashSet(Arrays.asList(w1, w2, e1))); childViolations.add(w2); AnalysisResult result = new AnalysisResult(Collections.EMPTY_MAP, childViolations, false); assertEquals(2, result.getChildViolations(d1, Severity.warning).size()); assertTrue(result.getChildViolations(d1, Severity.warning).contains(w1)); assertTrue(result.getChildViolations(d1, Severity.warning).contains(w2)); assertEquals(1, result.getChildViolations(d1, Severity.error).size()); assertTrue(result.getChildViolations(d1, Severity.error).contains(e1)); assertEquals(1, result.getChildViolations(d2, Severity.warning).size()); assertTrue(result.getChildViolations(d2, Severity.warning).contains(w2)); assertTrue(result.getChildViolations(d2, Severity.error).isEmpty()); } private void addRuleViolation(Dependency key, List<Dependency> dependencies) { Set<Violation> list = new HashSet<Violation>(); for (Dependency d : dependencies) list.add(new RuleViolation(d, new MockRule())); violations.put(key, list); } }