Skip to content

Commit ac3c399

Browse files
Merge pull request #339 from ljb/xunit-v3
Add Support for xunit.v3
2 parents 5506ac5 + 0f45065 commit ac3c399

File tree

10 files changed

+315
-0
lines changed

10 files changed

+315
-0
lines changed

ArchUnit.sln

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OtherLoaderTestAssembly", "
3434
EndProject
3535
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FilteredDirectoryLoaderTestAssembly", "TestAssemblies\FilteredDirectoryLoaderTestAssembly\FilteredDirectoryLoaderTestAssembly.csproj", "{E6CB8C69-25F5-4C94-8EA3-D56E444EB46B}"
3636
EndProject
37+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchUnitNET.xUnitV3", "ArchUnitNET.xUnitV3\ArchUnitNET.xUnitV3.csproj", "{5DE11135-0C27-41B4-BC34-9CB17BF335A7}"
38+
EndProject
39+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchUnitNET.xUnitTests", "ArchUnitNET.xUnitTests\ArchUnitNET.xUnitTests.csproj", "{E226D0D5-E50A-4E9C-A30F-F4747299D614}"
40+
EndProject
41+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchUnitNET.xUnitV3Tests", "ArchUnitNET.xUnitV3Tests\ArchUnitNET.xUnitV3Tests.csproj", "{439E00CE-5CB8-4474-9A27-3FFC5770DB7C}"
42+
EndProject
3743
Global
3844
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3945
Debug|Any CPU = Debug|Any CPU
@@ -100,6 +106,18 @@ Global
100106
{E6CB8C69-25F5-4C94-8EA3-D56E444EB46B}.Debug|Any CPU.Build.0 = Debug|Any CPU
101107
{E6CB8C69-25F5-4C94-8EA3-D56E444EB46B}.Release|Any CPU.ActiveCfg = Release|Any CPU
102108
{E6CB8C69-25F5-4C94-8EA3-D56E444EB46B}.Release|Any CPU.Build.0 = Release|Any CPU
109+
{5DE11135-0C27-41B4-BC34-9CB17BF335A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
110+
{5DE11135-0C27-41B4-BC34-9CB17BF335A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
111+
{5DE11135-0C27-41B4-BC34-9CB17BF335A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
112+
{5DE11135-0C27-41B4-BC34-9CB17BF335A7}.Release|Any CPU.Build.0 = Release|Any CPU
113+
{E226D0D5-E50A-4E9C-A30F-F4747299D614}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
114+
{E226D0D5-E50A-4E9C-A30F-F4747299D614}.Debug|Any CPU.Build.0 = Debug|Any CPU
115+
{E226D0D5-E50A-4E9C-A30F-F4747299D614}.Release|Any CPU.ActiveCfg = Release|Any CPU
116+
{E226D0D5-E50A-4E9C-A30F-F4747299D614}.Release|Any CPU.Build.0 = Release|Any CPU
117+
{439E00CE-5CB8-4474-9A27-3FFC5770DB7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
118+
{439E00CE-5CB8-4474-9A27-3FFC5770DB7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
119+
{439E00CE-5CB8-4474-9A27-3FFC5770DB7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
120+
{439E00CE-5CB8-4474-9A27-3FFC5770DB7C}.Release|Any CPU.Build.0 = Release|Any CPU
103121
EndGlobalSection
104122
GlobalSection(SolutionProperties) = preSolution
105123
HideSolutionNode = FALSE
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net9.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
<Company>TNG Technology Consulting GmbH</Company>
7+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
12+
<PackageReference Include="xunit" Version="2.9.3" />
13+
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\ArchUnitNET.xUnit\ArchUnitNET.xUnit.csproj" />
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using ArchUnitNET.Domain;
2+
using ArchUnitNET.Fluent;
3+
using ArchUnitNET.Fluent.Extensions;
4+
using ArchUnitNET.Loader;
5+
using ArchUnitNET.xUnit;
6+
using Xunit;
7+
using static ArchUnitNET.Fluent.ArchRuleDefinition;
8+
9+
namespace ArchUnitNET.xUnitTests
10+
{
11+
public class RuleEvaluationTests
12+
{
13+
private readonly Architecture _architecture;
14+
private readonly string _expectedErrorMessage;
15+
private readonly IArchRule _falseRule;
16+
private readonly IArchRule _trueRule;
17+
18+
public RuleEvaluationTests()
19+
{
20+
_architecture = new ArchLoader()
21+
.LoadAssemblies(System.Reflection.Assembly.Load("ArchUnitNET.xUnitTests"))
22+
.Build();
23+
_trueRule = Classes().That().Are(typeof(RuleEvaluationTests)).Should().Exist();
24+
_falseRule = Classes().That().Are(typeof(RuleEvaluationTests)).Should().NotExist();
25+
_expectedErrorMessage = _falseRule.Evaluate(_architecture).ToErrorMessage();
26+
}
27+
28+
[Fact]
29+
public void ArchRuleAssertTest()
30+
{
31+
ArchRuleAssert.CheckRule(_architecture, _trueRule);
32+
Assert.Throws<FailedArchRuleException>(
33+
() => ArchRuleAssert.CheckRule(_architecture, _falseRule)
34+
);
35+
Assert.Equal(
36+
_expectedErrorMessage,
37+
Assert
38+
.Throws<FailedArchRuleException>(
39+
() => ArchRuleAssert.CheckRule(_architecture, _falseRule)
40+
)
41+
.Message
42+
);
43+
}
44+
45+
[Fact]
46+
public void ArchRuleExtensionsTest()
47+
{
48+
_architecture.CheckRule(_trueRule);
49+
_trueRule.Check(_architecture);
50+
Assert.Throws<FailedArchRuleException>(() => _architecture.CheckRule(_falseRule));
51+
Assert.Throws<FailedArchRuleException>(() => _falseRule.Check(_architecture));
52+
Assert.Equal(
53+
_expectedErrorMessage,
54+
Assert
55+
.Throws<FailedArchRuleException>(() => _architecture.CheckRule(_falseRule))
56+
.Message
57+
);
58+
Assert.Equal(
59+
_expectedErrorMessage,
60+
Assert
61+
.Throws<FailedArchRuleException>(() => _falseRule.Check(_architecture))
62+
.Message
63+
);
64+
}
65+
}
66+
}

ArchUnitNET.xUnitV3/ArchRuleAssert.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using ArchUnitNET.Domain;
2+
using ArchUnitNET.Fluent;
3+
4+
// ReSharper disable once CheckNamespace
5+
namespace ArchUnitNET.xUnitV3
6+
{
7+
public static class ArchRuleAssert
8+
{
9+
/// <summary>
10+
/// Verifies that the architecture meets the criteria of the archrule.
11+
/// </summary>
12+
/// <param name="architecture">The architecture to be tested</param>
13+
/// <param name="archRule">The rule to test the architecture with</param>
14+
/// <exception cref="FailedArchRuleException">Thrown if the rule is violated</exception>
15+
public static void CheckRule(Architecture architecture, IArchRule archRule)
16+
{
17+
if (!archRule.HasNoViolations(architecture))
18+
{
19+
throw new FailedArchRuleException(architecture, archRule);
20+
}
21+
}
22+
}
23+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using ArchUnitNET.Domain;
2+
using ArchUnitNET.Fluent;
3+
4+
// ReSharper disable once CheckNamespace
5+
namespace ArchUnitNET.xUnitV3
6+
{
7+
public static class ArchRuleExtensions
8+
{
9+
/// <summary>
10+
/// Verifies that the architecture meets the criteria of the archrule.
11+
/// </summary>
12+
/// <param name="archRule">The rule to test the architecture with</param>
13+
/// <param name="architecture">The architecture to be tested</param>
14+
public static void Check(this IArchRule archRule, Architecture architecture)
15+
{
16+
ArchRuleAssert.CheckRule(architecture, archRule);
17+
}
18+
19+
/// <summary>
20+
/// Verifies that the architecture meets the criteria of the archrule.
21+
/// </summary>
22+
/// <param name="architecture">The architecture to be tested</param>
23+
/// <param name="archRule">The rule to test the architecture with</param>
24+
public static void CheckRule(this Architecture architecture, IArchRule archRule)
25+
{
26+
ArchRuleAssert.CheckRule(architecture, archRule);
27+
}
28+
}
29+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
5+
<IsPackable>true</IsPackable>
6+
<Title>ArchUnit C# xUnit v3 Extension</Title>
7+
<Description>xUnit v3 Extension for the C# Version of ArchUnit (see: archunit.org)</Description>
8+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
9+
<RepositoryUrl>https://github.com/TNG/ArchUnitNET</RepositoryUrl>
10+
<PackageTags>test;arch;archunit;xunit</PackageTags>
11+
<IncludeSource>False</IncludeSource>
12+
<Company>TNG Technology Consulting GmbH</Company>
13+
<PackageId>TngTech.ArchUnitNET.xUnitV3</PackageId>
14+
<IsTestProject>false</IsTestProject>
15+
<IncludeSymbols>true</IncludeSymbols>
16+
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
17+
<PackageReadmeFile>README.md</PackageReadmeFile>
18+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
19+
<RootNamespace>ArchUnitNET.xUnitV3</RootNamespace>
20+
</PropertyGroup>
21+
22+
<ItemGroup>
23+
<ProjectReference Include="..\ArchUnitNET\ArchUnitNET.csproj"/>
24+
</ItemGroup>
25+
26+
<ItemGroup>
27+
<PackageReference Include="xunit.v3.assert" Version="1.1.0"/>
28+
<PackageReference Include="System.Net.Http" Version="4.3.4"/>
29+
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1"/>
30+
</ItemGroup>
31+
32+
<ItemGroup>
33+
<None Include="..\Logo\ArchUnitNET-Logo.png">
34+
<Pack>true</Pack>
35+
<PackagePath>/Logo/</PackagePath>
36+
<Link>ArchUnitNET-Logo.png</Link>
37+
</None>
38+
<None Include="..\README.md">
39+
<Pack>true</Pack>
40+
<PackagePath></PackagePath>
41+
<Link>README.md</Link>
42+
</None>
43+
</ItemGroup>
44+
45+
</Project>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Collections.Generic;
2+
using ArchUnitNET.Domain;
3+
using ArchUnitNET.Fluent;
4+
using ArchUnitNET.Fluent.Extensions;
5+
using Xunit.Sdk;
6+
7+
// ReSharper disable once CheckNamespace
8+
namespace ArchUnitNET.xUnitV3
9+
{
10+
public class FailedArchRuleException : XunitException
11+
{
12+
/// <summary>
13+
/// Creates a new instance of the <see href="FailedArchRuleException" /> class.
14+
/// </summary>
15+
/// <param name="architecture">The architecture which was tested</param>
16+
/// <param name="archRule">The archrule that failed</param>
17+
public FailedArchRuleException(Architecture architecture, IArchRule archRule)
18+
: this(archRule.Evaluate(architecture)) { }
19+
20+
/// <summary>
21+
/// Creates a new instance of the <see href="FailedArchRuleException" /> class.
22+
/// </summary>
23+
/// <param name="evaluationResults">The results of the evaluation of the archrule</param>
24+
public FailedArchRuleException(IEnumerable<EvaluationResult> evaluationResults)
25+
: base(evaluationResults.ToErrorMessage()) { }
26+
}
27+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net9.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
<Company>TNG Technology Consulting GmbH</Company>
7+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0"/>
12+
<PackageReference Include="xunit.v3" Version="1.1.0"/>
13+
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2"/>
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\ArchUnitNET.xUnitV3\ArchUnitNET.xUnitV3.csproj"/>
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using ArchUnitNET.Domain;
2+
using ArchUnitNET.Fluent;
3+
using ArchUnitNET.Fluent.Extensions;
4+
using ArchUnitNET.Loader;
5+
using ArchUnitNET.xUnitV3;
6+
using Xunit;
7+
using static ArchUnitNET.Fluent.ArchRuleDefinition;
8+
9+
namespace ArchUnitNET.xUnitV3Tests
10+
{
11+
public class RuleEvaluationTests
12+
{
13+
private readonly Architecture _architecture;
14+
private readonly string _expectedErrorMessage;
15+
private readonly IArchRule _falseRule;
16+
private readonly IArchRule _trueRule;
17+
18+
public RuleEvaluationTests()
19+
{
20+
_architecture = new ArchLoader()
21+
.LoadAssemblies(System.Reflection.Assembly.Load("ArchUnitNET.xUnitV3Tests"))
22+
.Build();
23+
_trueRule = Classes().That().Are(typeof(RuleEvaluationTests)).Should().Exist();
24+
_falseRule = Classes().That().Are(typeof(RuleEvaluationTests)).Should().NotExist();
25+
_expectedErrorMessage = _falseRule.Evaluate(_architecture).ToErrorMessage();
26+
}
27+
28+
[Fact]
29+
public void ArchRuleAssertTest()
30+
{
31+
ArchRuleAssert.CheckRule(_architecture, _trueRule);
32+
Assert.Throws<FailedArchRuleException>(
33+
() => ArchRuleAssert.CheckRule(_architecture, _falseRule)
34+
);
35+
Assert.Equal(
36+
_expectedErrorMessage,
37+
Assert
38+
.Throws<FailedArchRuleException>(
39+
() => ArchRuleAssert.CheckRule(_architecture, _falseRule)
40+
)
41+
.Message
42+
);
43+
}
44+
45+
[Fact]
46+
public void ArchRuleExtensionsTest()
47+
{
48+
_architecture.CheckRule(_trueRule);
49+
_trueRule.Check(_architecture);
50+
Assert.Throws<FailedArchRuleException>(() => _architecture.CheckRule(_falseRule));
51+
Assert.Throws<FailedArchRuleException>(() => _falseRule.Check(_architecture));
52+
Assert.Equal(
53+
_expectedErrorMessage,
54+
Assert
55+
.Throws<FailedArchRuleException>(() => _architecture.CheckRule(_falseRule))
56+
.Message
57+
);
58+
Assert.Equal(
59+
_expectedErrorMessage,
60+
Assert
61+
.Throws<FailedArchRuleException>(() => _falseRule.Check(_architecture))
62+
.Message
63+
);
64+
}
65+
}
66+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ If you want to use xUnit, NUnit or MSTestV2 for your unit tests, you should inst
2020

2121
```
2222
PS> Install-Package TngTech.ArchUnitNET.xUnit
23+
PS> Install-Package TngTech.ArchUnitNET.xUnitV3
2324
PS> Install-Package TngTech.ArchUnitNET.NUnit
2425
PS> Install-Package TngTech.ArchUnitNET.MSTestV2
2526
```

0 commit comments

Comments
 (0)