From 4b92f59da9d4e5befcf16b036a79ba6abf9cb9e5 Mon Sep 17 00:00:00 2001 From: Dennis Doomen Date: Wed, 15 Jan 2025 20:05:00 +0100 Subject: [PATCH] Make it work with Fluent Assertions 8. --- Build/_build.csproj | 2 +- Build/_build.csproj.DotSettings | 5 ++- FluentAssertions.Json.sln.DotSettings | 3 ++ .../FluentAssertions.Json.csproj | 14 ++++---- Src/FluentAssertions.Json/JTokenAssertions.cs | 29 +++++++++------- .../JsonAssertionExtensions.cs | 7 ++-- .../JsonAssertionOptions.cs | 4 +-- .../ObjectAssertionsExtensions.cs | 12 +++---- .../StringAssertionsExtensions.cs | 2 +- Src/FluentAssertions.png | Bin 10211 -> 22870 bytes Tests/Approval.Tests/Approval.Tests.csproj | 8 ++--- .../FluentAssertions.Json/net47.verified.txt | 8 ++--- .../netstandard2.0.verified.txt | 8 ++--- .../FluentAssertions.Json.Specs.csproj | 4 +-- .../JTokenAssertionsSpecs.cs | 4 +-- .../JsonAssertionExtensionsSpecs.cs | 2 +- .../JsonAssertionOptionsSpecs.cs | 6 ++-- build.ps1 | 32 +++++++----------- build.sh | 30 +++++++--------- global.json | 8 ++--- 20 files changed, 93 insertions(+), 95 deletions(-) diff --git a/Build/_build.csproj b/Build/_build.csproj index ba171562..3d7812d3 100644 --- a/Build/_build.csproj +++ b/Build/_build.csproj @@ -10,7 +10,7 @@ - + diff --git a/Build/_build.csproj.DotSettings b/Build/_build.csproj.DotSettings index 7bc28484..03060223 100644 --- a/Build/_build.csproj.DotSettings +++ b/Build/_build.csproj.DotSettings @@ -16,6 +16,8 @@ False <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></Policy> True True True @@ -24,4 +26,5 @@ True True True - True + True + True diff --git a/FluentAssertions.Json.sln.DotSettings b/FluentAssertions.Json.sln.DotSettings index d0c4c588..aaeb82d0 100644 --- a/FluentAssertions.Json.sln.DotSettings +++ b/FluentAssertions.Json.sln.DotSettings @@ -18,6 +18,8 @@ False <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></Policy> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> @@ -67,6 +69,7 @@ True True True + True D:\Workspaces\FluentAssertions\Default.testsettings 4 False diff --git a/Src/FluentAssertions.Json/FluentAssertions.Json.csproj b/Src/FluentAssertions.Json/FluentAssertions.Json.csproj index 95b753af..3620b34e 100644 --- a/Src/FluentAssertions.Json/FluentAssertions.Json.csproj +++ b/Src/FluentAssertions.Json/FluentAssertions.Json.csproj @@ -26,16 +26,16 @@ Apache-2.0 FluentAssertions.png See https://github.com/fluentassertions/fluentassertions.json/releases/ - Copyright Dennis Doomen 2010-2021 + Copyright 2024-$([System.DateTime]::Now.ToString(yyyy)) Xceed Software Inc., all rights reserved 9.0 false - - - + + + @@ -46,11 +46,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -58,7 +58,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Src/FluentAssertions.Json/JTokenAssertions.cs b/Src/FluentAssertions.Json/JTokenAssertions.cs index 9f956cb4..19f82151 100644 --- a/Src/FluentAssertions.Json/JTokenAssertions.cs +++ b/Src/FluentAssertions.Json/JTokenAssertions.cs @@ -27,10 +27,11 @@ static JTokenAssertions() /// Initializes a new instance of the class. /// /// The subject - public JTokenAssertions(JToken subject) - : base(subject) + /// + public JTokenAssertions(JToken subject, AssertionChain assertionChain) + : base(subject, assertionChain) { - EnumerableSubject = new GenericCollectionAssertions(subject); + EnumerableSubject = new GenericCollectionAssertions(subject, assertionChain); } /// @@ -126,7 +127,7 @@ private AndConstraint BeEquivalentTo(JToken expected, bool ign $"{Format(expected, true).EscapePlaceholders()}{Environment.NewLine}" + "{reason}."; - Execute.Assertion + CurrentAssertionChain .ForCondition(difference == null) .BecauseOf(because, becauseArgs) .FailWith(message); @@ -180,7 +181,7 @@ public AndConstraint NotBeEquivalentTo(string unexpected, stri /// public AndConstraint NotBeEquivalentTo(JToken unexpected, string because = "", params object[] becauseArgs) { - Execute.Assertion + CurrentAssertionChain .ForCondition((Subject is null && unexpected is not null) || !JToken.DeepEquals(Subject, unexpected)) .BecauseOf(because, becauseArgs) @@ -211,12 +212,12 @@ public AndConstraint HaveValue(string expected) /// public AndConstraint HaveValue(string expected, string because, params object[] becauseArgs) { - Execute.Assertion + CurrentAssertionChain .ForCondition(Subject is not null) .BecauseOf(because, becauseArgs) .FailWith("Expected JSON token to have value {0}, but the element was .", expected); - Execute.Assertion + CurrentAssertionChain .ForCondition(Subject.Value() == expected) .BecauseOf(because, becauseArgs) .FailWith("Expected JSON property {0} to have value {1}{reason}, but found {2}.", @@ -238,12 +239,12 @@ public AndConstraint HaveValue(string expected, string because /// public AndConstraint NotHaveValue(string unexpected, string because = "", params object[] becauseArgs) { - Execute.Assertion + CurrentAssertionChain .ForCondition(Subject is not null) .BecauseOf(because, becauseArgs) .FailWith("Did not expect the JSON property to have value {0}, but the token was .", unexpected); - Execute.Assertion + CurrentAssertionChain .ForCondition(Subject.Value() != unexpected) .BecauseOf(because, becauseArgs) .FailWith("Did not expect JSON property {0} to have value {1}{reason}.", @@ -279,7 +280,7 @@ public AndConstraint MatchRegex(string regularExpression, stri throw new ArgumentNullException(nameof(regularExpression), "MatchRegex does not support pattern"); } - Execute.Assertion + CurrentAssertionChain .ForCondition(Regex.IsMatch(Subject.Value(), regularExpression)) .BecauseOf(because, becauseArgs) .FailWith("Expected {context:JSON property} {0} to match regex pattern {1}{reason}, but found {2}.", @@ -306,7 +307,7 @@ public AndConstraint NotMatchRegex(string regularExpression, s throw new ArgumentNullException(nameof(regularExpression), "MatchRegex does not support pattern"); } - Execute.Assertion + CurrentAssertionChain .ForCondition(!Regex.IsMatch(Subject.Value(), regularExpression)) .BecauseOf(because, becauseArgs) .FailWith("Did not expect {context:JSON property} {0} to match regex pattern {1}{reason}.", @@ -341,7 +342,8 @@ public AndWhichConstraint HaveElement(string expected, params object[] becauseArgs) { JToken jToken = Subject[expected]; - Execute.Assertion + + CurrentAssertionChain .ForCondition(jToken != null) .BecauseOf(because, becauseArgs) .FailWith("Expected JSON document {0} to have element \"" + expected.EscapePlaceholders() + "\"{reason}" + @@ -366,7 +368,8 @@ public AndWhichConstraint NotHaveElement(string unexpe params object[] becauseArgs) { JToken jToken = Subject[unexpected]; - Execute.Assertion + + CurrentAssertionChain .ForCondition(jToken == null) .BecauseOf(because, becauseArgs) .FailWith("Did not expect JSON document {0} to have element \"" + unexpected.EscapePlaceholders() + "\"{reason}.", Subject); diff --git a/Src/FluentAssertions.Json/JsonAssertionExtensions.cs b/Src/FluentAssertions.Json/JsonAssertionExtensions.cs index da455331..0e5f0616 100644 --- a/Src/FluentAssertions.Json/JsonAssertionExtensions.cs +++ b/Src/FluentAssertions.Json/JsonAssertionExtensions.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using FluentAssertions.Execution; using JetBrains.Annotations; using Newtonsoft.Json.Linq; @@ -16,7 +17,7 @@ public static class JsonAssertionExtensions [Pure] public static JTokenAssertions Should(this JToken jToken) { - return new JTokenAssertions(jToken); + return new JTokenAssertions(jToken, AssertionChain.GetOrCreate()); } /// @@ -25,7 +26,7 @@ public static JTokenAssertions Should(this JToken jToken) [Pure] public static JTokenAssertions Should(this JObject jObject) { - return new JTokenAssertions(jObject); + return new JTokenAssertions(jObject, AssertionChain.GetOrCreate()); } /// @@ -34,7 +35,7 @@ public static JTokenAssertions Should(this JObject jObject) [Pure] public static JTokenAssertions Should(this JValue jValue) { - return new JTokenAssertions(jValue); + return new JTokenAssertions(jValue, AssertionChain.GetOrCreate()); } } } diff --git a/Src/FluentAssertions.Json/JsonAssertionOptions.cs b/Src/FluentAssertions.Json/JsonAssertionOptions.cs index f51a5454..a331127a 100644 --- a/Src/FluentAssertions.Json/JsonAssertionOptions.cs +++ b/Src/FluentAssertions.Json/JsonAssertionOptions.cs @@ -6,9 +6,9 @@ namespace FluentAssertions.Json /// /// Represents the run-time type-specific behavior of a JSON structural equivalency assertion. It is the equivalent of /// - public sealed class JsonAssertionOptions : EquivalencyAssertionOptions, IJsonAssertionOptions + public sealed class JsonAssertionOptions : EquivalencyOptions, IJsonAssertionOptions { - public JsonAssertionOptions(EquivalencyAssertionOptions equivalencyAssertionOptions) : base(equivalencyAssertionOptions) + public JsonAssertionOptions(EquivalencyOptions equivalencyAssertionOptions) : base(equivalencyAssertionOptions) { } diff --git a/Src/FluentAssertions.Json/ObjectAssertionsExtensions.cs b/Src/FluentAssertions.Json/ObjectAssertionsExtensions.cs index d5ba24e1..01016caa 100644 --- a/Src/FluentAssertions.Json/ObjectAssertionsExtensions.cs +++ b/Src/FluentAssertions.Json/ObjectAssertionsExtensions.cs @@ -61,13 +61,13 @@ public static AndConstraint BeJsonSerializable(this ObjectA /// Zero or more objects to format using the placeholders in . /// [CustomAssertion] - public static AndConstraint BeJsonSerializable(this ObjectAssertions assertions, Func, EquivalencyAssertionOptions> options, string because = "", params object[] becauseArgs) + public static AndConstraint BeJsonSerializable(this ObjectAssertions assertions, Func, EquivalencyOptions> options, string because = "", params object[] becauseArgs) { - Execute.Assertion.ForCondition(assertions.Subject != null) + assertions.CurrentAssertionChain.ForCondition(assertions.Subject != null) .BecauseOf(because, becauseArgs) .FailWith("Expected {context:object} to be JSON serializable{reason}, but the value is null. Please provide a value for the assertion."); - Execute.Assertion.ForCondition(assertions.Subject is T) + assertions.CurrentAssertionChain.ForCondition(assertions.Subject is T) .BecauseOf(because, becauseArgs) .FailWith("Expected {context:object} to be JSON serializable{reason}, but {context:object} is not assignable to {0}", typeof(T)); @@ -75,8 +75,8 @@ public static AndConstraint BeJsonSerializable(this ObjectA { var deserializedObject = CreateCloneUsingJsonSerializer(assertions.Subject); - var defaultOptions = AssertionOptions.CloneDefaults() - .RespectingRuntimeTypes() + var defaultOptions = AssertionConfiguration.Current.Equivalency.CloneDefaults() + .PreferringRuntimeMemberTypes() .IncludingFields() .IncludingProperties(); @@ -87,7 +87,7 @@ public static AndConstraint BeJsonSerializable(this ObjectA catch (Exception exc) #pragma warning restore CA1031 // Ignore catching general exception { - Execute.Assertion + assertions.CurrentAssertionChain .BecauseOf(because, becauseArgs) .FailWith("Expected {context:object} to be JSON serializable{reason}, but serializing {0} failed with {1}", assertions.Subject, exc); } diff --git a/Src/FluentAssertions.Json/StringAssertionsExtensions.cs b/Src/FluentAssertions.Json/StringAssertionsExtensions.cs index 5fd0036d..d788fc26 100644 --- a/Src/FluentAssertions.Json/StringAssertionsExtensions.cs +++ b/Src/FluentAssertions.Json/StringAssertionsExtensions.cs @@ -23,7 +23,7 @@ public static AndWhichConstraint BeValidJson( catch (Exception ex) #pragma warning restore CA1031 // Ignore catching general exception { - Execute.Assertion.BecauseOf(because, becauseArgs) + stringAssertions.CurrentAssertionChain.BecauseOf(because, becauseArgs) .FailWith("Expected {context:string} to be valid JSON{reason}, but parsing failed with {0}.", ex.Message); } diff --git a/Src/FluentAssertions.png b/Src/FluentAssertions.png index 216d3a3f1bef4ba8f54bcd657eab82d70bacac5e..94c749a655a4e5098802d7c7a0308d18e95c7a35 100644 GIT binary patch literal 22870 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 - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/net47.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/net47.verified.txt index cd5d0076..74b35143 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/net47.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/net47.verified.txt @@ -12,7 +12,7 @@ namespace FluentAssertions.Json } public class JTokenAssertions : FluentAssertions.Primitives.ReferenceTypeAssertions { - public JTokenAssertions(Newtonsoft.Json.Linq.JToken subject) { } + public JTokenAssertions(Newtonsoft.Json.Linq.JToken subject, FluentAssertions.Execution.AssertionChain assertionChain) { } protected override string Identifier { get; } public FluentAssertions.AndConstraint BeEquivalentTo(Newtonsoft.Json.Linq.JToken expected, string because = "", params object[] becauseArgs) { } public FluentAssertions.AndConstraint BeEquivalentTo(string expected, string because = "", params object[] becauseArgs) { } @@ -46,9 +46,9 @@ namespace FluentAssertions.Json public static FluentAssertions.Json.JTokenAssertions Should(this Newtonsoft.Json.Linq.JToken jToken) { } public static FluentAssertions.Json.JTokenAssertions Should(this Newtonsoft.Json.Linq.JValue jValue) { } } - public sealed class JsonAssertionOptions : FluentAssertions.Equivalency.EquivalencyAssertionOptions, FluentAssertions.Json.IJsonAssertionOptions + public sealed class JsonAssertionOptions : FluentAssertions.Equivalency.EquivalencyOptions, FluentAssertions.Json.IJsonAssertionOptions { - public JsonAssertionOptions(FluentAssertions.Equivalency.EquivalencyAssertionOptions equivalencyAssertionOptions) { } + public JsonAssertionOptions(FluentAssertions.Equivalency.EquivalencyOptions equivalencyAssertionOptions) { } public FluentAssertions.Json.IJsonAssertionRestriction Using(System.Action> action) { } } public sealed class JsonAssertionRestriction : FluentAssertions.Json.IJsonAssertionRestriction @@ -63,7 +63,7 @@ namespace FluentAssertions.Json [FluentAssertions.CustomAssertion] public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, string because = "", params object[] becauseArgs) { } [FluentAssertions.CustomAssertion] - public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, System.Func, FluentAssertions.Equivalency.EquivalencyAssertionOptions> options, string because = "", params object[] becauseArgs) { } + public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, System.Func, FluentAssertions.Equivalency.EquivalencyOptions> options, string because = "", params object[] becauseArgs) { } } public static class StringAssertionsExtensions { diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/netstandard2.0.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/netstandard2.0.verified.txt index cd5d0076..74b35143 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/netstandard2.0.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions.Json/netstandard2.0.verified.txt @@ -12,7 +12,7 @@ namespace FluentAssertions.Json } public class JTokenAssertions : FluentAssertions.Primitives.ReferenceTypeAssertions { - public JTokenAssertions(Newtonsoft.Json.Linq.JToken subject) { } + public JTokenAssertions(Newtonsoft.Json.Linq.JToken subject, FluentAssertions.Execution.AssertionChain assertionChain) { } protected override string Identifier { get; } public FluentAssertions.AndConstraint BeEquivalentTo(Newtonsoft.Json.Linq.JToken expected, string because = "", params object[] becauseArgs) { } public FluentAssertions.AndConstraint BeEquivalentTo(string expected, string because = "", params object[] becauseArgs) { } @@ -46,9 +46,9 @@ namespace FluentAssertions.Json public static FluentAssertions.Json.JTokenAssertions Should(this Newtonsoft.Json.Linq.JToken jToken) { } public static FluentAssertions.Json.JTokenAssertions Should(this Newtonsoft.Json.Linq.JValue jValue) { } } - public sealed class JsonAssertionOptions : FluentAssertions.Equivalency.EquivalencyAssertionOptions, FluentAssertions.Json.IJsonAssertionOptions + public sealed class JsonAssertionOptions : FluentAssertions.Equivalency.EquivalencyOptions, FluentAssertions.Json.IJsonAssertionOptions { - public JsonAssertionOptions(FluentAssertions.Equivalency.EquivalencyAssertionOptions equivalencyAssertionOptions) { } + public JsonAssertionOptions(FluentAssertions.Equivalency.EquivalencyOptions equivalencyAssertionOptions) { } public FluentAssertions.Json.IJsonAssertionRestriction Using(System.Action> action) { } } public sealed class JsonAssertionRestriction : FluentAssertions.Json.IJsonAssertionRestriction @@ -63,7 +63,7 @@ namespace FluentAssertions.Json [FluentAssertions.CustomAssertion] public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, string because = "", params object[] becauseArgs) { } [FluentAssertions.CustomAssertion] - public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, System.Func, FluentAssertions.Equivalency.EquivalencyAssertionOptions> options, string because = "", params object[] becauseArgs) { } + public static FluentAssertions.AndConstraint BeJsonSerializable(this FluentAssertions.Primitives.ObjectAssertions assertions, System.Func, FluentAssertions.Equivalency.EquivalencyOptions> options, string because = "", params object[] becauseArgs) { } } public static class StringAssertionsExtensions { diff --git a/Tests/FluentAssertions.Json.Specs/FluentAssertions.Json.Specs.csproj b/Tests/FluentAssertions.Json.Specs/FluentAssertions.Json.Specs.csproj index 090ed711..b4482f52 100644 --- a/Tests/FluentAssertions.Json.Specs/FluentAssertions.Json.Specs.csproj +++ b/Tests/FluentAssertions.Json.Specs/FluentAssertions.Json.Specs.csproj @@ -17,12 +17,12 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Tests/FluentAssertions.Json.Specs/JTokenAssertionsSpecs.cs b/Tests/FluentAssertions.Json.Specs/JTokenAssertionsSpecs.cs index 81cb74fc..6193dcd9 100644 --- a/Tests/FluentAssertions.Json.Specs/JTokenAssertionsSpecs.cs +++ b/Tests/FluentAssertions.Json.Specs/JTokenAssertionsSpecs.cs @@ -773,7 +773,7 @@ public void When_expecting_a_different_number_of_elements_than_the_actual_number // Assert act.Should().Throw() - .WithMessage("Expected JSON document * to contain 1 item(s) because numbers matter, but found 0."); + .WithMessage("Expected JSON document * to contain 1 item(s) because numbers matter, but found 0*"); } [Fact] @@ -800,7 +800,7 @@ public void When_expecting_a_different_number_of_array_items_than_the_actual_num // Assert act.Should().Throw() - .WithMessage("Expected JSON document * to contain 3 item(s) because the more the better, but found 2."); + .WithMessage("Expected JSON document * to contain 3 item(s) because the more the better, but found 2*"); } #endregion HaveCount diff --git a/Tests/FluentAssertions.Json.Specs/JsonAssertionExtensionsSpecs.cs b/Tests/FluentAssertions.Json.Specs/JsonAssertionExtensionsSpecs.cs index dd9375a3..fbe44f2a 100644 --- a/Tests/FluentAssertions.Json.Specs/JsonAssertionExtensionsSpecs.cs +++ b/Tests/FluentAssertions.Json.Specs/JsonAssertionExtensionsSpecs.cs @@ -27,7 +27,7 @@ public void Should_Provide_Unambiguos_JTokenAssertions() // Act & Assert foreach (var sut in assertions) { - sut.Should().BeOfType("extensions should provide assertions for all JSon primitives, i.e. JObject, JToken and JProperty"); + ((object)sut).Should().BeOfType("extensions should provide assertions for all JSon primitives, i.e. JObject, JToken and JProperty"); } } } diff --git a/Tests/FluentAssertions.Json.Specs/JsonAssertionOptionsSpecs.cs b/Tests/FluentAssertions.Json.Specs/JsonAssertionOptionsSpecs.cs index 6b8142b1..b246f509 100644 --- a/Tests/FluentAssertions.Json.Specs/JsonAssertionOptionsSpecs.cs +++ b/Tests/FluentAssertions.Json.Specs/JsonAssertionOptionsSpecs.cs @@ -25,14 +25,14 @@ public void Local_equivalency_options_are_applied_on_top_of_global_equivalency_o private sealed class TempDefaultAssertionOptions : IDisposable { - public TempDefaultAssertionOptions(Func config) + public TempDefaultAssertionOptions(Func config) { - AssertionOptions.AssertEquivalencyUsing(config); + AssertionConfiguration.Current.Equivalency.Modify(config); } public void Dispose() { - AssertionOptions.AssertEquivalencyUsing(_ => new EquivalencyAssertionOptions()); + AssertionConfiguration.Current.Equivalency.Modify(_ => new()); } } } diff --git a/build.ps1 b/build.ps1 index b3a8824d..4634dc03 100644 --- a/build.ps1 +++ b/build.ps1 @@ -14,17 +14,14 @@ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent ########################################################################### $BuildProjectFile = "$PSScriptRoot\build\_build.csproj" -$TempDirectory = "$PSScriptRoot\.nuke\temp" +$TempDirectory = "$PSScriptRoot\\.nuke\temp" -$DotNetGlobalFile = "$PSScriptRoot\global.json" +$DotNetGlobalFile = "$PSScriptRoot\\global.json" $DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1" -$DotNetChannel = "Current" +$DotNetChannel = "STS" -$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1 $env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 -$env:DOTNET_MULTILEVEL_LOOKUP = 0 -$env:DOTNET_ROLL_FORWARD = "Major" -$env:NUKE_TELEMETRY_OPTOUT = 1 +$env:DOTNET_NOLOGO = 1 ########################################################################### # EXECUTION @@ -35,18 +32,9 @@ function ExecSafe([scriptblock] $cmd) { if ($LASTEXITCODE) { exit $LASTEXITCODE } } -# Print environment variables -# WARNING: Make sure that secrets are actually scrambled in build log -# Get-Item -Path Env:* | Sort-Object -Property Name | ForEach-Object {"{0}={1}" -f $_.Name,$_.Value} - -# Check if any dotnet is installed -if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue)) { - ExecSafe { & dotnet --info } -} - # If dotnet CLI is installed globally and it matches requested version, use for execution if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and ` - $(dotnet --version) -and $LASTEXITCODE -eq 0) { + $(dotnet --version) -and $LASTEXITCODE -eq 0) { $env:DOTNET_EXE = (Get-Command "dotnet").Path } else { @@ -72,9 +60,15 @@ else { ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } } $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" + $env:PATH = "$DotNetDirectory;$env:PATH" } -Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)" +Write-Output "Microsoft (R) .NET SDK version $(& $env:DOTNET_EXE --version)" + +if (Test-Path env:NUKE_ENTERPRISE_TOKEN) { + & $env:DOTNET_EXE nuget remove source "nuke-enterprise" > $null + & $env:DOTNET_EXE nuget add source "https://f.feedz.io/nuke/enterprise/nuget" --name "nuke-enterprise" --username "PAT" --password $env:NUKE_ENTERPRISE_TOKEN > $null +} -ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary } +ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet } ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } diff --git a/build.sh b/build.sh index f5bf05e1..2063070b 100755 --- a/build.sh +++ b/build.sh @@ -10,17 +10,14 @@ SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) ########################################################################### BUILD_PROJECT_FILE="$SCRIPT_DIR/Build/_build.csproj" -TEMP_DIRECTORY="$SCRIPT_DIR/.nuke/temp" +TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp" -DOTNET_GLOBAL_FILE="$SCRIPT_DIR/global.json" +DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh" -DOTNET_CHANNEL="Current" +DOTNET_CHANNEL="STS" export DOTNET_CLI_TELEMETRY_OPTOUT=1 -export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 -export DOTNET_MULTILEVEL_LOOKUP=0 -export DOTNET_ROLL_FORWARD="Major" -export NUKE_TELEMETRY_OPTOUT=1 +export DOTNET_NOLOGO=1 ########################################################################### # EXECUTION @@ -30,15 +27,6 @@ function FirstJsonValue { perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}" } -# Print environment variables -# WARNING: Make sure that secrets are actually scrambled in build log -# env | sort - -# Check if any dotnet is installed -if [[ -x "$(command -v dotnet)" ]]; then - dotnet --info -fi - # If dotnet CLI is installed globally and it matches requested version, use for execution if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then export DOTNET_EXE="$(command -v dotnet)" @@ -65,9 +53,15 @@ else "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path fi export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" + export PATH="$DOTNET_DIRECTORY:$PATH" fi -echo "Microsoft (R) .NET Core SDK version $("$DOTNET_EXE" --version)" +echo "Microsoft (R) .NET SDK version $("$DOTNET_EXE" --version)" + +if [[ ! -z ${NUKE_ENTERPRISE_TOKEN+x} && "$NUKE_ENTERPRISE_TOKEN" != "" ]]; then + "$DOTNET_EXE" nuget remove source "nuke-enterprise" &>/dev/null || true + "$DOTNET_EXE" nuget add source "https://f.feedz.io/nuke/enterprise/nuget" --name "nuke-enterprise" --username "PAT" --password "$NUKE_ENTERPRISE_TOKEN" --store-password-in-clear-text &>/dev/null || true +fi -"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary +"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet "$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@" diff --git a/global.json b/global.json index 368a14e3..d07970ac 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { - "sdk": { - "version": "8.0.100", - "rollForward": "latestMajor" - } + "sdk": { + "version": "8.0.100", + "rollForward": "latestMajor" + } }