Skip to content

Commit 03107c6

Browse files
committed
Feat: Add service implementation assertions to TUnit library
1 parent 325b081 commit 03107c6

6 files changed

+290
-44
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// ---------------------------------------------------------------------------------------------------------------------
2+
// Imports
3+
// ---------------------------------------------------------------------------------------------------------------------
4+
using Microsoft.Extensions.DependencyInjection;
5+
using TUnit.Assertions.AssertConditions;
6+
7+
namespace CodeOfChaos.Testing.TUnit.Conditions.Library;
8+
// ---------------------------------------------------------------------------------------------------------------------
9+
// Code
10+
// ---------------------------------------------------------------------------------------------------------------------
11+
public class ContainsServiceImplementationCondition(Type serviceType, Type serviceImplementation) : BaseAssertCondition<IServiceCollection> {
12+
// -----------------------------------------------------------------------------------------------------------------
13+
// Methods
14+
// -----------------------------------------------------------------------------------------------------------------
15+
protected override string GetExpectation() => $"to have a registered service \"{serviceType.Name}\"";
16+
17+
protected override ValueTask<AssertionResult> GetResult(IServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18+
if (actualValue is null) return AssertionResult.Fail($"{nameof(IServiceCollection)} is null");
19+
20+
return actualValue.Any(d => d.ServiceType == serviceType && d.ImplementationType == serviceImplementation)
21+
? AssertionResult.Passed
22+
: FailWithMessage($"No service with type {serviceType.Name} has been registered.");
23+
}
24+
}

