From e9a0fb800b8bae026b6c0ee59b6f484d6fe25211 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Mon, 8 Jan 2024 11:01:37 +1100 Subject: [PATCH] . --- src/Verify/Compare/SharedSettings.cs | 4 ++-- src/Verify/Counter.cs | 11 +++++++++++ src/Verify/Counter_Date.cs | 3 +-- src/Verify/Counter_DateTime.cs | 2 +- src/Verify/Counter_DateTimeOffset.cs | 2 +- src/Verify/Counter_Guid.cs | 2 +- src/Verify/Counter_Time.cs | 2 +- src/Verify/Naming/VerifierSettings.cs | 2 +- ...fierSettings_ExtensionMappedGlobalScrubbers.cs | 2 +- src/Verify/Serialization/VerifierSettings.cs | 4 ++-- .../VerifierSettings_MemberConverter.cs | 2 +- src/Verify/Splitters/Settings_Extension.cs | 2 +- src/Verify/Verifier/InnerVerifier.cs | 15 ++++++++++++--- src/Verify/VerifierSettings.cs | 13 +++++++++++++ 14 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/Verify/Compare/SharedSettings.cs b/src/Verify/Compare/SharedSettings.cs index d8aa23b261..7a50f13f75 100644 --- a/src/Verify/Compare/SharedSettings.cs +++ b/src/Verify/Compare/SharedSettings.cs @@ -2,8 +2,8 @@ public static partial class VerifierSettings { - static Dictionary stringComparers = []; - static Dictionary streamComparers = []; + static IDictionary stringComparers = new Dictionary(); + static IDictionary streamComparers = new Dictionary(); static StringCompare? defaultStringComparer; internal static bool TryGetStreamComparer(string extension, [NotNullWhen(true)] out StreamCompare? comparer) => diff --git a/src/Verify/Counter.cs b/src/Verify/Counter.cs index 025c719c02..a296d97b33 100644 --- a/src/Verify/Counter.cs +++ b/src/Verify/Counter.cs @@ -2,6 +2,17 @@ public partial class Counter { + internal static void FirstRun() + { +#if NET8_0_OR_GREATER + globalNamedDates = globalNamedDates.ToFrozenDictionary(); + globalNamedDateTimes = globalNamedDateTimes.ToFrozenDictionary(); + globalNamedDateTimeOffsets = globalNamedDateTimeOffsets.ToFrozenDictionary(); + globalNamedGuids = globalNamedGuids.ToFrozenDictionary(); + globalNamedTimes = globalNamedTimes.ToFrozenDictionary(); +#endif + } + #if NET6_0_OR_GREATER Dictionary namedDates; Dictionary namedTimes; diff --git a/src/Verify/Counter_Date.cs b/src/Verify/Counter_Date.cs index 979ac5179a..ca85652821 100644 --- a/src/Verify/Counter_Date.cs +++ b/src/Verify/Counter_Date.cs @@ -4,9 +4,8 @@ namespace VerifyTests; public partial class Counter { ConcurrentDictionary dateCache = []; - static Dictionary globalNamedDates = []; + static IDictionary globalNamedDates = new Dictionary(); int currentDate; - internal static void AddNamed(Date value, string name) { InnerVerifier.ThrowIfVerifyHasBeenRun(); diff --git a/src/Verify/Counter_DateTime.cs b/src/Verify/Counter_DateTime.cs index dbce221ad1..bee60e0e9b 100644 --- a/src/Verify/Counter_DateTime.cs +++ b/src/Verify/Counter_DateTime.cs @@ -3,7 +3,7 @@ public partial class Counter { ConcurrentDictionary dateTimeCache = new(new DateTimeComparer()); - static Dictionary globalNamedDateTimes = []; + static IDictionary globalNamedDateTimes = new Dictionary(); class DateTimeComparer : IEqualityComparer { diff --git a/src/Verify/Counter_DateTimeOffset.cs b/src/Verify/Counter_DateTimeOffset.cs index 7b5de32280..613a9de18b 100644 --- a/src/Verify/Counter_DateTimeOffset.cs +++ b/src/Verify/Counter_DateTimeOffset.cs @@ -3,7 +3,7 @@ public partial class Counter { ConcurrentDictionary dateTimeOffsetCache = new(new DateTimeOffsetComparer()); - static Dictionary globalNamedDateTimeOffsets = []; + static IDictionary globalNamedDateTimeOffsets = new Dictionary(); class DateTimeOffsetComparer : IEqualityComparer diff --git a/src/Verify/Counter_Guid.cs b/src/Verify/Counter_Guid.cs index 14ac5387eb..fee3b031d3 100644 --- a/src/Verify/Counter_Guid.cs +++ b/src/Verify/Counter_Guid.cs @@ -3,7 +3,7 @@ public partial class Counter { ConcurrentDictionary guidCache = []; - static Dictionary globalNamedGuids = []; + static IDictionary globalNamedGuids = new Dictionary(); int currentGuid; public int Next(Guid input) => diff --git a/src/Verify/Counter_Time.cs b/src/Verify/Counter_Time.cs index 5cde54a3ef..14b80195a5 100644 --- a/src/Verify/Counter_Time.cs +++ b/src/Verify/Counter_Time.cs @@ -4,7 +4,7 @@ namespace VerifyTests; public partial class Counter { ConcurrentDictionary timeCache = []; - static Dictionary globalNamedTimes = []; + static IDictionary globalNamedTimes = new Dictionary(); int currentTime; internal static void AddNamed(Time time, string name) diff --git a/src/Verify/Naming/VerifierSettings.cs b/src/Verify/Naming/VerifierSettings.cs index b092b46b0f..c3dfc9cf71 100644 --- a/src/Verify/Naming/VerifierSettings.cs +++ b/src/Verify/Naming/VerifierSettings.cs @@ -4,7 +4,7 @@ public static partial class VerifierSettings { internal static Namer SharedNamer = new(); - static Dictionary> parameterToNameLookup = new() + static IDictionary> parameterToNameLookup = new Dictionary> { { typeof(bool), _ => ((bool) _).ToString(Culture.InvariantCulture) diff --git a/src/Verify/Serialization/Scrubbers/VerifierSettings_ExtensionMappedGlobalScrubbers.cs b/src/Verify/Serialization/Scrubbers/VerifierSettings_ExtensionMappedGlobalScrubbers.cs index b6d2a3dace..79fc77604a 100644 --- a/src/Verify/Serialization/Scrubbers/VerifierSettings_ExtensionMappedGlobalScrubbers.cs +++ b/src/Verify/Serialization/Scrubbers/VerifierSettings_ExtensionMappedGlobalScrubbers.cs @@ -2,7 +2,7 @@ public static partial class VerifierSettings { - internal static Dictionary>> ExtensionMappedGlobalScrubbers = []; + internal static IDictionary>> ExtensionMappedGlobalScrubbers = new Dictionary>>(); /// /// Modify the resulting test content using custom code. diff --git a/src/Verify/Serialization/VerifierSettings.cs b/src/Verify/Serialization/VerifierSettings.cs index 8750d62f34..6d87f6fb6d 100644 --- a/src/Verify/Serialization/VerifierSettings.cs +++ b/src/Verify/Serialization/VerifierSettings.cs @@ -33,7 +33,7 @@ public static bool TryGetToString( return typeToString.TryGetValue(target.GetType(), out toString); } - static Dictionary, AsStringResult>> typeToString = new() + static IDictionary, AsStringResult>> typeToString = new Dictionary, AsStringResult>> { #region typeToStringMapping @@ -135,7 +135,7 @@ public static void TreatAsString(AsString? toString = null) internal static void Reset() { - InnerVerifier.verifyHasBeenRun = false; + InnerVerifier.verifyHasBeenRun = 0; DateCountingEnabled = true; StrictJson = false; scrubProjectDir = true; diff --git a/src/Verify/Serialization/VerifierSettings_MemberConverter.cs b/src/Verify/Serialization/VerifierSettings_MemberConverter.cs index 17f0a5d349..ff239209c0 100644 --- a/src/Verify/Serialization/VerifierSettings_MemberConverter.cs +++ b/src/Verify/Serialization/VerifierSettings_MemberConverter.cs @@ -2,7 +2,7 @@ public static partial class VerifierSettings { - static Dictionary> membersConverters = []; + static IDictionary> membersConverters = new Dictionary>(); internal static ConvertTargetMember? GetMemberConverter(MemberInfo member) => GetMemberConverter(member.DeclaringType, member.Name); diff --git a/src/Verify/Splitters/Settings_Extension.cs b/src/Verify/Splitters/Settings_Extension.cs index 5075c7e9bb..63ff54c9d3 100644 --- a/src/Verify/Splitters/Settings_Extension.cs +++ b/src/Verify/Splitters/Settings_Extension.cs @@ -2,7 +2,7 @@ public static partial class VerifierSettings { - static Dictionary> extensionConverters = []; + static IDictionary> extensionConverters = new Dictionary>(); internal static bool TryGetExtensionConverter(string extension, [NotNullWhen(true)] out AsyncConversion? converter) => extensionConverters.TryGetValue(extension, out converter); diff --git a/src/Verify/Verifier/InnerVerifier.cs b/src/Verify/Verifier/InnerVerifier.cs index 3d8addcebe..49adb7ffbe 100644 --- a/src/Verify/Verifier/InnerVerifier.cs +++ b/src/Verify/Verifier/InnerVerifier.cs @@ -11,12 +11,12 @@ public partial class InnerVerifier : GetIndexedFileNames getIndexedFileNames = null!; IEnumerable verifiedFiles = null!; Counter counter; - internal static bool verifyHasBeenRun; + internal static int verifyHasBeenRun; [MethodImpl(MethodImplOptions.NoInlining)] public static void ThrowIfVerifyHasBeenRun() { - if (!verifyHasBeenRun) + if (verifyHasBeenRun == 0) { return; } @@ -38,7 +38,7 @@ public InnerVerifier( Guard.AgainstEmpty(sourceFile); Guard.AgainstEmpty(typeName); Guard.AgainstEmpty(methodName); - verifyHasBeenRun = true; + FirstRun(); VerifierSettings.RunBeforeCallbacks(); this.settings = settings; @@ -63,6 +63,15 @@ public InnerVerifier( } } + static void FirstRun() + { + if (Interlocked.Exchange(ref verifyHasBeenRun, 1) == 0) + { + VerifierSettings.FirstRun(); + Counter.FirstRun(); + } + } + /// /// Initialize a new instance of the class for verifying the entire file (not just a specific type) /// diff --git a/src/Verify/VerifierSettings.cs b/src/Verify/VerifierSettings.cs index e680390291..9540e078f6 100644 --- a/src/Verify/VerifierSettings.cs +++ b/src/Verify/VerifierSettings.cs @@ -7,6 +7,19 @@ public static partial class VerifierSettings public static void OmitContentFromException() => omitContentFromException = true; + internal static void FirstRun() + { +#if NET8_0_OR_GREATER + stringComparers = stringComparers.ToFrozenDictionary(); + streamComparers = streamComparers.ToFrozenDictionary(); + parameterToNameLookup = parameterToNameLookup.ToFrozenDictionary(); + ExtensionMappedGlobalScrubbers = ExtensionMappedGlobalScrubbers.ToFrozenDictionary(); + typeToString = typeToString.ToFrozenDictionary(); + membersConverters = membersConverters.ToFrozenDictionary(); + extensionConverters = extensionConverters.ToFrozenDictionary(); +#endif + } + /// /// Automatically accept the results of all tests. ///