mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-21 16:01:18 +02:00
Added some more tests for JsonMatcher + refactored some code to use nullable (#770)
This commit is contained in:
@@ -0,0 +1,73 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that <see langword="null"/> is allowed as an input even if the
|
||||||
|
/// corresponding type disallows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(
|
||||||
|
AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property,
|
||||||
|
Inherited = false
|
||||||
|
)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class AllowNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="AllowNullAttribute"/> class.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public AllowNullAttribute() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that <see langword="null"/> is disallowed as an input even if the
|
||||||
|
/// corresponding type allows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(
|
||||||
|
AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property,
|
||||||
|
Inherited = false
|
||||||
|
)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class DisallowNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="DisallowNullAttribute"/> class.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public DisallowNullAttribute() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that a method that will never return under any circumstance.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class DoesNotReturnAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="DoesNotReturnAttribute"/> class.
|
||||||
|
/// </summary>
|
||||||
|
///
|
||||||
|
#endif
|
||||||
|
public DoesNotReturnAttribute() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that the method will not return if the associated <see cref="Boolean"/>
|
||||||
|
/// parameter is passed the specified value.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class DoesNotReturnIfAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the condition parameter value.
|
||||||
|
/// Code after the method is considered unreachable by diagnostics if the argument
|
||||||
|
/// to the associated parameter matches this value.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public bool ParameterValue { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="DoesNotReturnIfAttribute"/>
|
||||||
|
/// class with the specified parameter value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parameterValue">
|
||||||
|
/// The condition parameter value.
|
||||||
|
/// Code after the method is considered unreachable by diagnostics if the argument
|
||||||
|
/// to the associated parameter matches this value.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public DoesNotReturnIfAttribute(bool parameterValue)
|
||||||
|
{
|
||||||
|
ParameterValue = parameterValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that an output may be <see langword="null"/> even if the
|
||||||
|
/// corresponding type disallows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(
|
||||||
|
AttributeTargets.Field | AttributeTargets.Parameter |
|
||||||
|
AttributeTargets.Property | AttributeTargets.ReturnValue,
|
||||||
|
Inherited = false
|
||||||
|
)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class MaybeNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="MaybeNullAttribute"/> class.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public MaybeNullAttribute() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that when a method returns <see cref="ReturnValue"/>,
|
||||||
|
/// the parameter may be <see langword="null"/> even if the corresponding type disallows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class MaybeNullWhenAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the return value condition.
|
||||||
|
/// If the method returns this value, the associated parameter may be <see langword="null"/>.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public bool ReturnValue { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the specified return value condition.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="returnValue">
|
||||||
|
/// The return value condition.
|
||||||
|
/// If the method returns this value, the associated parameter may be <see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public MaybeNullWhenAttribute(bool returnValue)
|
||||||
|
{
|
||||||
|
ReturnValue = returnValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that the method or property will ensure that the listed field and property members have
|
||||||
|
/// not-<see langword="null"/> values.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class MemberNotNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets field or property member names.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public string[] Members { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with a field or property member.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="member">
|
||||||
|
/// The field or property member that is promised to be not-null.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public MemberNotNullAttribute(string member)
|
||||||
|
{
|
||||||
|
Members = new[] { member };
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the list of field and property members.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="members">
|
||||||
|
/// The list of field and property members that are promised to be not-null.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public MemberNotNullAttribute(params string[] members)
|
||||||
|
{
|
||||||
|
Members = members;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that the method or property will ensure that the listed field and property members have
|
||||||
|
/// non-<see langword="null"/> values when returning with the specified return value condition.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class MemberNotNullWhenAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the return value condition.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public bool ReturnValue { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets field or property member names.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public string[] Members { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the specified return value condition and a field or property member.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="returnValue">
|
||||||
|
/// The return value condition. If the method returns this value,
|
||||||
|
/// the associated parameter will not be <see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="member">
|
||||||
|
/// The field or property member that is promised to be not-<see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public MemberNotNullWhenAttribute(bool returnValue, string member)
|
||||||
|
{
|
||||||
|
ReturnValue = returnValue;
|
||||||
|
Members = new[] { member };
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the specified return value condition and list
|
||||||
|
/// of field and property members.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="returnValue">
|
||||||
|
/// The return value condition. If the method returns this value,
|
||||||
|
/// the associated parameter will not be <see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="members">
|
||||||
|
/// The list of field and property members that are promised to be not-null.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
|
||||||
|
{
|
||||||
|
ReturnValue = returnValue;
|
||||||
|
Members = members;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that an output is not <see langword="null"/> even if the
|
||||||
|
/// corresponding type allows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(
|
||||||
|
AttributeTargets.Field | AttributeTargets.Parameter |
|
||||||
|
AttributeTargets.Property | AttributeTargets.ReturnValue,
|
||||||
|
Inherited = false
|
||||||
|
)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class NotNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="NotNullAttribute"/> class.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public NotNullAttribute() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that the output will be non-<see langword="null"/> if the
|
||||||
|
/// named parameter is non-<see langword="null"/>.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(
|
||||||
|
AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue,
|
||||||
|
AllowMultiple = true,
|
||||||
|
Inherited = false
|
||||||
|
)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class NotNullIfNotNullAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the associated parameter name.
|
||||||
|
/// The output will be non-<see langword="null"/> if the argument to the
|
||||||
|
/// parameter specified is non-<see langword="null"/>.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public string ParameterName { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the associated parameter name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parameterName">
|
||||||
|
/// The associated parameter name.
|
||||||
|
/// The output will be non-<see langword="null"/> if the argument to the
|
||||||
|
/// parameter specified is non-<see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public NotNullIfNotNullAttribute(string parameterName)
|
||||||
|
{
|
||||||
|
ParameterName = parameterName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code file has automatically been added by the "Nullable" NuGet package (https://www.nuget.org/packages/Nullable).
|
||||||
|
// Please see https://github.com/manuelroemer/Nullable for more information.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// DO NOT DELETE THIS FILE if you are using a "packages.config" file to manage your NuGet references.
|
||||||
|
// Consider migrating to PackageReferences instead:
|
||||||
|
// https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference
|
||||||
|
// Migrating brings the following benefits:
|
||||||
|
// * The "Nullable" folder and the nullable "*Attribute.cs" files don't appear in your project.
|
||||||
|
// * The added files are immutable and can therefore not be modified by coincidence.
|
||||||
|
// * Updating/Uninstalling the package will work flawlessly.
|
||||||
|
// </auto-generated>
|
||||||
|
|
||||||
|
#region License
|
||||||
|
// MIT License
|
||||||
|
//
|
||||||
|
// Copyright (c) Manuel Römer
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#if !NULLABLE_ATTRIBUTES_DISABLE
|
||||||
|
#nullable enable
|
||||||
|
#pragma warning disable
|
||||||
|
|
||||||
|
namespace System.Diagnostics.CodeAnalysis
|
||||||
|
{
|
||||||
|
using global::System;
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies that when a method returns <see cref="ReturnValue"/>,
|
||||||
|
/// the parameter will not be <see langword="null"/> even if the corresponding type allows it.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
|
||||||
|
#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE
|
||||||
|
[DebuggerNonUserCode]
|
||||||
|
#endif
|
||||||
|
internal sealed class NotNullWhenAttribute : Attribute
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the return value condition.
|
||||||
|
/// If the method returns this value, the associated parameter will not be <see langword="null"/>.
|
||||||
|
/// </summary>
|
||||||
|
#endif
|
||||||
|
public bool ReturnValue { get; }
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the attribute with the specified return value condition.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="returnValue">
|
||||||
|
/// The return value condition.
|
||||||
|
/// If the method returns this value, the associated parameter will not be <see langword="null"/>.
|
||||||
|
/// </param>
|
||||||
|
#endif
|
||||||
|
public NotNullWhenAttribute(bool returnValue)
|
||||||
|
{
|
||||||
|
ReturnValue = returnValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning restore
|
||||||
|
#nullable restore
|
||||||
|
#endif // NULLABLE_ATTRIBUTES_DISABLE
|
||||||
@@ -54,23 +54,23 @@
|
|||||||
<Reference Include="HandlebarsDotNet.Helpers.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.Core.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Core.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.Core.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Core.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.DynamicLinq, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.DynamicLinq, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.DynamicLinq.2.3.3\lib\net452\HandlebarsDotNet.Helpers.DynamicLinq.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.DynamicLinq.2.3.5\lib\net452\HandlebarsDotNet.Helpers.DynamicLinq.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.Humanizer, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.Humanizer, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.Humanizer.2.3.3\lib\net452\HandlebarsDotNet.Helpers.Humanizer.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.Humanizer.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Humanizer.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.Json, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.Json, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.Json.2.3.3\lib\net452\HandlebarsDotNet.Helpers.Json.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.Json.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.Random, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.Random, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.Random.2.3.3\lib\net452\HandlebarsDotNet.Helpers.Random.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.Random.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Random.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.Xeger, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.Xeger, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.Xeger.2.3.3\lib\net452\HandlebarsDotNet.Helpers.Xeger.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.Xeger.2.3.5\lib\net452\HandlebarsDotNet.Helpers.Xeger.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="HandlebarsDotNet.Helpers.XPath, Version=2.3.3.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
<Reference Include="HandlebarsDotNet.Helpers.XPath, Version=2.3.5.0, Culture=neutral, PublicKeyToken=00d131fae0c250bc, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Handlebars.Net.Helpers.XPath.2.3.3\lib\net452\HandlebarsDotNet.Helpers.XPath.dll</HintPath>
|
<HintPath>..\..\packages\Handlebars.Net.Helpers.XPath.2.3.5\lib\net452\HandlebarsDotNet.Helpers.XPath.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Humanizer, Version=2.14.0.0, Culture=neutral, PublicKeyToken=979442b78dfc278e, processorArchitecture=MSIL">
|
<Reference Include="Humanizer, Version=2.14.0.0, Culture=neutral, PublicKeyToken=979442b78dfc278e, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Humanizer.Core.2.14.1\lib\netstandard2.0\Humanizer.dll</HintPath>
|
<HintPath>..\..\packages\Humanizer.Core.2.14.1\lib\netstandard2.0\Humanizer.dll</HintPath>
|
||||||
@@ -246,11 +246,23 @@
|
|||||||
<Reference Include="Microsoft.Net.Http.Headers, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Net.Http.Headers, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll</HintPath>
|
<HintPath>..\..\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Namotion.Reflection, Version=2.0.10.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\Namotion.Reflection.2.0.10\lib\net45\Namotion.Reflection.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="RandomDataGenerator, Version=1.0.13.0, Culture=neutral, PublicKeyToken=ae5c571d29a3b8d9, processorArchitecture=MSIL">
|
<Reference Include="NJsonSchema, Version=10.6.10.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\RandomDataGenerator.Net.1.0.14\lib\net45\RandomDataGenerator.dll</HintPath>
|
<HintPath>..\..\packages\NJsonSchema.10.6.10\lib\net45\NJsonSchema.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="NJsonSchema.Extensions, Version=0.1.0.0, Culture=neutral, PublicKeyToken=e52fadf300daf456, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\NJsonSchema.Extensions.0.1.0\lib\net45\NJsonSchema.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="NSwag.Core, Version=13.15.10.0, Culture=neutral, PublicKeyToken=c2d88086e098d109, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\NSwag.Core.13.15.10\lib\net45\NSwag.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="RandomDataGenerator, Version=1.0.15.0, Culture=neutral, PublicKeyToken=ae5c571d29a3b8d9, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\RandomDataGenerator.Net.1.0.15\lib\net45\RandomDataGenerator.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Scriban.Signed, Version=2.1.4.0, Culture=neutral, PublicKeyToken=5675fb69b15f2433, processorArchitecture=MSIL">
|
<Reference Include="Scriban.Signed, Version=2.1.4.0, Culture=neutral, PublicKeyToken=5675fb69b15f2433, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\Scriban.Signed.2.1.4\lib\net45\Scriban.Signed.dll</HintPath>
|
<HintPath>..\..\packages\Scriban.Signed.2.1.4\lib\net45\Scriban.Signed.dll</HintPath>
|
||||||
@@ -289,6 +301,10 @@
|
|||||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
<HintPath>..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Net" />
|
||||||
|
<Reference Include="System.Net.Http.Formatting, Version=5.2.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.8\lib\net45\System.Net.Http.Formatting.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Net.Http.WebRequest" />
|
<Reference Include="System.Net.Http.WebRequest" />
|
||||||
<Reference Include="System.Numerics" />
|
<Reference Include="System.Numerics" />
|
||||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
@@ -300,6 +316,7 @@
|
|||||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
<Reference Include="System.Security.Cryptography.Cng, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Security.Cryptography.Cng, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\System.Security.Cryptography.Cng.4.5.0\lib\net47\System.Security.Cryptography.Cng.dll</HintPath>
|
<HintPath>..\..\packages\System.Security.Cryptography.Cng.4.5.0\lib\net47\System.Security.Cryptography.Cng.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@@ -325,14 +342,14 @@
|
|||||||
<Reference Include="TinyMapper, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="TinyMapper, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\TinyMapper.3.0.3\lib\net40\TinyMapper.dll</HintPath>
|
<HintPath>..\..\packages\TinyMapper.3.0.3\lib\net40\TinyMapper.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="WireMock.Net, Version=1.4.41.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
<Reference Include="WireMock.Net, Version=1.5.1.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\WireMock.Net.1.4.41\lib\net461\WireMock.Net.dll</HintPath>
|
<HintPath>..\..\packages\WireMock.Net.1.5.1\lib\net461\WireMock.Net.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="WireMock.Net.Abstractions, Version=1.4.41.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
<Reference Include="WireMock.Net.Abstractions, Version=1.5.1.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\WireMock.Net.Abstractions.1.4.41\lib\net451\WireMock.Net.Abstractions.dll</HintPath>
|
<HintPath>..\..\packages\WireMock.Net.Abstractions.1.5.1\lib\net451\WireMock.Net.Abstractions.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="WireMock.Org.Abstractions, Version=1.4.41.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
<Reference Include="WireMock.Org.Abstractions, Version=1.5.1.0, Culture=neutral, PublicKeyToken=c8d65537854e1f03, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\WireMock.Org.Abstractions.1.4.41\lib\net45\WireMock.Org.Abstractions.dll</HintPath>
|
<HintPath>..\..\packages\WireMock.Org.Abstractions.1.5.1\lib\net45\WireMock.Org.Abstractions.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="XPath2, Version=1.1.3.0, Culture=neutral, PublicKeyToken=463c6d7fb740c7e5, processorArchitecture=MSIL">
|
<Reference Include="XPath2, Version=1.1.3.0, Culture=neutral, PublicKeyToken=463c6d7fb740c7e5, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\XPath2.1.1.3\lib\net452\XPath2.dll</HintPath>
|
<HintPath>..\..\packages\XPath2.1.1.3\lib\net452\XPath2.dll</HintPath>
|
||||||
@@ -351,6 +368,17 @@
|
|||||||
<Compile Include="..\WireMock.Net.Console.Net452.Classic\Program.cs">
|
<Compile Include="..\WireMock.Net.Console.Net452.Classic\Program.cs">
|
||||||
<Link>Program.cs</Link>
|
<Link>Program.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Nullable\AllowNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\DisallowNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\DoesNotReturnAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\DoesNotReturnIfAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\MaybeNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\MaybeNullWhenAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\MemberNotNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\MemberNotNullWhenAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\NotNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\NotNullIfNotNullAttribute.cs" />
|
||||||
|
<Compile Include="Nullable\NotNullWhenAttribute.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
<package id="Handlebars.Net" version="2.1.2" targetFramework="net472" />
|
<package id="Handlebars.Net" version="2.1.2" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers" version="2.3.5" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.Core" version="2.3.5" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.Core" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.DynamicLinq" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.DynamicLinq" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.Humanizer" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.Humanizer" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.Json" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.Json" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.Random" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.Random" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.Xeger" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.Xeger" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Handlebars.Net.Helpers.XPath" version="2.3.3" targetFramework="net472" />
|
<package id="Handlebars.Net.Helpers.XPath" version="2.3.5" targetFramework="net472" />
|
||||||
<package id="Humanizer" version="2.14.1" targetFramework="net472" />
|
<package id="Humanizer" version="2.14.1" targetFramework="net472" />
|
||||||
<package id="Humanizer.Core" version="2.14.1" targetFramework="net472" />
|
<package id="Humanizer.Core" version="2.14.1" targetFramework="net472" />
|
||||||
<package id="Humanizer.Core.af" version="2.14.1" targetFramework="net472" />
|
<package id="Humanizer.Core.af" version="2.14.1" targetFramework="net472" />
|
||||||
@@ -63,6 +63,7 @@
|
|||||||
<package id="Humanizer.Core.zh-Hant" version="2.14.1" targetFramework="net472" />
|
<package id="Humanizer.Core.zh-Hant" version="2.14.1" targetFramework="net472" />
|
||||||
<package id="JmesPath.Net" version="1.0.125" targetFramework="net472" />
|
<package id="JmesPath.Net" version="1.0.125" targetFramework="net472" />
|
||||||
<package id="log4net" version="2.0.14" targetFramework="net472" />
|
<package id="log4net" version="2.0.14" targetFramework="net472" />
|
||||||
|
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.8" targetFramework="net472" />
|
||||||
<package id="Microsoft.AspNetCore" version="2.2.0" targetFramework="net472" />
|
<package id="Microsoft.AspNetCore" version="2.2.0" targetFramework="net472" />
|
||||||
<package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.2.0" targetFramework="net472" />
|
<package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.2.0" targetFramework="net472" />
|
||||||
<package id="Microsoft.AspNetCore.Authentication.Core" version="2.2.0" targetFramework="net472" />
|
<package id="Microsoft.AspNetCore.Authentication.Core" version="2.2.0" targetFramework="net472" />
|
||||||
@@ -119,8 +120,13 @@
|
|||||||
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="6.12.2" targetFramework="net472" />
|
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="6.12.2" targetFramework="net472" />
|
||||||
<package id="Microsoft.IdentityModel.Tokens" version="6.12.2" targetFramework="net472" />
|
<package id="Microsoft.IdentityModel.Tokens" version="6.12.2" targetFramework="net472" />
|
||||||
<package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net472" />
|
<package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net472" />
|
||||||
|
<package id="Namotion.Reflection" version="2.0.10" targetFramework="net472" />
|
||||||
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
|
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
|
||||||
<package id="RandomDataGenerator.Net" version="1.0.14" targetFramework="net472" />
|
<package id="NJsonSchema" version="10.6.10" targetFramework="net472" />
|
||||||
|
<package id="NJsonSchema.Extensions" version="0.1.0" targetFramework="net472" />
|
||||||
|
<package id="NSwag.Core" version="13.15.10" targetFramework="net472" />
|
||||||
|
<package id="Nullable" version="1.3.0" targetFramework="net472" developmentDependency="true" />
|
||||||
|
<package id="RandomDataGenerator.Net" version="1.0.15" targetFramework="net472" />
|
||||||
<package id="Scriban.Signed" version="2.1.4" targetFramework="net472" />
|
<package id="Scriban.Signed" version="2.1.4" targetFramework="net472" />
|
||||||
<package id="SimMetrics.Net" version="1.0.5" targetFramework="net461" />
|
<package id="SimMetrics.Net" version="1.0.5" targetFramework="net461" />
|
||||||
<package id="Stef.Validation" version="0.1.0" targetFramework="net472" />
|
<package id="Stef.Validation" version="0.1.0" targetFramework="net472" />
|
||||||
@@ -141,9 +147,9 @@
|
|||||||
<package id="System.Threading.Tasks.Extensions" version="4.5.1" targetFramework="net472" />
|
<package id="System.Threading.Tasks.Extensions" version="4.5.1" targetFramework="net472" />
|
||||||
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
|
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
|
||||||
<package id="TinyMapper" version="3.0.3" targetFramework="net472" />
|
<package id="TinyMapper" version="3.0.3" targetFramework="net472" />
|
||||||
<package id="WireMock.Net" version="1.4.41" targetFramework="net472" />
|
<package id="WireMock.Net" version="1.5.1" targetFramework="net472" />
|
||||||
<package id="WireMock.Net.Abstractions" version="1.4.41" targetFramework="net472" />
|
<package id="WireMock.Net.Abstractions" version="1.5.1" targetFramework="net472" />
|
||||||
<package id="WireMock.Org.Abstractions" version="1.4.41" targetFramework="net472" />
|
<package id="WireMock.Org.Abstractions" version="1.5.1" targetFramework="net472" />
|
||||||
<package id="XPath2" version="1.1.3" targetFramework="net472" />
|
<package id="XPath2" version="1.1.3" targetFramework="net472" />
|
||||||
<package id="XPath2.Extensions" version="1.1.3" targetFramework="net472" />
|
<package id="XPath2.Extensions" version="1.1.3" targetFramework="net472" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -15,24 +15,24 @@ namespace WireMock.Admin.Mappings
|
|||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The methods
|
/// The method
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Method { get; set; }
|
public string Method { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the headers.
|
/// Gets or sets the headers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IDictionary<string, string> Headers { get; set; }
|
public IDictionary<string, string>? Headers { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the body.
|
/// Gets or sets the body.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Body { get; set; }
|
public string? Body { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the body (as JSON object).
|
/// Gets or sets the body (as JSON object).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public object BodyAsJson { get; set; }
|
public object? BodyAsJson { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use ResponseMessage Transformer.
|
/// Use ResponseMessage Transformer.
|
||||||
|
|||||||
@@ -5,60 +5,64 @@ using System.Net.Http;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
|
|
||||||
namespace WireMock.Http
|
namespace WireMock.Http;
|
||||||
|
|
||||||
|
internal static class HttpResponseMessageHelper
|
||||||
{
|
{
|
||||||
internal static class HttpResponseMessageHelper
|
public static async Task<ResponseMessage> CreateAsync(
|
||||||
|
HttpResponseMessage httpResponseMessage,
|
||||||
|
Uri requiredUri,
|
||||||
|
Uri originalUri,
|
||||||
|
bool deserializeJson,
|
||||||
|
bool decompressGzipAndDeflate)
|
||||||
{
|
{
|
||||||
public static async Task<ResponseMessage> CreateAsync(HttpResponseMessage httpResponseMessage, Uri requiredUri, Uri originalUri, bool deserializeJson, bool decompressGzipAndDeflate)
|
var responseMessage = new ResponseMessage { StatusCode = (int)httpResponseMessage.StatusCode };
|
||||||
|
|
||||||
|
// Set both content and response headers, replacing URLs in values
|
||||||
|
var headers = (httpResponseMessage.Content?.Headers.Union(httpResponseMessage.Headers) ?? Enumerable.Empty<KeyValuePair<string, IEnumerable<string>>>()).ToArray();
|
||||||
|
if (httpResponseMessage.Content != null)
|
||||||
{
|
{
|
||||||
var responseMessage = new ResponseMessage { StatusCode = (int)httpResponseMessage.StatusCode };
|
var stream = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
|
||||||
|
IEnumerable<string>? contentTypeHeader = null;
|
||||||
// Set both content and response headers, replacing URLs in values
|
if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase)))
|
||||||
var headers = (httpResponseMessage.Content?.Headers.Union(httpResponseMessage.Headers) ?? Enumerable.Empty<KeyValuePair<string, IEnumerable<string>>>()).ToArray();
|
|
||||||
if (httpResponseMessage.Content != null)
|
|
||||||
{
|
{
|
||||||
var stream = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
|
contentTypeHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase)).Value;
|
||||||
IEnumerable<string> contentTypeHeader = null;
|
|
||||||
if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase)))
|
|
||||||
{
|
|
||||||
contentTypeHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase)).Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerable<string> contentEncodingHeader = null;
|
|
||||||
if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)))
|
|
||||||
{
|
|
||||||
contentEncodingHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)).Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bodyParserSettings = new BodyParserSettings
|
|
||||||
{
|
|
||||||
Stream = stream,
|
|
||||||
ContentType = contentTypeHeader?.FirstOrDefault(),
|
|
||||||
DeserializeJson = deserializeJson,
|
|
||||||
ContentEncoding = contentEncodingHeader?.FirstOrDefault(),
|
|
||||||
DecompressGZipAndDeflate = decompressGzipAndDeflate
|
|
||||||
};
|
|
||||||
responseMessage.BodyData = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var header in headers)
|
IEnumerable<string>? contentEncodingHeader = null;
|
||||||
|
if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)))
|
||||||
{
|
{
|
||||||
// If Location header contains absolute redirect URL, and base URL is one that we proxy to,
|
contentEncodingHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)).Value;
|
||||||
// we need to replace it to original one.
|
|
||||||
if (string.Equals(header.Key, HttpKnownHeaderNames.Location, StringComparison.OrdinalIgnoreCase)
|
|
||||||
&& Uri.TryCreate(header.Value.First(), UriKind.Absolute, out Uri absoluteLocationUri)
|
|
||||||
&& string.Equals(absoluteLocationUri.Host, requiredUri.Host, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
var replacedLocationUri = new Uri(originalUri, absoluteLocationUri.PathAndQuery);
|
|
||||||
responseMessage.AddHeader(header.Key, replacedLocationUri.ToString());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
responseMessage.AddHeader(header.Key, header.Value.ToArray());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return responseMessage;
|
var bodyParserSettings = new BodyParserSettings
|
||||||
|
{
|
||||||
|
Stream = stream,
|
||||||
|
ContentType = contentTypeHeader?.FirstOrDefault(),
|
||||||
|
DeserializeJson = deserializeJson,
|
||||||
|
ContentEncoding = contentEncodingHeader?.FirstOrDefault(),
|
||||||
|
DecompressGZipAndDeflate = decompressGzipAndDeflate
|
||||||
|
};
|
||||||
|
responseMessage.BodyData = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var header in headers)
|
||||||
|
{
|
||||||
|
// If Location header contains absolute redirect URL, and base URL is one that we proxy to,
|
||||||
|
// we need to replace it to original one.
|
||||||
|
if (string.Equals(header.Key, HttpKnownHeaderNames.Location, StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& Uri.TryCreate(header.Value.First(), UriKind.Absolute, out Uri absoluteLocationUri)
|
||||||
|
&& string.Equals(absoluteLocationUri.Host, requiredUri.Host, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var replacedLocationUri = new Uri(originalUri, absoluteLocationUri.PathAndQuery);
|
||||||
|
responseMessage.AddHeader(header.Key, replacedLocationUri.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
responseMessage.AddHeader(header.Key, header.Value.ToArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return responseMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,9 +68,7 @@ public class JsonMatcher : IValueMatcher, IIgnoreCaseMatcher
|
|||||||
|
|
||||||
Value = value;
|
Value = value;
|
||||||
_valueAsJToken = ConvertValueToJToken(value);
|
_valueAsJToken = ConvertValueToJToken(value);
|
||||||
_jTokenConverter = ignoreCase
|
_jTokenConverter = ignoreCase ? Rename : jToken => jToken;
|
||||||
? (Func<JToken, JToken>)Rename
|
|
||||||
: jToken => jToken;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="IObjectMatcher.IsMatch"/>
|
/// <inheritdoc cref="IObjectMatcher.IsMatch"/>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ namespace WireMock.Owin.Mappers
|
|||||||
|
|
||||||
string method = request.Method;
|
string method = request.Method;
|
||||||
|
|
||||||
Dictionary<string, string[]> headers = null;
|
Dictionary<string, string[]>? headers = null;
|
||||||
IEnumerable<string> contentEncodingHeader = null;
|
IEnumerable<string>? contentEncodingHeader = null;
|
||||||
if (request.Headers.Any())
|
if (request.Headers.Any())
|
||||||
{
|
{
|
||||||
headers = new Dictionary<string, string[]>();
|
headers = new Dictionary<string, string[]>();
|
||||||
@@ -43,7 +43,7 @@ namespace WireMock.Owin.Mappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IDictionary<string, string> cookies = null;
|
IDictionary<string, string>? cookies = null;
|
||||||
if (request.Cookies.Any())
|
if (request.Cookies.Any())
|
||||||
{
|
{
|
||||||
cookies = new Dictionary<string, string>();
|
cookies = new Dictionary<string, string>();
|
||||||
@@ -53,7 +53,7 @@ namespace WireMock.Owin.Mappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IBodyData body = null;
|
IBodyData? body = null;
|
||||||
if (request.Body != null && BodyParser.ShouldParseBody(method, options.AllowBodyForAllHttpMethods == true))
|
if (request.Body != null && BodyParser.ShouldParseBody(method, options.AllowBodyForAllHttpMethods == true))
|
||||||
{
|
{
|
||||||
var bodyParserSettings = new BodyParserSettings
|
var bodyParserSettings = new BodyParserSettings
|
||||||
|
|||||||
@@ -4,180 +4,176 @@ using System.Linq;
|
|||||||
using System.Net.Http.Headers;
|
using System.Net.Http.Headers;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JetBrains.Annotations;
|
using Stef.Validation;
|
||||||
using WireMock.Http;
|
using WireMock.Http;
|
||||||
using WireMock.Matchers;
|
using WireMock.Matchers;
|
||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using Stef.Validation;
|
|
||||||
|
|
||||||
namespace WireMock.Util
|
namespace WireMock.Util;
|
||||||
|
|
||||||
|
internal static class BodyParser
|
||||||
{
|
{
|
||||||
internal static class BodyParser
|
private static readonly Encoding DefaultEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
|
||||||
|
private static readonly Encoding[] SupportedBodyAsStringEncodingForMultipart = { DefaultEncoding, Encoding.ASCII };
|
||||||
|
|
||||||
|
/*
|
||||||
|
HEAD - No defined body semantics.
|
||||||
|
GET - No defined body semantics.
|
||||||
|
PUT - Body supported.
|
||||||
|
POST - Body supported.
|
||||||
|
DELETE - No defined body semantics.
|
||||||
|
TRACE - Body not supported.
|
||||||
|
OPTIONS - Body supported but no semantics on usage (maybe in the future).
|
||||||
|
CONNECT - No defined body semantics
|
||||||
|
PATCH - Body supported.
|
||||||
|
*/
|
||||||
|
private static readonly IDictionary<string, bool> BodyAllowedForMethods = new Dictionary<string, bool>
|
||||||
{
|
{
|
||||||
private static readonly Encoding DefaultEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
|
{ HttpRequestMethods.HEAD, false },
|
||||||
private static readonly Encoding[] SupportedBodyAsStringEncodingForMultipart = { DefaultEncoding, Encoding.ASCII };
|
{ HttpRequestMethods.GET, false },
|
||||||
|
{ HttpRequestMethods.PUT, true },
|
||||||
|
{ HttpRequestMethods.POST, true },
|
||||||
|
{ HttpRequestMethods.DELETE, true },
|
||||||
|
{ HttpRequestMethods.TRACE, false },
|
||||||
|
{ HttpRequestMethods.OPTIONS, true },
|
||||||
|
{ HttpRequestMethods.CONNECT, false },
|
||||||
|
{ HttpRequestMethods.PATCH, true }
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
private static readonly IStringMatcher[] MultipartContentTypesMatchers = {
|
||||||
HEAD - No defined body semantics.
|
new WildcardMatcher("multipart/*", true)
|
||||||
GET - No defined body semantics.
|
};
|
||||||
PUT - Body supported.
|
|
||||||
POST - Body supported.
|
private static readonly IStringMatcher[] JsonContentTypesMatchers = {
|
||||||
DELETE - No defined body semantics.
|
new WildcardMatcher("application/json", true),
|
||||||
TRACE - Body not supported.
|
new WildcardMatcher("application/vnd.*+json", true)
|
||||||
OPTIONS - Body supported but no semantics on usage (maybe in the future).
|
};
|
||||||
CONNECT - No defined body semantics
|
|
||||||
PATCH - Body supported.
|
private static readonly IStringMatcher[] TextContentTypeMatchers =
|
||||||
*/
|
{
|
||||||
private static readonly IDictionary<string, bool> BodyAllowedForMethods = new Dictionary<string, bool>
|
new WildcardMatcher("text/*", true),
|
||||||
|
new RegexMatcher("^application\\/(java|type)script$", true),
|
||||||
|
new WildcardMatcher("application/*xml", true),
|
||||||
|
new WildcardMatcher("application/x-www-form-urlencoded", true)
|
||||||
|
};
|
||||||
|
|
||||||
|
public static bool ShouldParseBody(string? httpMethod, bool allowBodyForAllHttpMethods)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(httpMethod))
|
||||||
{
|
{
|
||||||
{ HttpRequestMethods.HEAD, false },
|
return false;
|
||||||
{ HttpRequestMethods.GET, false },
|
}
|
||||||
{ HttpRequestMethods.PUT, true },
|
|
||||||
{ HttpRequestMethods.POST, true },
|
|
||||||
{ HttpRequestMethods.DELETE, true },
|
|
||||||
{ HttpRequestMethods.TRACE, false },
|
|
||||||
{ HttpRequestMethods.OPTIONS, true },
|
|
||||||
{ HttpRequestMethods.CONNECT, false },
|
|
||||||
{ HttpRequestMethods.PATCH, true }
|
|
||||||
};
|
|
||||||
|
|
||||||
private static readonly IStringMatcher[] MultipartContentTypesMatchers = {
|
if (allowBodyForAllHttpMethods)
|
||||||
new WildcardMatcher("multipart/*", true)
|
|
||||||
};
|
|
||||||
|
|
||||||
private static readonly IStringMatcher[] JsonContentTypesMatchers = {
|
|
||||||
new WildcardMatcher("application/json", true),
|
|
||||||
new WildcardMatcher("application/vnd.*+json", true)
|
|
||||||
};
|
|
||||||
|
|
||||||
private static readonly IStringMatcher[] TextContentTypeMatchers =
|
|
||||||
{
|
{
|
||||||
new WildcardMatcher("text/*", true),
|
|
||||||
new RegexMatcher("^application\\/(java|type)script$", true),
|
|
||||||
new WildcardMatcher("application/*xml", true),
|
|
||||||
new WildcardMatcher("application/x-www-form-urlencoded", true)
|
|
||||||
};
|
|
||||||
|
|
||||||
public static bool ShouldParseBody([CanBeNull] string httpMethod, bool allowBodyForAllHttpMethods)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(httpMethod))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allowBodyForAllHttpMethods)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BodyAllowedForMethods.TryGetValue(httpMethod.ToUpper(), out bool allowed))
|
|
||||||
{
|
|
||||||
return allowed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't have any knowledge of this method, we should assume that a body *may*
|
|
||||||
// be present, so we should parse it if it is. Therefore, if a new method is added to
|
|
||||||
// the HTTP Method Registry, we only really need to add it to BodyAllowedForMethods if
|
|
||||||
// we want to make it clear that a body is *not* allowed.
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BodyType DetectBodyTypeFromContentType([CanBeNull] string contentTypeValue)
|
if (BodyAllowedForMethods.TryGetValue(httpMethod!.ToUpper(), out bool allowed))
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(contentTypeValue) || !MediaTypeHeaderValue.TryParse(contentTypeValue, out MediaTypeHeaderValue contentType))
|
return allowed;
|
||||||
{
|
}
|
||||||
return BodyType.Bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TextContentTypeMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
// If we don't have any knowledge of this method, we should assume that a body *may*
|
||||||
{
|
// be present, so we should parse it if it is. Therefore, if a new method is added to
|
||||||
return BodyType.String;
|
// the HTTP Method Registry, we only really need to add it to BodyAllowedForMethods if
|
||||||
}
|
// we want to make it clear that a body is *not* allowed.
|
||||||
|
return true;
|
||||||
if (JsonContentTypesMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
}
|
||||||
{
|
|
||||||
return BodyType.Json;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MultipartContentTypesMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
|
||||||
{
|
|
||||||
return BodyType.MultiPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public static BodyType DetectBodyTypeFromContentType(string? contentTypeValue)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(contentTypeValue) || !MediaTypeHeaderValue.TryParse(contentTypeValue, out MediaTypeHeaderValue contentType))
|
||||||
|
{
|
||||||
return BodyType.Bytes;
|
return BodyType.Bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<BodyData> ParseAsync([NotNull] BodyParserSettings settings)
|
if (TextContentTypeMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
||||||
{
|
{
|
||||||
Guard.NotNull(settings, nameof(settings));
|
return BodyType.String;
|
||||||
|
}
|
||||||
|
|
||||||
var bodyWithContentEncoding = await ReadBytesAsync(settings.Stream, settings.ContentEncoding, settings.DecompressGZipAndDeflate).ConfigureAwait(false);
|
if (JsonContentTypesMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
||||||
var data = new BodyData
|
{
|
||||||
{
|
return BodyType.Json;
|
||||||
BodyAsBytes = bodyWithContentEncoding.Bytes,
|
}
|
||||||
DetectedCompression = bodyWithContentEncoding.ContentType,
|
|
||||||
DetectedBodyType = BodyType.Bytes,
|
|
||||||
DetectedBodyTypeFromContentType = DetectBodyTypeFromContentType(settings.ContentType)
|
|
||||||
};
|
|
||||||
|
|
||||||
// In case of MultiPart: check if the BodyAsBytes is a valid UTF8 or ASCII string, in that case read as String else keep as-is
|
if (MultipartContentTypesMatchers.Any(matcher => MatchScores.IsPerfect(matcher.IsMatch(contentType.MediaType))))
|
||||||
if (data.DetectedBodyTypeFromContentType == BodyType.MultiPart)
|
{
|
||||||
{
|
return BodyType.MultiPart;
|
||||||
if (BytesEncodingUtils.TryGetEncoding(data.BodyAsBytes, out Encoding encoding) &&
|
}
|
||||||
SupportedBodyAsStringEncodingForMultipart.Select(x => x.Equals(encoding)).Any())
|
|
||||||
{
|
|
||||||
data.BodyAsString = encoding.GetString(data.BodyAsBytes);
|
|
||||||
data.Encoding = encoding;
|
|
||||||
data.DetectedBodyType = BodyType.String;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to get the body as String
|
return BodyType.Bytes;
|
||||||
try
|
}
|
||||||
|
|
||||||
|
public static async Task<BodyData> ParseAsync(BodyParserSettings settings)
|
||||||
|
{
|
||||||
|
Guard.NotNull(settings);
|
||||||
|
|
||||||
|
var bodyWithContentEncoding = await ReadBytesAsync(settings.Stream, settings.ContentEncoding, settings.DecompressGZipAndDeflate).ConfigureAwait(false);
|
||||||
|
var data = new BodyData
|
||||||
|
{
|
||||||
|
BodyAsBytes = bodyWithContentEncoding.Bytes,
|
||||||
|
DetectedCompression = bodyWithContentEncoding.ContentType,
|
||||||
|
DetectedBodyType = BodyType.Bytes,
|
||||||
|
DetectedBodyTypeFromContentType = DetectBodyTypeFromContentType(settings.ContentType)
|
||||||
|
};
|
||||||
|
|
||||||
|
// In case of MultiPart: check if the BodyAsBytes is a valid UTF8 or ASCII string, in that case read as String else keep as-is
|
||||||
|
if (data.DetectedBodyTypeFromContentType == BodyType.MultiPart)
|
||||||
|
{
|
||||||
|
if (BytesEncodingUtils.TryGetEncoding(data.BodyAsBytes, out Encoding encoding) &&
|
||||||
|
SupportedBodyAsStringEncodingForMultipart.Select(x => x.Equals(encoding)).Any())
|
||||||
{
|
{
|
||||||
data.BodyAsString = DefaultEncoding.GetString(data.BodyAsBytes);
|
data.BodyAsString = encoding.GetString(data.BodyAsBytes);
|
||||||
data.Encoding = DefaultEncoding;
|
data.Encoding = encoding;
|
||||||
data.DetectedBodyType = BodyType.String;
|
data.DetectedBodyType = BodyType.String;
|
||||||
|
|
||||||
// If string is not null or empty, try to deserialize the string to a JObject
|
|
||||||
if (settings.DeserializeJson && !string.IsNullOrEmpty(data.BodyAsString))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
data.BodyAsJson = JsonUtils.DeserializeObject(data.BodyAsString);
|
|
||||||
data.DetectedBodyType = BodyType.Json;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// JsonConvert failed, just ignore.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// Reading as string failed, just ignore
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<(string ContentType, byte[] Bytes)> ReadBytesAsync(Stream stream, string contentEncoding = null, bool decompressGZipAndDeflate = true)
|
// Try to get the body as String or Json
|
||||||
|
try
|
||||||
{
|
{
|
||||||
using (var memoryStream = new MemoryStream())
|
data.BodyAsString = DefaultEncoding.GetString(data.BodyAsBytes);
|
||||||
|
data.Encoding = DefaultEncoding;
|
||||||
|
data.DetectedBodyType = BodyType.String;
|
||||||
|
|
||||||
|
// If string is not null or empty, try to deserialize the string to a JObject
|
||||||
|
if (settings.DeserializeJson && !string.IsNullOrEmpty(data.BodyAsString))
|
||||||
{
|
{
|
||||||
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
try
|
||||||
byte[] data = memoryStream.ToArray();
|
|
||||||
|
|
||||||
string type = contentEncoding?.ToLowerInvariant();
|
|
||||||
if (decompressGZipAndDeflate && (type == "gzip" || type == "deflate"))
|
|
||||||
{
|
{
|
||||||
return (type, CompressionUtils.Decompress(type, data));
|
data.BodyAsJson = JsonUtils.DeserializeObject(data.BodyAsString);
|
||||||
|
data.DetectedBodyType = BodyType.Json;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// JsonConvert failed, just ignore.
|
||||||
}
|
}
|
||||||
|
|
||||||
return (null, data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Reading as string failed, just ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<(string? ContentType, byte[] Bytes)> ReadBytesAsync(Stream stream, string? contentEncoding = null, bool decompressGZipAndDeflate = true)
|
||||||
|
{
|
||||||
|
using var memoryStream = new MemoryStream();
|
||||||
|
await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
||||||
|
byte[] data = memoryStream.ToArray();
|
||||||
|
|
||||||
|
var type = contentEncoding?.ToLowerInvariant();
|
||||||
|
if (decompressGZipAndDeflate && type is "gzip" or "deflate")
|
||||||
|
{
|
||||||
|
return (type, CompressionUtils.Decompress(type, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (null, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace WireMock.Util
|
namespace WireMock.Util;
|
||||||
|
|
||||||
|
internal class BodyParserSettings
|
||||||
{
|
{
|
||||||
internal class BodyParserSettings
|
public Stream Stream { get; set; } = null!;
|
||||||
{
|
|
||||||
public Stream Stream { get; set; }
|
|
||||||
|
|
||||||
public string ContentType { get; set; }
|
public string? ContentType { get; set; }
|
||||||
|
|
||||||
public string ContentEncoding { get; set; }
|
public string? ContentEncoding { get; set; }
|
||||||
|
|
||||||
public bool DecompressGZipAndDeflate { get; set; } = true;
|
public bool DecompressGZipAndDeflate { get; set; } = true;
|
||||||
|
|
||||||
public bool DeserializeJson { get; set; } = true;
|
public bool DeserializeJson { get; set; } = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,299 +1,356 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
using WireMock.Matchers;
|
using WireMock.Matchers;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace WireMock.Net.Tests.Matchers
|
namespace WireMock.Net.Tests.Matchers;
|
||||||
|
|
||||||
|
public class JsonMatcherTests
|
||||||
{
|
{
|
||||||
public class JsonMatcherTests
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
public enum EnumWithJsonConverter
|
||||||
{
|
{
|
||||||
[Fact]
|
Type1
|
||||||
public void JsonMatcher_GetName()
|
}
|
||||||
|
|
||||||
|
public enum NormalEnum
|
||||||
|
{
|
||||||
|
Abc
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Test1
|
||||||
|
{
|
||||||
|
public NormalEnum NormalEnum { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Test2
|
||||||
|
{
|
||||||
|
public EnumWithJsonConverter EnumWithJsonConverter { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_GetName()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("{}");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
string name = matcher.Name;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(name).Equals("JsonMatcher");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_GetValue()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("{}");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
object value = matcher.Value;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(value).Equals("{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_WithInvalidStringValue_Should_ThrowException()
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
// ReSharper disable once ObjectCreationAsStatement
|
||||||
|
Action action = () => new JsonMatcher(MatchBehaviour.AcceptOnMatch, "{ \"Id\"");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
action.Should().Throw<JsonException>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_WithInvalidObjectValue_Should_ThrowException()
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
// ReSharper disable once ObjectCreationAsStatement
|
||||||
|
Action action = () => new JsonMatcher(MatchBehaviour.AcceptOnMatch, new MemoryStream());
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
action.Should().Throw<JsonException>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_WithInvalidValue_And_ThrowExceptionIsFalse_Should_ReturnMismatch()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
double match = matcher.IsMatch(new MemoryStream());
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(match).IsEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_WithInvalidValue_And_ThrowExceptionIsTrue_Should_ReturnMismatch()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("", false, true);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
Action action = () => matcher.IsMatch(new MemoryStream());
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
action.Should().Throw<JsonException>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_ByteArray()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var bytes = new byte[0];
|
||||||
|
var matcher = new JsonMatcher("");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
double match = matcher.IsMatch(bytes);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(match).IsEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_NullString()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
string? s = null;
|
||||||
|
var matcher = new JsonMatcher("");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
double match = matcher.IsMatch(s);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(match).IsEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_NullObject()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
object? o = null;
|
||||||
|
var matcher = new JsonMatcher("");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
double match = matcher.IsMatch(o);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(match).IsEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_JArray()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new[] { "x", "y" });
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var jArray = new JArray
|
||||||
{
|
{
|
||||||
// Assign
|
"x",
|
||||||
var matcher = new JsonMatcher("{}");
|
"y"
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jArray);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
string name = matcher.Name;
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(name).Equals("JsonMatcher");
|
public void JsonMatcher_IsMatch_JObject()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new { Id = 1, Name = "Test" });
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_GetValue()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "Id", new JValue(1) },
|
||||||
var matcher = new JsonMatcher("{}");
|
{ "Name", new JValue("Test") }
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
object value = matcher.Value;
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(value).Equals("{}");
|
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObject()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new { id = 1, Name = "test" }, true);
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_WithInvalidStringValue_Should_ThrowException()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Act
|
{ "Id", new JValue(1) },
|
||||||
Action action = () => new JsonMatcher(MatchBehaviour.AcceptOnMatch, "{ \"Id\"");
|
{ "NaMe", new JValue("Test") }
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
action.Should().Throw<JsonException>();
|
Assert.Equal(1.0, match);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void JsonMatcher_WithInvalidObjectValue_Should_ThrowException()
|
public void JsonMatcher_IsMatch_JObjectParsed()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new { Id = 1, Name = "Test" });
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var jObject = JObject.Parse("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObjectParsed()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new { Id = 1, Name = "TESt" }, true);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var jObject = JObject.Parse("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void JsonMatcher_IsMatch_JArrayAsString()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("[ \"x\", \"y\" ]");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var jArray = new JArray
|
||||||
{
|
{
|
||||||
// Act
|
"x",
|
||||||
Action action = () => new JsonMatcher(MatchBehaviour.AcceptOnMatch, new MemoryStream());
|
"y"
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jArray);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
action.Should().Throw<JsonException>();
|
Assert.Equal(1.0, match);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void JsonMatcher_IsMatch_WithInvalidValue_And_ThrowExceptionIsFalse_Should_ReturnMismatch()
|
public void JsonMatcher_IsMatch_JObjectAsString()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "Id", new JValue(1) },
|
||||||
var matcher = new JsonMatcher("");
|
{ "Name", new JValue("Test") }
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
double match = matcher.IsMatch(new MemoryStream());
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(match).IsEqualTo(0);
|
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObjectAsString()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("{ \"Id\" : 1, \"Name\" : \"test\" }", true);
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_IsMatch_WithInvalidValue_And_ThrowExceptionIsTrue_Should_ReturnMismatch()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "Id", new JValue(1) },
|
||||||
var matcher = new JsonMatcher("", false, true);
|
{ "Name", new JValue("Test") }
|
||||||
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
Action action = () => matcher.IsMatch(new MemoryStream());
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
action.Should().Throw<JsonException>();
|
public void JsonMatcher_IsMatch_JObjectAsString_RejectOnMatch()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(MatchBehaviour.RejectOnMatch, "{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_IsMatch_ByteArray()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "Id", new JValue(1) },
|
||||||
var bytes = new byte[0];
|
{ "Name", new JValue("Test") }
|
||||||
var matcher = new JsonMatcher("");
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
double match = matcher.IsMatch(bytes);
|
Assert.Equal(0.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(match).IsEqualTo(0);
|
public void JsonMatcher_IsMatch_JObjectWithDateTimeOffsetAsString()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher("{ \"preferredAt\" : \"2019-11-21T10:32:53.2210009+00:00\" }");
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_IsMatch_NullString()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "preferredAt", new JValue("2019-11-21T10:32:53.2210009+00:00") }
|
||||||
string s = null;
|
};
|
||||||
var matcher = new JsonMatcher("");
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
double match = matcher.IsMatch(s);
|
Assert.Equal(1.0, match);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(match).IsEqualTo(0);
|
public void JsonMatcher_IsMatch_NormalEnum()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new Test1 { NormalEnum = NormalEnum.Abc});
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_IsMatch_NullObject()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "NormalEnum", new JValue(0) }
|
||||||
object o = null;
|
};
|
||||||
var matcher = new JsonMatcher("");
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
double match = matcher.IsMatch(o);
|
match.Should().Be(1.0);
|
||||||
|
}
|
||||||
|
|
||||||
// Assert
|
[Fact]
|
||||||
Check.That(match).IsEqualTo(0);
|
public void JsonMatcher_IsMatch_EnumWithJsonConverter()
|
||||||
}
|
{
|
||||||
|
// Assign
|
||||||
|
var matcher = new JsonMatcher(new Test2 { EnumWithJsonConverter = EnumWithJsonConverter.Type1 });
|
||||||
|
|
||||||
[Fact]
|
// Act
|
||||||
public void JsonMatcher_IsMatch_JArray()
|
var jObject = new JObject
|
||||||
{
|
{
|
||||||
// Assign
|
{ "EnumWithJsonConverter", new JValue("Type1") }
|
||||||
var matcher = new JsonMatcher(new[] { "x", "y" });
|
};
|
||||||
|
double match = matcher.IsMatch(jObject);
|
||||||
|
|
||||||
// Act
|
// Assert
|
||||||
var jArray = new JArray
|
match.Should().Be(1.0);
|
||||||
{
|
|
||||||
"x",
|
|
||||||
"y"
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jArray);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JObject()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher(new { Id = 1, Name = "Test" });
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "Id", new JValue(1) },
|
|
||||||
{ "Name", new JValue("Test") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObject()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher(new { id = 1, Name = "test" }, true);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "Id", new JValue(1) },
|
|
||||||
{ "NaMe", new JValue("Test") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JObjectParsed()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher(new { Id = 1, Name = "Test" });
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = JObject.Parse("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObjectParsed()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher(new { Id = 1, Name = "TESt" }, true);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = JObject.Parse("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JArrayAsString()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher("[ \"x\", \"y\" ]");
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jArray = new JArray
|
|
||||||
{
|
|
||||||
"x",
|
|
||||||
"y"
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jArray);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JObjectAsString()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher("{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "Id", new JValue(1) },
|
|
||||||
{ "Name", new JValue("Test") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_WithIgnoreCaseTrue_JObjectAsString()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher("{ \"Id\" : 1, \"Name\" : \"test\" }", true);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "Id", new JValue(1) },
|
|
||||||
{ "Name", new JValue("Test") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JObjectAsString_RejectOnMatch()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher(MatchBehaviour.RejectOnMatch, "{ \"Id\" : 1, \"Name\" : \"Test\" }");
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "Id", new JValue(1) },
|
|
||||||
{ "Name", new JValue("Test") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(0.0, match);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void JsonMatcher_IsMatch_JObjectWithDateTimeOffsetAsString()
|
|
||||||
{
|
|
||||||
// Assign
|
|
||||||
var matcher = new JsonMatcher("{ \"preferredAt\" : \"2019-11-21T10:32:53.2210009+00:00\" }");
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var jobject = new JObject
|
|
||||||
{
|
|
||||||
{ "preferredAt", new JValue("2019-11-21T10:32:53.2210009+00:00") }
|
|
||||||
};
|
|
||||||
double match = matcher.IsMatch(jobject);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1.0, match);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user