src/CodeOfChaos.Testing.TUnit/Conditions/Library/ContainsServiceTypeCondition.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ namespace CodeOfChaos.Testing.TUnit.Conditions.Library;
88
// ---------------------------------------------------------------------------------------------------------------------
99
// Code
1010
// ---------------------------------------------------------------------------------------------------------------------
11-
public class ContainsServiceTypeCondition<TServiceKey> : BaseAssertCondition<ServiceCollection> {
11+
public class ContainsServiceTypeCondition(Type serviceType) : BaseAssertCondition<IServiceCollection> {
1212
// -----------------------------------------------------------------------------------------------------------------
1313
// Methods
1414
// -----------------------------------------------------------------------------------------------------------------
15-
protected override string GetExpectation() => $"to have a registered service \"{typeof(TServiceKey).Name}\"";
16-
17-
protected override ValueTask<AssertionResult> GetResult(ServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18-
if (actualValue is null) return AssertionResult.Fail($"{nameof(ServiceCollection)} is null");
19-
return actualValue.Any(d => d.ServiceType == typeof(TServiceKey))
20-
? AssertionResult.Passed
21-
: FailWithMessage($"No service with type {typeof(TServiceKey).Name} has been registered.");
15+
protected override string GetExpectation() => $"to have a registered service \"{serviceType.Name}\"";
16+
17+
protected override ValueTask<AssertionResult> GetResult(IServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18+
if (actualValue is null) return AssertionResult.Fail($"{nameof(IServiceCollection)} is null");
19+
20+
return actualValue.Any(d => d.ServiceType == serviceType)
21+
? AssertionResult.Passed
22+
: FailWithMessage($"No service with type {serviceType.Name} has been registered.");
2223
}
2324
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// ---------------------------------------------------------------------------------------------------------------------
2+
// Imports
3+
// ---------------------------------------------------------------------------------------------------------------------
4+
using Microsoft.Extensions.DependencyInjection;
5+
using TUnit.Assertions.AssertConditions;
6+
7+
namespace CodeOfChaos.Testing.TUnit.Conditions.Library;
8+
// ---------------------------------------------------------------------------------------------------------------------
9+
// Code
10+
// ---------------------------------------------------------------------------------------------------------------------
11+
public class DoesNotContainServiceImplementationCondition(Type serviceType, Type serviceImplementation) : BaseAssertCondition<IServiceCollection> {
12+
// -----------------------------------------------------------------------------------------------------------------
13+
// Methods
14+
// -----------------------------------------------------------------------------------------------------------------
15+
protected override string GetExpectation() => $"to have a registered service \"{serviceType.Name}\"";
16+
17+
protected override ValueTask<AssertionResult> GetResult(IServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18+
if (actualValue is null) return AssertionResult.Fail($"{nameof(IServiceCollection)} is null");
19+
20+
return actualValue.Any(d => d.ServiceType == serviceType && d.ImplementationType == serviceImplementation)
21+
? FailWithMessage($"No service with type {serviceType.Name} has been registered.")
22+
: AssertionResult.Passed;
23+
}
24+
}

src/CodeOfChaos.Testing.TUnit/Conditions/Library/DoesNotContainServiceTypeCondition.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ namespace CodeOfChaos.Testing.TUnit.Conditions.Library;
88
// ---------------------------------------------------------------------------------------------------------------------
99
// Code
1010
// ---------------------------------------------------------------------------------------------------------------------
11-
public class DoesNotContainServiceTypeCondition<TServiceKey> : BaseAssertCondition<ServiceCollection> {
11+
public class DoesNotContainServiceTypeCondition(Type serviceType) : BaseAssertCondition<IServiceCollection> {
1212
// -----------------------------------------------------------------------------------------------------------------
1313
// Methods
1414
// -----------------------------------------------------------------------------------------------------------------
15-
protected override string GetExpectation() => $"to have a registered service \"{typeof(TServiceKey).Name}\"";
16-
17-
protected override ValueTask<AssertionResult> GetResult(ServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18-
if (actualValue is null) return AssertionResult.Fail($"{nameof(ServiceCollection)} is null");
19-
return actualValue.All(d => d.ServiceType != typeof(TServiceKey))
20-
? AssertionResult.Passed
21-
: FailWithMessage($"No service with type {typeof(TServiceKey).Name} has been registered.");
15+
protected override string GetExpectation() => $"to have a registered service \"{serviceType.Name}\"";
16+
17+
protected override ValueTask<AssertionResult> GetResult(IServiceCollection? actualValue, Exception? exception, AssertionMetadata assertionMetadata) {
18+
if (actualValue is null) return AssertionResult.Fail($"{nameof(IServiceCollection)} is null");
19+
20+
return actualValue.Any(d => d.ServiceType == serviceType)
21+
? FailWithMessage($"No service with type {serviceType.Name} has been registered.")
22+
: AssertionResult.Passed;
2223
}
2324
}

src/CodeOfChaos.Testing.TUnit/Extensions/TUnitExtensionsServiceCollection.cs

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,49 @@ namespace CodeOfChaos.Testing.TUnit;
1313
// ---------------------------------------------------------------------------------------------------------------------
1414
// ReSharper disable once InconsistentNaming
1515
public static class TUnitExtensionsServiceCollection {
16-
public static InvokableValueAssertionBuilder<ServiceCollection> ContainsServiceType<TServiceType>(this IValueSource<ServiceCollection> valueSource, [CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = "") {
17-
return valueSource.RegisterAssertion(
18-
new ContainsServiceTypeCondition<TServiceType>(),
19-
[doNotPopulateThisValue1]
20-
);
21-
}
16+
#region ContainsService
17+
public static InvokableValueAssertionBuilder<IServiceCollection> ContainsServiceType<TServiceType>(this IValueSource<IServiceCollection> valueSource, [CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = "")
18+
=> valueSource.RegisterAssertion(new ContainsServiceTypeCondition(typeof(TServiceType)), [doNotPopulateThisValue1]);
19+
20+
public static InvokableValueAssertionBuilder<IServiceCollection> ContainsServiceType(this IValueSource<IServiceCollection> valueSource, Type serviceType, [CallerArgumentExpression(nameof(serviceType))] string doNotPopulateThisValue1 = "")
21+
=> valueSource.RegisterAssertion(new ContainsServiceTypeCondition(serviceType), [doNotPopulateThisValue1]);
22+
23+
public static InvokableValueAssertionBuilder<IServiceCollection> DoesNotContainServiceType<TServiceType>(this IValueSource<IServiceCollection> valueSource, [CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = "")
24+
=> valueSource.RegisterAssertion(new DoesNotContainServiceTypeCondition(typeof(TServiceType)), [doNotPopulateThisValue1]);
25+
26+
public static InvokableValueAssertionBuilder<IServiceCollection> DoesNotContainServiceType(this IValueSource<IServiceCollection> valueSource, Type serviceType, [CallerArgumentExpression(nameof(serviceType))] string doNotPopulateThisValue1 = "")
27+
=> valueSource.RegisterAssertion(new DoesNotContainServiceTypeCondition(serviceType), [doNotPopulateThisValue1]);
28+
#endregion
29+
30+
#region ContainsServiceImplementation
31+
public static InvokableValueAssertionBuilder<IServiceCollection> ContainsServiceImplementation<TService, TImplementation>(
32+
this IValueSource<IServiceCollection> valueSource,
33+
[CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = ""
34+
)
35+
=> valueSource.RegisterAssertion(new ContainsServiceImplementationCondition(typeof(TService), typeof(TImplementation)), [doNotPopulateThisValue1]);
2236

23-
public static InvokableValueAssertionBuilder<ServiceCollection> DoesNotContainServiceType<TServiceType>(this IValueSource<ServiceCollection> valueSource, [CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = "") {
24-
return valueSource.RegisterAssertion(
25-
new DoesNotContainServiceTypeCondition<TServiceType>(),
26-
[doNotPopulateThisValue1]
27-
);
28-
}
37+
public static InvokableValueAssertionBuilder<IServiceCollection> ContainsServiceImplementation(
38+
this IValueSource<IServiceCollection> valueSource,
39+
Type serviceType,
40+
Type implementationType,
41+
[CallerArgumentExpression(nameof(serviceType))] string doNotPopulateThisValue1 = ""
42+
)
43+
=> valueSource.RegisterAssertion(new ContainsServiceImplementationCondition(serviceType, implementationType), [doNotPopulateThisValue1]);
44+
45+
public static InvokableValueAssertionBuilder<IServiceCollection> DoesNotContainServiceImplementation<TService, TImplementation>(
46+
this IValueSource<IServiceCollection> valueSource,
47+
[CallerArgumentExpression(nameof(valueSource))] string doNotPopulateThisValue1 = ""
48+
)
49+
=> valueSource.RegisterAssertion(new DoesNotContainServiceImplementationCondition(typeof(TService), typeof(TImplementation)), [doNotPopulateThisValue1]);
50+
51+
public static InvokableValueAssertionBuilder<IServiceCollection> DoesNotContainServiceImplementation(
52+
this IValueSource<IServiceCollection> valueSource,
53+
Type serviceType,
54+
Type implementationType,
55+
[CallerArgumentExpression(nameof(serviceType))] string doNotPopulateThisValue1 = ""
56+
)
57+
=> valueSource.RegisterAssertion(new DoesNotContainServiceImplementationCondition(serviceType, implementationType), [doNotPopulateThisValue1]);
58+
#endregion
59+
60+
2961
}

0 commit comments

Comments
 (0)