Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Pipeline/Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ partial class Build : NukeBuild
/// <para />
/// Afterward, you can update the package reference in `Directory.Packages.props` and reset this flag.
/// </summary>
readonly BuildScope BuildScope = BuildScope.Default;
readonly BuildScope BuildScope = BuildScope.CoreOnly;

[Parameter("Github Token")] readonly string GithubToken;

Expand Down
24 changes: 24 additions & 0 deletions Source/aweXpect.Core/Core/MemberAccessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,29 @@ public static MemberAccessor<TSource, TTarget> FromFunc(
Func<TSource, TTarget> func, string name)
=> new(func, name);

/// <summary>
/// Creates a member accessor from the given <paramref name="func" />.
/// </summary>
public static MemberAccessor<TSource, TTarget> FromFuncAsMemberAccessor(
Func<TSource, TTarget> func, string name)
=> new(func, ExtractMemberPath(name.Trim()));

private static string ExtractMemberPath(string expression)
{
// Example: "x => x.Foo" would result in ".Foo"
int idx = expression.IndexOf("=>", StringComparison.Ordinal);
if (idx > 0)
{
string? prefix = expression.Substring(0, idx).Trim();
idx = expression.IndexOf(prefix, idx, StringComparison.Ordinal);
if (idx > 0)
{
expression = expression.Substring(idx + prefix.Length).TrimStart();
}
}

return $"{expression} ";
}

internal TTarget AccessMember(TSource value) => _accessor.Invoke(value);
}
9 changes: 5 additions & 4 deletions Source/aweXpect.Core/Delegates/ThatDelegateThrows.Whose.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
using aweXpect.Core;
using aweXpect.Results;

Expand All @@ -11,10 +11,11 @@ public partial class ThatDelegateThrows<TException>
/// Verifies the <paramref name="expectations" /> on the member selected by the <paramref name="memberSelector" />.
/// </summary>
public AndOrResult<TException, ThatDelegateThrows<TException>> Whose<TMember>(
Expression<Func<TException, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<TException, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
=> new(ExpectationBuilder.ForMember(
MemberAccessor<TException, TMember?>.FromExpression(memberSelector),
MemberAccessor<TException, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, expectation) => expectation.Append("whose ").Append(member))
.AddExpectations(e => expectations(new ThatSubject<TMember?>(e))),
this);
Expand Down
16 changes: 9 additions & 7 deletions Source/aweXpect.Core/Results/AndOrWhichResult.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
using aweXpect.Core;

