/**
* Copyright 2010 Wealthfront Inc. Licensed under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
* or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package com.kaching.platform.testing;
import static com.google.common.collect.Lists.newArrayList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import jdepend.framework.JavaClass;
import jdepend.framework.JavaPackage;
import junit.framework.AssertionFailedError;
import org.junit.Before;
import org.junit.Test;
import com.kaching.platform.testing.DependencyTestRunner.DependenciesBuilder;
import com.kaching.platform.testing.DependencyTestRunner.Violation;
public class DependencyTestRunnerTest {
private DependenciesBuilder dependencies;
@Before
public void before() {
dependencies = new DependenciesBuilder();
}
@Test
public void wellFormedness1() {
JavaPackage a = new JavaPackage("a");
dependencies.forPackages("a").
check("a").mayDependOn().
assertIsVerified(newArrayList(a));
}
@Test
public void wellFormedness2() {
JavaPackage a = new JavaPackage("a");
JavaPackage b = new JavaPackage("b");
b.setEfferents(newArrayList(a));
dependencies.forPackages("*").
check("a").mayDependOn().
check("b").mayDependOn("*").
assertIsVerified(newArrayList(a, b));
dependencies = new DependenciesBuilder();
dependencies.forPackages("a").
check("a").mayDependOn().
assertIsVerified(newArrayList(a, b));
}
@Test
public void wellFormedness3() {
JavaPackage a = new JavaPackage("a");
JavaPackage b = new JavaPackage("b");
a.setEfferents(newArrayList(b));
try {
dependencies.forPackages("*").
check("a").mayDependOn().
assertIsVerified(newArrayList(a, b));
fail("assertIsVerified should fail");
} catch (AssertionFailedError e) {
assertEquals(
"1 violation(s):\n" +
"package a cannot depend on package b",
e.getMessage());
}
}
@Test
public void wellFormedness4() {
JavaPackage a = new JavaPackage("a");
JavaPackage b = new JavaPackage("b");
JavaPackage c = new JavaPackage("c");
a.setEfferents(newArrayList(b, c));
try {
dependencies.forPackages("*").
check("a").mayDependOn().
assertIsVerified(newArrayList(a, b));
fail("assertIsVerified should fail");
} catch (AssertionFailedError e) {
assertEquals(
"2 violation(s):\n" +
"package a cannot depend on package b\n" +
"package a cannot depend on package c",
e.getMessage());
}
}
@Test
public void wellFormedness5() {
JavaPackage a = new JavaPackage("a");
JavaPackage ba = new JavaPackage("b.a");
JavaPackage bb = new JavaPackage("b.b");
JavaPackage c = new JavaPackage("c");
a.setEfferents(newArrayList(ba, bb, c));
try {
dependencies.forPackages("*").
check("a").mayDependOn("b.*").
assertIsVerified(newArrayList(a, ba, bb, c));
fail();
} catch (AssertionFailedError e) {
assertEquals(
"1 violation(s):\n" +
"package a cannot depend on package c",
e.getMessage());
}
}
@Test
public void wellFormedness6() {
JavaPackage aa = new JavaPackage("a.a");
JavaPackage ab = new JavaPackage("a.b");
JavaPackage ba = new JavaPackage("b.a");
JavaPackage caa = new JavaPackage("c.a.a");
aa.setEfferents(newArrayList(ab, ba, caa));
try {
dependencies.forPackages("*").
check("a.*").mayDependOn("b.*", "c.*").
assertIsVerified(newArrayList(aa, ab, ba, caa));
fail();
} catch (AssertionFailedError e) {
assertEquals(
"1 violation(s):\n" +
"package a.a cannot depend on package a.b",
e.getMessage());
}
}
@Test
public void wellFormedness7() {
JavaPackage aa = new JavaPackage("a.a");
JavaPackage ab = new JavaPackage("a.b");
JavaPackage ac = new JavaPackage("a.c");
JavaPackage ba = new JavaPackage("b.a");
JavaPackage caa = new JavaPackage("c.a.a");
aa.setEfferents(newArrayList(ab, ac, ba, caa));
try {
dependencies.forPackages("*").
check("a.*").mayDependOn("b.*", "c.*").
check("a.a").mayDependOn("a.b").
assertIsVerified(newArrayList(aa, ab, ac, ba, caa));
fail();
} catch (AssertionFailedError e) {
assertEquals(
"1 violation(s):\n" +
"package a.a cannot depend on package a.c",
e.getMessage());
}
}
@Test
public void violationToString() {
Violation violation = new Violation(
new JavaPackage("a"), new JavaPackage("b"));
JavaClass classA = new JavaClass("a.BigA");
classA.addImportedPackage(violation.efferent);
violation.javaPackage.addClass(classA);
JavaClass classB = new JavaClass("a.BigB");
classB.addImportedPackage(violation.efferent);
violation.javaPackage.addClass(classB);
violation.javaPackage.addClass(new JavaClass("a.BigC"));
assertEquals(
"package a cannot depend on package b (classes BigA, BigB)",
violation.toString());
}
@Test
public void packageNameMatchesExpression() {
assertTrue(DependenciesBuilder.packageNameMatchesExpression("a", "*"));
assertTrue(DependenciesBuilder.packageNameMatchesExpression("a.b", "a.*"));
assertTrue(DependenciesBuilder.packageNameMatchesExpression("a.b.c", "a.b.*"));
assertTrue(DependenciesBuilder.packageNameMatchesExpression("a.b.c", "a.*"));
}
}