diff --git a/src/MockHttp/Extensions/RequestMatchingExtensions.cs b/src/MockHttp/Extensions/RequestMatchingExtensions.cs index a07c387..9d8a5d4 100644 --- a/src/MockHttp/Extensions/RequestMatchingExtensions.cs +++ b/src/MockHttp/Extensions/RequestMatchingExtensions.cs @@ -19,20 +19,6 @@ namespace MockHttp; /// public static class RequestMatchingExtensions { - private static bool ContainsWildcard(this string value) - { - if (value is null) - { - throw new ArgumentNullException(nameof(value)); - } - -#if NETSTANDARD2_0 - return value.Contains("*"); -#else - return value.Contains('*', StringComparison.InvariantCultureIgnoreCase); -#endif - } - /// /// Matches a request by specified . /// @@ -49,29 +35,7 @@ string requestUri ) #pragma warning restore CA1054 { - return builder.RequestUri(requestUri, true); - } - - /// - /// Matches a request by specified . - /// - /// The request matching builder instance. - /// The request URI or a URI wildcard. - /// to allow wildcards, or if exact matching. - /// The request matching builder instance. -#pragma warning disable CA1054 - // For now, keep this internal. For coverage, and most likely, the API will change so then we'd have more to deprecate (using patterns). - internal static IRequestMatching RequestUri(this IRequestMatching builder, string requestUri, bool allowWildcards) -#pragma warning restore CA1054 - { - if (requestUri is null) - { - throw new ArgumentNullException(nameof(requestUri)); - } - - return allowWildcards && requestUri.ContainsWildcard() - ? builder.RequestUri(Matches.Wildcard(requestUri)) - : builder.RequestUri(new Uri(requestUri, DotNetRelativeOrAbsolute)); + return builder.RequestUri(new Uri(requestUri, DotNetRelativeOrAbsolute)); } /// @@ -119,7 +83,13 @@ static bool IsRelativeUriMatch(Uri expectedUri, Uri uri) /// The request matching builder instance. /// The string matcher to use to match the request URI. /// The request matching builder instance. - private static IRequestMatching RequestUri(this IRequestMatching builder, Matches requestUri) + public static IRequestMatching RequestUri( + this IRequestMatching builder, +#if NET8_0_OR_GREATER + [StringSyntax(StringSyntaxAttribute.Uri)] +#endif + Matches requestUri + ) { if (builder is null) { diff --git a/src/MockHttp/Matchers/Matches.cs b/src/MockHttp/Matchers/Matches.cs index 599ee8c..bb534bc 100644 --- a/src/MockHttp/Matchers/Matches.cs +++ b/src/MockHttp/Matchers/Matches.cs @@ -8,7 +8,7 @@ namespace MockHttp.Matchers; /// /// A string matcher encapsulating a delegate and 'pretty' name for debug/display needs when reporting errors to the user. /// -internal readonly record struct Matches : IStringMatcher +public readonly record struct Matches : IStringMatcher { [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string _value; diff --git a/test/MockHttp.Server.Tests/MockHttpServerTests.cs b/test/MockHttp.Server.Tests/MockHttpServerTests.cs index 943e9a4..1f0c2af 100644 --- a/test/MockHttp.Server.Tests/MockHttpServerTests.cs +++ b/test/MockHttp.Server.Tests/MockHttpServerTests.cs @@ -4,6 +4,7 @@ using MockHttp.Fixtures; using MockHttp.FluentAssertions; using MockHttp.Http; +using MockHttp.Matchers; using Xunit.Abstractions; namespace MockHttp; @@ -107,7 +108,7 @@ public static IEnumerable RequestResponseTestCases() [ (Action)(m => m .When(matching => matching - .RequestUri("*path/child*") + .RequestUri(Matches.Wildcard("*path/child*")) .QueryString("?key=value") ) .Respond(with => with.Body("has content")) diff --git a/test/MockHttp.Testing/Specs/PublicApiSpec.cs b/test/MockHttp.Testing/Specs/PublicApiSpec.cs index 7b66371..0c70af0 100644 --- a/test/MockHttp.Testing/Specs/PublicApiSpec.cs +++ b/test/MockHttp.Testing/Specs/PublicApiSpec.cs @@ -17,7 +17,10 @@ public abstract class PublicApiSpec ExcludeAttributes = [ typeof(InternalsVisibleToAttribute).FullName!, - typeof(ExcludeFromCodeCoverageAttribute).FullName! + typeof(ExcludeFromCodeCoverageAttribute).FullName!, +#if NET8_0_OR_GREATER + typeof(MemberNotNullAttribute).FullName! +#endif ], DenyNamespacePrefixes = [] }; diff --git a/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs b/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs index 32e73ed..1139e4b 100644 --- a/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs +++ b/test/MockHttp.Tests/Extensions/RequestMatchingExtensionsTests.cs @@ -23,118 +23,36 @@ protected RequestMatchingExtensionsTests() public class RequestUri : RequestMatchingExtensionsTests { [Theory] - [InlineData("", false, "http://127.0.0.1", true)] - [InlineData("", false, "http://127.0.0.1/", true)] - [InlineData("", true, "http://127.0.0.1", true)] - [InlineData("", true, "http://127.0.0.1/", true)] - [InlineData("/", false, "http://127.0.0.1", true)] - [InlineData("/", false, "http://127.0.0.1/", true)] - [InlineData("/", true, "http://127.0.0.1", true)] - [InlineData("/", true, "http://127.0.0.1/", true)] - - [InlineData("relative.htm", true, "http://127.0.0.1/relative.htm", true)] - [InlineData("relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("relative.htm", false, "http://127.0.0.1/relative.htm", true)] - [InlineData("relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)] - - [InlineData("/relative.htm", true, "http://127.0.0.1/relative.htm", true)] - [InlineData("/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("/relative.htm", false, "http://127.0.0.1/relative.htm", true)] - [InlineData("/relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)] - - [InlineData("relative.htm?query=string", true, "http://127.0.0.1/relative.htm?query=string", true)] - [InlineData("relative.htm?query=string", false, "http://127.0.0.1/relative.htm?query=string", true)] - [InlineData("http://127.0.0.1/absolute.htm?query=string", true, "http://127.0.0.1/absolute.htm?query=string", true)] - [InlineData("http://127.0.0.1/absolute.htm?query=string", false, "http://127.0.0.1/absolute.htm?query=string", true)] - - [InlineData("/folder/relative.htm", true, "http://127.0.0.1/relative.htm", false)] - [InlineData("/folder/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("/folder/relative.htm", false, "http://127.0.0.1/relative.htm", false)] - [InlineData("/folder/relative.htm", false, "http://127.0.0.1/relative.htm?query=string", false)] - - [InlineData("relative.htm", true, "http://127.0.0.1/folder/relative.htm", false)] - [InlineData("relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("relative.htm", false, "http://127.0.0.1/folder/relative.htm", false)] - [InlineData("relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)] - - [InlineData("folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm", true)] - [InlineData("folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm", true)] - [InlineData("folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)] - - [InlineData("/folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm", true)] - [InlineData("/folder/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("/folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm", true)] - [InlineData("/folder/relative.htm", false, "http://127.0.0.1/folder/relative.htm?query=string", false)] - - [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/absolute.htm", true)] - [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/absolute.htm?query=string", false)] - [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/absolute.htm", true)] - [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/absolute.htm?query=string", false)] - - [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm", false)] - [InlineData("http://127.0.0.1/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)] - [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm", false)] - [InlineData("http://127.0.0.1/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm?query=string", false)] - - [InlineData("http://127.0.0.1/folder/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm", true)] - [InlineData("http://127.0.0.1/folder/absolute.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)] - [InlineData("http://127.0.0.1/folder/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm", true)] - [InlineData("http://127.0.0.1/folder/absolute.htm", false, "http://127.0.0.1/folder/absolute.htm?query=string", false)] - - [InlineData("*.htm", true, "http://127.0.0.1/relative.htm", true)] - [InlineData("*.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("*.htm", false, "http://127.0.0.1/relative.htm", false)] - - [InlineData("*/relative.htm", true, "http://127.0.0.1/relative.htm", true)] - [InlineData("*/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("*/relative.htm", false, "http://127.0.0.1/relative.htm", false)] - - [InlineData("/*/relative.htm", true, "http://127.0.0.1/folder/relative.htm", false)] - [InlineData("/*/relative.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("/*/relative.htm", false, "http://127.0.0.1/folder/relative.htm", false)] - - [InlineData("/*/relative.htm", true, "http://127.0.0.1/relative.htm", false)] - [InlineData("/*/relative.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("/*/relative.htm", false, "http://127.0.0.1/relative.htm", false)] - - [InlineData("/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm", false)] - [InlineData("/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("/folder/*.htm", false, "http://127.0.0.1/folder/relative.htm", false)] - - [InlineData("*/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm", true)] - [InlineData("*/folder/*.htm", true, "http://127.0.0.1/folder/relative.htm?query=string", false)] - [InlineData("*/folder/*.htm", false, "http://127.0.0.1/folder/relative.htm", false)] - - [InlineData("/folder/*.htm", true, "http://127.0.0.1/relative.htm", false)] - [InlineData("/folder/*.htm", true, "http://127.0.0.1/relative.htm?query=string", false)] - [InlineData("/folder/*.htm", false, "http://127.0.0.1/relative.htm", false)] - - [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm", false)] - [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm?query=string", false)] - [InlineData("/*/*/relative.*", false, "http://127.0.0.1/folder1/folder2/relative.htm", false)] - - [InlineData("*/folder1/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm", true)] - [InlineData("*/folder1/*/relative.*", true, "http://127.0.0.1/folder1/folder2/relative.htm?query=string", true)] - [InlineData("*/folder1/*/relative.*", false, "http://127.0.0.1/folder1/folder2/relative.htm", false)] - - [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/relative.htm", false)] - [InlineData("/*/*/relative.*", true, "http://127.0.0.1/folder1/relative.htm?query=string", false)] - [InlineData("/*/*/relative.*", false, "http://127.0.0.1/folder1/relative.htm", false)] - - [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/absolute.htm", true)] - [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/absolute.htm?query=string", false)] - [InlineData("http://127.0.0.1/*.htm", false, "http://127.0.0.1/absolute.htm", false)] - - [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/folder/absolute.htm", true)] - [InlineData("http://127.0.0.1/*.htm", true, "http://127.0.0.1/folder/absolute.htm?query=string", false)] - [InlineData("http://127.0.0.1/*.htm", false, "http://127.0.0.1/folder/absolute.htm", false)] - public async Task When_configuring_requestUri_as_string_it_should_match(string uriString, bool allowWildcards, string requestUri, bool isMatch) + [InlineData("", "http://127.0.0.1", true)] + [InlineData("", "http://127.0.0.1/", true)] + [InlineData("/", "http://127.0.0.1", true)] + [InlineData("/", "http://127.0.0.1/", true)] + [InlineData("relative.htm", "http://127.0.0.1/relative.htm", true)] + [InlineData("relative.htm", "http://127.0.0.1/relative.htm?query=string", false)] + [InlineData("/relative.htm", "http://127.0.0.1/relative.htm", true)] + [InlineData("/relative.htm", "http://127.0.0.1/relative.htm?query=string", false)] + [InlineData("relative.htm?query=string", "http://127.0.0.1/relative.htm?query=string", true)] + [InlineData("http://127.0.0.1/absolute.htm?query=string", "http://127.0.0.1/absolute.htm?query=string", true)] + [InlineData("/folder/relative.htm", "http://127.0.0.1/relative.htm", false)] + [InlineData("/folder/relative.htm", "http://127.0.0.1/relative.htm?query=string", false)] + [InlineData("relative.htm", "http://127.0.0.1/folder/relative.htm", false)] + [InlineData("relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)] + [InlineData("folder/relative.htm", "http://127.0.0.1/folder/relative.htm", true)] + [InlineData("folder/relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)] + [InlineData("/folder/relative.htm", "http://127.0.0.1/folder/relative.htm", true)] + [InlineData("/folder/relative.htm", "http://127.0.0.1/folder/relative.htm?query=string", false)] + [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/absolute.htm", true)] + [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/absolute.htm?query=string", false)] + [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/folder/absolute.htm", false)] + [InlineData("http://127.0.0.1/absolute.htm", "http://127.0.0.1/folder/absolute.htm?query=string", false)] + [InlineData("http://127.0.0.1/folder/absolute.htm", "http://127.0.0.1/folder/absolute.htm", true)] + [InlineData("http://127.0.0.1/folder/absolute.htm", "http://127.0.0.1/folder/absolute.htm?query=string", false)] + public async Task When_configuring_requestUri_as_string_it_should_match(string uriString, string requestUri, bool isMatch) { var request = new HttpRequestMessage { RequestUri = new Uri(requestUri, UriKind.Absolute) }; // Act - _sut.RequestUri(uriString, allowWildcards); + _sut.RequestUri(uriString); IReadOnlyCollection matchers = _sut.Build(); // Assert @@ -169,18 +87,14 @@ public async Task When_configuring_requestUri_as_uri_it_should_match(string matc } [Theory] - [InlineData("*/controller/*", false)] - [InlineData("*/controller/*", true)] - [InlineData("file.jpg", true)] - [InlineData("file.jpg", false)] - [InlineData("http://0.0.0.0/path/file.jpg", true)] - [InlineData("http://0.0.0.0/path/file.jpg", false)] - public void When_formatting_uriString_matcher_it_should_return_human_readable_representation(string uriString, bool allowWildcards) + [InlineData("file.jpg")] + [InlineData("http://0.0.0.0/path/file.jpg")] + public void When_formatting_uriString_matcher_it_should_return_human_readable_representation(string uriString) { string expectedText = $"RequestUri: '{uriString}'"; // Act - _sut.RequestUri(uriString, allowWildcards); + _sut.RequestUri(uriString); IReadOnlyCollection matchers = _sut.Build(); string displayText = matchers.Should() .ContainSingle() @@ -859,8 +773,7 @@ public void Given_null_argument_when_executing_method_it_should_throw(params obj DelegateTestCase.Create( RequestMatchingExtensions.RequestUri, instance, - uri.ToString(), - true + Matches.Empty ), DelegateTestCase.Create( RequestMatchingExtensions.RequestUri, diff --git a/test/MockHttp.Tests/MockHttpHandlerTests.cs b/test/MockHttp.Tests/MockHttpHandlerTests.cs index e225ce5..32d9057 100644 --- a/test/MockHttp.Tests/MockHttpHandlerTests.cs +++ b/test/MockHttp.Tests/MockHttpHandlerTests.cs @@ -6,6 +6,7 @@ using MockHttp.Http; using MockHttp.Language; using MockHttp.Language.Flow; +using MockHttp.Matchers; using Newtonsoft.Json; namespace MockHttp; @@ -251,7 +252,7 @@ public async Task Given_number_of_requests_match_expected_callCount_when_verifyi // Act Action verifyGet = () => _sut.Verify( - matching => matching.RequestUri("**/url"), + matching => matching.RequestUri(Matches.Wildcard("**/url")), isSent ); @@ -293,7 +294,7 @@ public async Task Given_number_of_requests_does_not_match_expected_callCount_whe // Act Action verifyGet = () => _sut.Verify( - matching => matching.RequestUri("**/url"), + matching => matching.RequestUri(Matches.Wildcard("**/url")), isSent ); @@ -367,7 +368,7 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co _sut .When(matching => matching - .RequestUri("http://0.0.0.1/*/action*") + .RequestUri(Matches.Wildcard("http://0.0.0.1/*/action*")) .QueryString("test", "$%^&*") .QueryString("test2=value") .Method("POST") @@ -380,7 +381,7 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co .Version(version) .Any(any => any .RequestUri("not-matching") - .RequestUri("**controller**") + .RequestUri(Matches.Wildcard("**controller**")) ) .Where(r => 0 < r.Version.Major) ) @@ -418,7 +419,9 @@ public async Task Given_a_request_expectation_when_sending_requests_it_should_co HttpResponseMessage response = await _httpClient.SendAsync(req); // Assert - _sut.Verify(matching => matching.RequestUri("**/controller/**"), IsSent.Exactly(2), "we sent it"); +#pragma warning disable S6966 + _sut.Verify(matching => matching.RequestUri(Matches.Wildcard("**/controller/**")), IsSent.Exactly(2), "we sent it"); +#pragma warning restore S6966 #if !NETFRAMEWORK await _sut.VerifyAsync(matching => matching.Body(jsonPostContent), IsSent.Once, "we sent it"); #endif diff --git a/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt index 0a8f21e..de11935 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_10.0.verified.txt @@ -148,6 +148,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -386,6 +387,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex([System.Diagnostics.CodeAnalysis.StringSyntax("Regex")] string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response { diff --git a/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt index 546449f..50e3bac 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_8.0.verified.txt @@ -148,6 +148,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, [System.Diagnostics.CodeAnalysis.StringSyntax("Uri")] string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -386,6 +387,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex([System.Diagnostics.CodeAnalysis.StringSyntax("Regex")] string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response { diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt index 0432b85..179b5db 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.6.2.verified.txt @@ -147,6 +147,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -385,6 +386,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex(string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response { diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt index 0432b85..179b5db 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.7.2.verified.txt @@ -147,6 +147,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -385,6 +386,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex(string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response { diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt index 0432b85..179b5db 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.0_via_.NET_Framework_4.8.verified.txt @@ -147,6 +147,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -385,6 +386,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex(string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response { diff --git a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt index fd91946..8d9c771 100644 --- a/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt +++ b/test/MockHttp.Tests/PublicApi/.NET_Standard_2.1_via_.NET_6.0.verified.txt @@ -147,6 +147,7 @@ namespace MockHttp public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, System.Collections.Generic.IEnumerable values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, params string[] values) { } public static MockHttp.Language.IRequestMatching QueryString(this MockHttp.Language.IRequestMatching builder, string key, string? value) { } + public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, MockHttp.Matchers.Matches requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, System.Uri requestUri) { } public static MockHttp.Language.IRequestMatching RequestUri(this MockHttp.Language.IRequestMatching builder, string requestUri) { } public static MockHttp.Language.IRequestMatching Version(this MockHttp.Language.IRequestMatching builder, System.Version version) { } @@ -385,6 +386,26 @@ namespace MockHttp.Matchers bool IsExclusive { get; } System.Threading.Tasks.Task IsMatchAsync(MockHttp.MockHttpRequestContext requestContext); } + public readonly struct Matches : System.IEquatable + { + public required System.Func IsMatch { get; init; } + public required string Value { get; init; } + public static MockHttp.Matchers.Matches Any { get; } + public static MockHttp.Matchers.Matches Empty { get; } + public override string ToString() { } + public static MockHttp.Matchers.Matches Exactly(string value) { } + public static MockHttp.Matchers.Matches Expression(System.Linq.Expressions.Expression> expression) { } + public static MockHttp.Matchers.Matches Regex(System.Text.RegularExpressions.Regex regex) { } + public static MockHttp.Matchers.Matches Regex(string regex) { } + public static MockHttp.Matchers.Matches Wildcard(string value) { } + public static MockHttp.Matchers.Matches op_Implicit(string value) { } + public static MockHttp.Matchers.Matches operator !(MockHttp.Matchers.Matches matches) { } + public static MockHttp.Matchers.Matches operator &(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static MockHttp.Matchers.Matches operator ^(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + public static bool operator false(MockHttp.Matchers.Matches _) { } + public static bool operator true(MockHttp.Matchers.Matches _) { } + public static MockHttp.Matchers.Matches operator |(MockHttp.Matchers.Matches left, MockHttp.Matchers.Matches right) { } + } } namespace MockHttp.Response {