-
Notifications
You must be signed in to change notification settings - Fork 288
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #80 from msherman32/SingleEquivalence
Adds theClass(..), noClass(..), should().be(..) and should().notBe(..) Resolves: #60
- Loading branch information
Showing
23 changed files
with
1,954 additions
and
49 deletions.
There are no files selected for viewing
10 changes: 10 additions & 0 deletions
10
archunit-example/src/main/java/com/tngtech/archunit/example/EvilCoreAccessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.tngtech.archunit.example; | ||
|
||
import com.tngtech.archunit.example.core.VeryCentralCore; | ||
|
||
@SuppressWarnings("unused") | ||
public class EvilCoreAccessor { | ||
void iShouldNotAccessCore() { | ||
new VeryCentralCore().doCoreStuff(); | ||
} | ||
} |
4 changes: 4 additions & 0 deletions
4
archunit-example/src/main/java/com/tngtech/archunit/example/SomeOtherBusinessInterface.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package com.tngtech.archunit.example; | ||
|
||
public interface SomeOtherBusinessInterface { | ||
} |
2 changes: 2 additions & 0 deletions
2
archunit-example/src/main/java/com/tngtech/archunit/example/controller/WronglyAnnotated.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,9 @@ | ||
package com.tngtech.archunit.example.controller; | ||
|
||
import com.tngtech.archunit.example.MyController; | ||
import com.tngtech.archunit.example.core.HighSecurity; | ||
|
||
@HighSecurity | ||
@MyController | ||
public class WronglyAnnotated { | ||
} |
10 changes: 10 additions & 0 deletions
10
...nit-example/src/main/java/com/tngtech/archunit/example/core/AnotherGoodCoreSatellite.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.tngtech.archunit.example.core; | ||
|
||
@SuppressWarnings("unused") | ||
public class AnotherGoodCoreSatellite implements CoreSatellite { | ||
VeryCentralCore centralCore; | ||
|
||
void iAlsoMayAccessCore() { | ||
centralCore.doCoreStuff(); | ||
} | ||
} |
4 changes: 4 additions & 0 deletions
4
archunit-example/src/main/java/com/tngtech/archunit/example/core/CoreSatellite.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package com.tngtech.archunit.example.core; | ||
|
||
public interface CoreSatellite { | ||
} |
10 changes: 10 additions & 0 deletions
10
archunit-example/src/main/java/com/tngtech/archunit/example/core/GoodCoreSatellite.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.tngtech.archunit.example.core; | ||
|
||
@SuppressWarnings("unused") | ||
public class GoodCoreSatellite implements CoreSatellite { | ||
VeryCentralCore centralCore; | ||
|
||
void iMayAccessCore() { | ||
centralCore.doCoreStuff(); | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
archunit-example/src/main/java/com/tngtech/archunit/example/core/HighSecurity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.tngtech.archunit.example.core; | ||
|
||
import java.lang.annotation.Retention; | ||
|
||
import static java.lang.annotation.RetentionPolicy.RUNTIME; | ||
|
||
@Retention(RUNTIME) | ||
public @interface HighSecurity { | ||
} |
17 changes: 17 additions & 0 deletions
17
archunit-example/src/main/java/com/tngtech/archunit/example/core/VeryCentralCore.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.tngtech.archunit.example.core; | ||
|
||
import com.tngtech.archunit.example.SomeOtherBusinessInterface; | ||
import com.tngtech.archunit.example.web.AnnotatedController; | ||
|
||
@HighSecurity | ||
@SuppressWarnings("unused") | ||
public class VeryCentralCore implements SomeOtherBusinessInterface { | ||
public static final String DO_CORE_STUFF_METHOD_NAME = "doCoreStuff"; | ||
|
||
public void doCoreStuff() { | ||
} | ||
|
||
void coreDoingIllegalStuff() { | ||
new AnnotatedController(); | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
archunit-example/src/test/java/com/tngtech/archunit/exampletest/SingleClassTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package com.tngtech.archunit.exampletest; | ||
|
||
import com.tngtech.archunit.core.domain.JavaClasses; | ||
import com.tngtech.archunit.core.importer.ClassFileImporter; | ||
import com.tngtech.archunit.example.ClassViolatingCodingRules; | ||
import com.tngtech.archunit.example.SomeOtherBusinessInterface; | ||
import com.tngtech.archunit.example.core.CoreSatellite; | ||
import com.tngtech.archunit.example.core.HighSecurity; | ||
import com.tngtech.archunit.example.core.VeryCentralCore; | ||
import org.junit.Test; | ||
import org.junit.experimental.categories.Category; | ||
|
||
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; | ||
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass; | ||
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.theClass; | ||
|
||
@Category(Example.class) | ||
public class SingleClassTest { | ||
private static final JavaClasses classes = new ClassFileImporter().importPackagesOf(ClassViolatingCodingRules.class); | ||
|
||
@Test | ||
public void core_should_only_be_accessed_by_satellites() { | ||
theClass(VeryCentralCore.class) | ||
.should().onlyBeAccessed().byClassesThat().implement(CoreSatellite.class) | ||
.check(classes); | ||
} | ||
|
||
@Test | ||
public void core_should_only_access_classes_in_core_itself() { | ||
noClass(VeryCentralCore.class) | ||
.should().accessClassesThat().resideOutsideOfPackages("..core..", "java..") | ||
.check(classes); | ||
} | ||
|
||
@Test | ||
public void the_only_class_with_high_security_is_central_core() { | ||
classes() | ||
.that().areAnnotatedWith(HighSecurity.class) | ||
.should().be(VeryCentralCore.class) | ||
.check(classes); | ||
} | ||
|
||
@Test | ||
public void central_core_should_not_implement_some_business_interface() { | ||
classes() | ||
.that().implement(SomeOtherBusinessInterface.class) | ||
.should().notBe(VeryCentralCore.class) | ||
.check(classes); | ||
} | ||
} |
68 changes: 68 additions & 0 deletions
68
...ation-test/src/test/java/com/tngtech/archunit/integration/SingleClassIntegrationTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package com.tngtech.archunit.integration; | ||
|
||
import com.tngtech.archunit.example.EvilCoreAccessor; | ||
import com.tngtech.archunit.example.SomeOtherBusinessInterface; | ||
import com.tngtech.archunit.example.controller.WronglyAnnotated; | ||
import com.tngtech.archunit.example.core.CoreSatellite; | ||
import com.tngtech.archunit.example.core.HighSecurity; | ||
import com.tngtech.archunit.example.core.VeryCentralCore; | ||
import com.tngtech.archunit.example.web.AnnotatedController; | ||
import com.tngtech.archunit.exampletest.SingleClassTest; | ||
import com.tngtech.archunit.junit.ExpectedViolation; | ||
import org.junit.Rule; | ||
|
||
import static com.tngtech.archunit.example.core.VeryCentralCore.DO_CORE_STUFF_METHOD_NAME; | ||
import static com.tngtech.archunit.junit.ExpectedAccess.callFrom; | ||
import static com.tngtech.archunit.junit.ExpectedClass.javaClass; | ||
|
||
public class SingleClassIntegrationTest extends SingleClassTest { | ||
@Rule | ||
public final ExpectedViolation expectedViolation = ExpectedViolation.none(); | ||
|
||
@Override | ||
public void core_should_only_be_accessed_by_satellites() { | ||
expectedViolation | ||
.ofRule(String.format("the class %s should only be accessed by classes that implement %s", | ||
VeryCentralCore.class.getName(), CoreSatellite.class.getName())) | ||
.by(callFrom(EvilCoreAccessor.class, "iShouldNotAccessCore") | ||
.toConstructor(VeryCentralCore.class) | ||
.inLine(8)) | ||
.by(callFrom(EvilCoreAccessor.class, "iShouldNotAccessCore") | ||
.toMethod(VeryCentralCore.class, DO_CORE_STUFF_METHOD_NAME) | ||
.inLine(8)); | ||
|
||
super.core_should_only_be_accessed_by_satellites(); | ||
} | ||
|
||
@Override | ||
public void core_should_only_access_classes_in_core_itself() { | ||
expectedViolation | ||
.ofRule(String.format("no class %s should access classes that reside outside of packages ['..core..', 'java..']", | ||
VeryCentralCore.class.getName())) | ||
.by(callFrom(VeryCentralCore.class, "coreDoingIllegalStuff") | ||
.toConstructor(AnnotatedController.class) | ||
.inLine(15)); | ||
|
||
super.core_should_only_access_classes_in_core_itself(); | ||
} | ||
|
||
@Override | ||
public void the_only_class_with_high_security_is_central_core() { | ||
expectedViolation | ||
.ofRule(String.format("classes that are annotated with @%s should be %s", | ||
HighSecurity.class.getSimpleName(), VeryCentralCore.class.getName())) | ||
.by(javaClass(WronglyAnnotated.class).notBeing(VeryCentralCore.class)); | ||
|
||
super.the_only_class_with_high_security_is_central_core(); | ||
} | ||
|
||
@Override | ||
public void central_core_should_not_implement_some_business_interface() { | ||
expectedViolation | ||
.ofRule(String.format("classes that implement %s should not be %s", | ||
SomeOtherBusinessInterface.class.getName(), VeryCentralCore.class.getName())) | ||
.by(javaClass(VeryCentralCore.class).being(VeryCentralCore.class)); | ||
|
||
super.central_core_should_not_implement_some_business_interface(); | ||
} | ||
} |
29 changes: 29 additions & 0 deletions
29
archunit-integration-test/src/test/java/com/tngtech/archunit/junit/ExpectedClass.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.tngtech.archunit.junit; | ||
|
||
public class ExpectedClass { | ||
public static Creator javaClass(Class<?> clazz) { | ||
return new Creator(clazz); | ||
} | ||
|
||
public static class Creator { | ||
private final Class<?> clazz; | ||
|
||
private Creator(Class<?> clazz) { | ||
this.clazz = clazz; | ||
} | ||
|
||
public ExpectedMessage notBeing(Class<?> desiredClass) { | ||
String expectedMessage = String.format( | ||
"class %s is not %s in (%s.java:0)", | ||
clazz.getName(), desiredClass.getName(), clazz.getSimpleName()); | ||
return new ExpectedMessage(expectedMessage); | ||
} | ||
|
||
public ExpectedMessage being(Class<?> desiredClass) { | ||
String expectedMessage = String.format( | ||
"class %s is %s in (%s.java:0)", | ||
clazz.getName(), desiredClass.getName(), clazz.getSimpleName()); | ||
return new ExpectedMessage(expectedMessage); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.