// ReSharper disable InconsistentNaming
// ReSharper disable SuggestVarOrType_SimpleTypes
using ArchUnitNET.Domain;
using ArchUnitNET.Fluent;
using ArchUnitNET.Loader;
using ArchUnitNET.xUnit;
using Xunit;
using static ArchUnitNET.Fluent.ArchRuleDefinition;
namespace ExampleTest
{
public class ExampleArchUnitTest
{
// TIP: load your architecture once at the start to maximize performance of your tests
private static readonly Architecture Architecture = new ArchLoader()
.LoadAssemblies(System.Reflection.Assembly.Load("TestAssembly"))
.Build();
// replace and with classes from the assemblies you want to test
//declare variables you'll use throughout your tests up here
//use As() to give them a custom description
private readonly IObjectProvider ExampleLayer = Types()
.That()
.ResideInAssembly("ExampleAssembly")
.As("Example Layer");
private readonly IObjectProvider ExampleClasses = Classes()
.That()
.ImplementInterface(typeof(IExampleInterface))
.As("Example Classes");
private readonly IObjectProvider ForbiddenLayer = Types()
.That()
.ResideInNamespace("ForbiddenNamespace")
.As("Forbidden Layer");
private readonly IObjectProvider ForbiddenInterfaces = Interfaces()
.That()
.HaveFullNameContaining("forbidden")
.As("Forbidden Interfaces");
private readonly IObjectProvider TypoLayer = Types()
.That()
.ResideInNamespace("TypoNamespace")
.As("Non-existing Typo Layer");
//write some tests
[Fact(Skip = "This is just a syntax example, it does not actually work")]
public void TypesShouldBeInCorrectLayer()
{
//you can use the fluent API to write your own rules
IArchRule exampleClassesShouldBeInExampleLayer = Classes()
.That()
.Are(ExampleClasses)
.Should()
.Be(ExampleLayer);
IArchRule forbiddenInterfacesShouldBeInForbiddenLayer = Interfaces()
.That()
.Are(ForbiddenInterfaces)
.Should()
.Be(ForbiddenLayer);
//check if your architecture fulfils your rules
exampleClassesShouldBeInExampleLayer.Check(Architecture);
forbiddenInterfacesShouldBeInForbiddenLayer.Check(Architecture);
//you can also combine your rules
IArchRule combinedArchRule = exampleClassesShouldBeInExampleLayer.And(
forbiddenInterfacesShouldBeInForbiddenLayer
);
combinedArchRule.Check(Architecture);
}
[Fact(Skip = "This is just a syntax example, it does not actually work")]
public void ExampleLayerShouldNotAccessForbiddenLayer()
{
//you can give your rules a custom reason, which is displayed when it fails (together with the types that failed the rule)
IArchRule exampleLayerShouldNotAccessForbiddenLayer = Types()
.That()
.Are(ExampleLayer)
.Should()
.NotDependOnAny(ForbiddenLayer)
.Because("it's forbidden");
exampleLayerShouldNotAccessForbiddenLayer.Check(Architecture);
}
[Fact(Skip = "This is just a syntax example, it does not actually work")]
public void TypoLayerShouldViolateByDefault()
{
// test the new default case
IArchRule typoLayerShouldFailByDefault = Types()
.That()
.Are(TypoLayer)
.Should()
.NotDependOnAny(ForbiddenLayer)
.Because("typo layer does not exist");
Assert.False(typoLayerShouldFailByDefault.HasNoViolations(Architecture));
// test the active assertion (with implicit exemption)
IArchRule typoLayerShouldDefinitelyNotExist = Types()
.That()
.Are(TypoLayer)
.Should()
.NotExist()
.Because("typo layer simply is not there");
Assert.True(typoLayerShouldDefinitelyNotExist.HasNoViolations(Architecture));
// test the explicit exemption
IArchRule typoLayerCanCauseNoViolations = Types()
.That()
.Are(TypoLayer)
.Should()
.NotDependOnAny(ForbiddenLayer)
.Because("typo layer does not exist and causes no violation")
.WithoutRequiringPositiveResults();
Assert.True(typoLayerCanCauseNoViolations.HasNoViolations(Architecture));
}
[Fact(Skip = "This is just a syntax example, it does not actually work")]
public void ForbiddenClassesShouldHaveCorrectName()
{
Classes()
.That()
.AreAssignableTo(ForbiddenInterfaces)
.Should()
.HaveNameContaining("forbidden")
.Check(Architecture);
}
[Fact(Skip = "This is just a syntax example, it does not actually work")]
public void ExampleClassesShouldNotCallForbiddenMethods()
{
Classes()
.That()
.Are(ExampleClasses)
.Should()
.NotCallAny(
MethodMembers()
.That()
.AreDeclaredIn(ForbiddenLayer)
.Or()
.HaveNameContaining("forbidden")
)
.Check(Architecture);
}
}
}
internal class ExampleClass { }
internal class ForbiddenClass { }
internal interface IExampleInterface { }