import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import junit.framework.TestCase;
import jdepend.framework.JavaPackage;
import jdepend.framework.JDepend;
import com.beer.common.PropertyReader;
public class ArchitecturalRulesTest extends TestCase {
PropertyReader propReader = new PropertyReader("default");
private final String DIRECTORY_TO_ANALYZE = propReader.getProperty("classes.directory.jdepend");
private JDepend jdepend;
private String dataLayer = "com.beer.business.data";
private String presentationLayer = "com.beer.web";
private String businessLayer = "com.beer.business.service";
private String domainLayer = "com.beer.business.domain";
private Collection dataLayerViolations = new ArrayList<String>();
private Collection businessLayerViolations = new ArrayList<String>();
private Collection presoLayerViolations = new ArrayList<String>();
private Collection domainLayerViolations = new ArrayList<String>();
public ArchitecturalRulesTest(String name) {
super(name);
}
protected void setUp() throws IOException {
jdepend = new JDepend();
jdepend.addDirectory(DIRECTORY_TO_ANALYZE);
dataLayerViolations.add(businessLayer);
dataLayerViolations.add(presentationLayer);
businessLayerViolations.add(presentationLayer);
presoLayerViolations.add(dataLayer);
domainLayerViolations.add(businessLayer);
domainLayerViolations.add(dataLayer);
domainLayerViolations.add(presentationLayer);
}
public void testDomainLayer() {
System.out.println("Testing Domain Layer...");
if (!isLayeringValid(domainLayer, domainLayerViolations)) {
fail("Dependency Constraint failed in Domain Layer");
}
}
private boolean isLayeringValid(String layer, Collection rules) {
boolean rulesCorrect = true;
System.out.println("Testing Generic Layer...");
Collection packages = jdepend.analyze();
Iterator itor = packages.iterator();
JavaPackage jPackage = null;
String analyzedPackageName = null;
while (itor.hasNext()) {
jPackage = (JavaPackage) itor.next();
analyzedPackageName = jPackage.getName();
Collection afferents = jPackage.getAfferents();
Iterator afferentItor = afferents.iterator();
String afferentPackageName = null;
System.out.println("analyzedPackageName=" + analyzedPackageName);
while (afferentItor.hasNext()) {
JavaPackage afferentPackage = (JavaPackage) afferentItor.next();
afferentPackageName = afferentPackage.getName();
System.out
.println("afferentPackageName=" + afferentPackageName);
}
rulesCorrect = checkEfferents(layer, rules, rulesCorrect, jPackage,
analyzedPackageName);
}
return rulesCorrect;
}
private boolean checkEfferents(String layer, Collection rules,
boolean rulesCorrect, JavaPackage jPackage,
String analyzedPackageName) {
Collection efferents = jPackage.getEfferents();
Iterator efferentItor = efferents.iterator();
while (efferentItor.hasNext()) {
JavaPackage efferentPackage = (JavaPackage) efferentItor.next();
String efferentPackageName = efferentPackage.getName();
System.out.println("efferentPackageName=" + efferentPackageName);
for (Iterator it = rules.iterator(); it.hasNext();) {
String value = (String) it.next();
System.out.println("layer=" + layer);
System.out.println("value=" + value);
if (analyzedPackageName.equals(layer)
&& efferentPackageName.equals(value)) {
rulesCorrect = false;
System.out
.println("TEST FAILURE: "
+ analyzedPackageName
+ " should not depend upon (have an efferent coupling to) "
+ efferentPackageName);
break;
}
}
}
return rulesCorrect;
}
public void testDataLayer() {
System.out.println("Testing Data Layer...");
if (!isLayeringValid(dataLayer, dataLayerViolations)) {
fail("Dependency Constraint failed in data Layer");
}
}
public void testBusinessLayer() {
System.out.println("Testing Business Layer...");
if (!isLayeringValid(businessLayer, businessLayerViolations)) {
fail("Dependency Constraint failed in business Layer");
}
}
public void testPresentationLayer() {
System.out.println("Testing Presentation Layer...");
if (!isLayeringValid(presentationLayer, presoLayerViolations)) {
fail("Dependency Constraint failed in Presentation Layer");
}
}
}