namespace aweXpect.Results;
Expand Down Expand Up @@ -38,11 +38,12 @@ public class AndOrWhichResult<TType, TThat, TSelf>(
/// </summary>
public AdditionalAndOrWhichResult
Which<TMember>(
Expression<Func<TType, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<TType, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
=> new(
_expectationBuilder
.ForMember(MemberAccessor<TType, TMember?>.FromExpression(memberSelector),
.ForMember(MemberAccessor<TType, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, stringBuilder) => stringBuilder.Append(" which ").Append(member))
.AddExpectations(e => expectations(new ThatSubject<TMember?>(e))),
_returnValue);
Expand All @@ -67,14 +68,15 @@ public class AdditionalAndOrWhichResult(
/// </summary>
public AdditionalAndOrWhichResult
AndWhich<TMember>(
Expression<Func<TType, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<TType, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
{
_expectationBuilder.And(" and");
return new AdditionalAndOrWhichResult(
_expectationBuilder
.ForMember(
MemberAccessor<TType, TMember?>.FromExpression(memberSelector),
MemberAccessor<TType, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, stringBuilder) => stringBuilder.Append(" which ").Append(member))
.AddExpectations(e
=> expectations(new ThatSubject<TMember?>(e))),
Expand Down
16 changes: 9 additions & 7 deletions Source/aweXpect.Core/Results/AndOrWhoseResult.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
using aweXpect.Core;

namespace aweXpect.Results;
Expand Down Expand Up @@ -38,11 +38,12 @@ public class AndOrWhoseResult<TType, TThat, TSelf>(
/// </summary>
public AdditionalAndOrWhoseResult
Whose<TMember>(
Expression<Func<TType, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<TType, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
=> new(
_expectationBuilder
.ForMember(MemberAccessor<TType, TMember?>.FromExpression(memberSelector),
.ForMember(MemberAccessor<TType, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, stringBuilder) => stringBuilder.Append(" whose ").Append(member))
.AddExpectations(e => expectations(new ThatSubject<TMember?>(e))),
_returnValue);
Expand All @@ -67,14 +68,15 @@ public class AdditionalAndOrWhoseResult(
/// </summary>
public AdditionalAndOrWhoseResult
AndWhose<TMember>(
Expression<Func<TType, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<TType, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
{
_expectationBuilder.And(" and");
return new AdditionalAndOrWhoseResult(
_expectationBuilder
.ForMember(
MemberAccessor<TType, TMember?>.FromExpression(memberSelector),
MemberAccessor<TType, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, stringBuilder) => stringBuilder.Append(" whose ").Append(member))
.AddExpectations(e
=> expectations(new ThatSubject<TMember?>(e))),
Expand Down
9 changes: 5 additions & 4 deletions Source/aweXpect/That/ThatGeneric.For.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
using aweXpect.Core;
using aweXpect.Helpers;
using aweXpect.Results;
Expand All @@ -13,13 +13,14 @@ public static partial class ThatGeneric
/// </summary>
public static AndOrResult<T, IThat<T>> For<T, TMember>(
this IThat<T> source,
Expression<Func<T, TMember?>> memberSelector,
Action<IThat<TMember?>> expectations)
Func<T, TMember?> memberSelector,
Action<IThat<TMember?>> expectations,
[CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "")
{
ExpectationBuilder expectationBuilder = source.Get().ExpectationBuilder;
expectationBuilder
.ForMember(
MemberAccessor<T, TMember?>.FromExpression(memberSelector),
MemberAccessor<T, TMember?>.FromFuncAsMemberAccessor(memberSelector, doNotPopulateThisValue),
(member, stringBuilder) => stringBuilder.Append("for ").Append(member))
.AddExpectations(e => expectations(new ThatSubject<TMember?>(e)));
return new AndOrResult<T, IThat<T>>(expectationBuilder, source);
Expand Down
2 changes: 1 addition & 1 deletion Tests/aweXpect.Api.Tests/Expected/aweXpect_net8.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -678,7 +678,7 @@ namespace aweXpect
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> CompliesWith<T>(this aweXpect.Core.IThat<T> source, System.Action<aweXpect.Core.IThat<T>> expectations) { }
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> DoesNotComplyWith<T>(this aweXpect.Core.IThat<T> source, System.Action<aweXpect.Core.IThat<T>> expectations) { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> DoesNotSatisfy<T>(this aweXpect.Core.IThat<T> source, System.Func<T, bool> predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> For<T, TMember>(this aweXpect.Core.IThat<T> source, System.Linq.Expressions.Expression<System.Func<T, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> For<T, TMember>(this aweXpect.Core.IThat<T> source, System.Func<T, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> Satisfies<T>(this aweXpect.Core.IThat<T> source, System.Func<T, bool> predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { }
}
public static class ThatGuid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ namespace aweXpect
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> CompliesWith<T>(this aweXpect.Core.IThat<T> source, System.Action<aweXpect.Core.IThat<T>> expectations) { }
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> DoesNotComplyWith<T>(this aweXpect.Core.IThat<T> source, System.Action<aweXpect.Core.IThat<T>> expectations) { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> DoesNotSatisfy<T>(this aweXpect.Core.IThat<T> source, System.Func<T, bool> predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> For<T, TMember>(this aweXpect.Core.IThat<T> source, System.Linq.Expressions.Expression<System.Func<T, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public static aweXpect.Results.AndOrResult<T, aweXpect.Core.IThat<T>> For<T, TMember>(this aweXpect.Core.IThat<T> source, System.Func<T, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
public static aweXpect.Results.RepeatedCheckResult<T, aweXpect.Core.IThat<T>> Satisfies<T>(this aweXpect.Core.IThat<T> source, System.Func<T, bool> predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { }
}
public static class ThatGuid
Expand Down
11 changes: 6 additions & 5 deletions Tests/aweXpect.Core.Api.Tests/Expected/aweXpect.Core_net8.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ namespace aweXpect.Core
{
public static aweXpect.Core.MemberAccessor<TSource, TTarget?> FromExpression(System.Linq.Expressions.Expression<System.Func<TSource, TTarget?>> expression) { }
public static aweXpect.Core.MemberAccessor<TSource, TTarget> FromFunc(System.Func<TSource, TTarget> func, string name) { }
public static aweXpect.Core.MemberAccessor<TSource, TTarget> FromFuncAsMemberAccessor(System.Func<TSource, TTarget> func, string name) { }
}
public class ResultContext
{
Expand Down Expand Up @@ -490,7 +491,7 @@ namespace aweXpect.Delegates
public aweXpect.Core.ExpectationBuilder ExpectationBuilder { get; }
public aweXpect.Core.IThat<TException> Which { get; }
public aweXpect.Delegates.ThatDelegateThrows<TException?> OnlyIf(bool predicate) { }
public aweXpect.Results.AndOrResult<TException, aweXpect.Delegates.ThatDelegateThrows<TException>> Whose<TMember>(System.Linq.Expressions.Expression<System.Func<TException, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public aweXpect.Results.AndOrResult<TException, aweXpect.Delegates.ThatDelegateThrows<TException>> Whose<TMember>(System.Func<TException, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
public aweXpect.Results.AndOrResult<TException, aweXpect.Delegates.ThatDelegateThrows<TException>> WithInner(System.Type innerExceptionType) { }
public aweXpect.Results.AndOrResult<TException, aweXpect.Delegates.ThatDelegateThrows<TException>> WithInner(System.Type innerExceptionType, System.Action<aweXpect.Core.IThat<System.Exception?>> expectations) { }
public aweXpect.Results.AndOrResult<TException, aweXpect.Delegates.ThatDelegateThrows<TException>> WithInner<TInnerException>()
Expand Down Expand Up @@ -918,11 +919,11 @@ namespace aweXpect.Results
where TSelf : aweXpect.Results.AndOrWhichResult<TType, TThat, TSelf>
{
public AndOrWhichResult(aweXpect.Core.ExpectationBuilder expectationBuilder, TThat returnValue) { }
public aweXpect.Results.AndOrWhichResult<TType, TThat, TSelf>.AdditionalAndOrWhichResult Which<TMember>(System.Linq.Expressions.Expression<System.Func<TType, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public aweXpect.Results.AndOrWhichResult<TType, TThat, TSelf>.AdditionalAndOrWhichResult Which<TMember>(System.Func<TType, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
public class AdditionalAndOrWhichResult : aweXpect.Results.AndOrResult<TType, TThat, TSelf>
{
public AdditionalAndOrWhichResult(aweXpect.Core.ExpectationBuilder expectationBuilder, TThat returnValue) { }
public aweXpect.Results.AndOrWhichResult<TType, TThat, TSelf>.AdditionalAndOrWhichResult AndWhich<TMember>(System.Linq.Expressions.Expression<System.Func<TType, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public aweXpect.Results.AndOrWhichResult<TType, TThat, TSelf>.AdditionalAndOrWhichResult AndWhich<TMember>(System.Func<TType, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
}
}
public class AndOrWhoseResult<TType, TThat> : aweXpect.Results.AndOrWhoseResult<TType, TThat, aweXpect.Results.AndOrWhoseResult<TType, TThat>>
Expand All @@ -933,11 +934,11 @@ namespace aweXpect.Results
where TSelf : aweXpect.Results.AndOrWhoseResult<TType, TThat, TSelf>
{
public AndOrWhoseResult(aweXpect.Core.ExpectationBuilder expectationBuilder, TThat returnValue) { }
public aweXpect.Results.AndOrWhoseResult<TType, TThat, TSelf>.AdditionalAndOrWhoseResult Whose<TMember>(System.Linq.Expressions.Expression<System.Func<TType, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public aweXpect.Results.AndOrWhoseResult<TType, TThat, TSelf>.AdditionalAndOrWhoseResult Whose<TMember>(System.Func<TType, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
public class AdditionalAndOrWhoseResult : aweXpect.Results.AndOrResult<TType, TThat, TSelf>
{
public AdditionalAndOrWhoseResult(aweXpect.Core.ExpectationBuilder expectationBuilder, TThat returnValue) { }
public aweXpect.Results.AndOrWhoseResult<TType, TThat, TSelf>.AdditionalAndOrWhoseResult AndWhose<TMember>(System.Linq.Expressions.Expression<System.Func<TType, TMember?>> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations) { }
public aweXpect.Results.AndOrWhoseResult<TType, TThat, TSelf>.AdditionalAndOrWhoseResult AndWhose<TMember>(System.Func<TType, TMember?> memberSelector, System.Action<aweXpect.Core.IThat<TMember?>> expectations, [System.Runtime.CompilerServices.CallerArgumentExpression("memberSelector")] string doNotPopulateThisValue = "") { }
}
}
public class AndResult<TThat> : aweXpect.Results.ExpectationResult
Expand Down
Loading