//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.ruleanalysis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.configuration.Group;
import org.dtangler.core.configuration.ParserConstants;
import org.dtangler.core.dependencies.Dependable;
import org.dtangler.core.dependencies.DependencyGraph;
import org.dtangler.core.exception.DtException;
import org.dtangler.core.testutil.dependenciesbuilder.DependencyGraphBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class RuleCreatorTest {
private Map<String, Set<String>> forbiddenDependencies = new HashMap();
private Map<String, Set<String>> allowedDependencies = new HashMap();
private Map<String, Group> groups = new HashMap();
protected static String item1Name = "c1";
protected static String item2Name = "c2";
protected static String item3Name = "c3";
protected static String item4Name = "c4";
protected Dependable item1dep;
protected Dependable item2dep;
protected Dependable item3dep;
protected Dependable item4dep;
protected SingleRuleMember item1;
protected SingleRuleMember item2;
protected SingleRuleMember item3;
protected SingleRuleMember item4;
protected static String group1Name = "Group 1";
protected static String group1ID = ParserConstants.GROUP_IDENTIFIER
+ group1Name;
protected static String group2Name = "Group 2";
protected static String group2ID = ParserConstants.GROUP_IDENTIFIER
+ group2Name;
protected DependencyGraph deps;
@Before
public void setUp() {
DependencyGraphBuilder builder = new DependencyGraphBuilder();
builder.add(item1Name).dependsOn(item2Name);
builder.add(item1Name).dependsOn(item3Name);
builder.add(item2Name).dependsOn(item3Name);
builder.add(item4Name).dependsOn(item3Name);
deps = builder.getDependencies();
item1dep = deps.getItemByName(item1Name);
item2dep = deps.getItemByName(item2Name);
item3dep = deps.getItemByName(item3Name);
item4dep = deps.getItemByName(item4Name);
item1 = new SingleRuleMember(item1Name);
item2 = new SingleRuleMember(item2Name);
item3 = new SingleRuleMember(item3Name);
item4 = new SingleRuleMember(item4Name);
}
@Test
public void testRules() {
addToMap(forbiddenDependencies, item1Name, item2Name, item3Name);
addToMap(forbiddenDependencies, item2Name, item3Name);
addToMap(allowedDependencies, item1Name, item3Name);
addToMap(allowedDependencies, item2Name, item3Name);
List<Rule> list = createRules();
assertEquals(4, list.size());
testRule(item1, list, Rule.Type.cannotDepend, 2, item2, item3);
testRule(item2, list, Rule.Type.cannotDepend, 1, item3);
testRule(item1, list, Rule.Type.canDepend, 1, item3);
testRule(item2, list, Rule.Type.canDepend, 1, item3);
}
@Test
public void testRulesWithGroups() {
Group g1 = addGroup(group1Name, item1Name, item2Name);
GroupRuleMember group1 = new GroupRuleMember(g1);
Group g2 = addGroup(group2Name, item2Name, item3Name);
GroupRuleMember group2 = new GroupRuleMember(g2);
addToMap(forbiddenDependencies, group1ID, item3Name);
addToMap(forbiddenDependencies, group2ID, item3Name);
addToMap(forbiddenDependencies, item4Name, item3Name);
addToMap(allowedDependencies, group1ID, item3Name);
List<Rule> list = createRules();
assertEquals(4, list.size());
testRule(group1, list, Rule.Type.cannotDepend, 1, item3);
testRule(group2, list, Rule.Type.cannotDepend, 1, item3);
testRule(item4, list, Rule.Type.cannotDepend, 1, item3);
testRule(group1, list, Rule.Type.canDepend, 1, item3);
}
private void testRule(RuleMember item, List<Rule> ruleList,
Rule.Type ruleType, int size, RuleMember... containedMembers) {
Rule rule = getRuleFromList(ruleList, item, ruleType);
assertEquals(ruleType, rule.getType());
assertEquals(size, rule.getRightSide().size());
for (RuleMember member : containedMembers) {
assertTrue(rule.getRightSide().contains(member));
}
}
@Test
public void testUndefinedGroup() {
// use group in rule, but don't define it
addToMap(forbiddenDependencies, group1ID, item1Name);
try {
createRules();
} catch (DtException e) {
// should catch "undefined group" exception
return;
}
Assert.fail();
}
@Test
public void testNonExisting() {
String nonExisting = "this.does.not.exist";
addToMap(forbiddenDependencies, nonExisting, item2Name, item3Name);
// rule creation should not crash or throw exception if rule definition
// contains items that do not exist or are not available
List<Rule> list = createRules();
assertEquals(1, list.size());
assertEquals(SingleRuleMember.class, list.get(0).getLeftSide()
.getClass());
}
private List<Rule> createRules() {
return new RuleCreator(forbiddenDependencies, allowedDependencies,
groups).createRules();
}
private Rule getRuleFromList(List<Rule> list, Object item, Rule.Type type) {
for (Rule rule : list) {
if (rule.getType().equals(type) && rule.getLeftSide().equals(item))
return rule;
}
return null;
}
protected void addToMap(Map<String, Set<String>> map, String name,
String... items) {
Set<String> values = new HashSet();
for (String item : items)
values.add(item.trim());
map.put(name.trim(), values);
}
protected Group addGroup(String name, String... items) {
Set<String> values = new HashSet();
for (String item : items)
values.add(item.trim());
Group group = new Group(name.trim(), values);
groups.put(name.trim(), group);
return group;
}
}