diff --git a/Terminal.Gui/Configuration/ConfigProperty.cs b/Terminal.Gui/Configuration/ConfigProperty.cs index 2418268cfc..0c4a41682a 100644 --- a/Terminal.Gui/Configuration/ConfigProperty.cs +++ b/Terminal.Gui/Configuration/ConfigProperty.cs @@ -41,7 +41,7 @@ public bool Apply () { if (PropertyInfo?.GetValue (null) is { }) { - PropertyInfo?.SetValue (null, DeepMemberwiseCopy (PropertyValue, PropertyInfo?.GetValue (null))); + PropertyInfo?.SetValue (null, DeepMemberWiseCopy (PropertyValue, PropertyInfo?.GetValue (null))); } } catch (TargetInvocationException tie) @@ -82,9 +82,9 @@ public bool Apply () /// public static string GetJsonPropertyName (PropertyInfo pi) { - var jpna = pi.GetCustomAttribute (typeof (JsonPropertyNameAttribute)) as JsonPropertyNameAttribute; + var attr = pi.GetCustomAttribute (typeof (JsonPropertyNameAttribute)) as JsonPropertyNameAttribute; - return jpna?.Name ?? pi.Name; + return attr?.Name ?? pi.Name; } /// @@ -118,7 +118,7 @@ public static string GetJsonPropertyName (PropertyInfo pi) if (PropertyValue is { }) { - PropertyValue = DeepMemberwiseCopy (source, PropertyValue); + PropertyValue = DeepMemberWiseCopy (source, PropertyValue); } else { diff --git a/Terminal.Gui/Configuration/ConfigurationManager.cs b/Terminal.Gui/Configuration/ConfigurationManager.cs index 1731c9556c..f72cdd775a 100644 --- a/Terminal.Gui/Configuration/ConfigurationManager.cs +++ b/Terminal.Gui/Configuration/ConfigurationManager.cs @@ -2,6 +2,7 @@ global using CM = Terminal.Gui.ConfigurationManager; using System.Collections; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text.Encodings.Web; using System.Text.Json; @@ -33,19 +34,19 @@ namespace Terminal.Gui; /// Settings are applied using the following precedence (higher precedence settings overwrite lower precedence /// settings): /// -/// 1. Application configuration found in the users's home directory (~/.tui/appname.config.json) -- +/// 1. Application configuration found in the users' home directory (~/.tui/appname.config.json) -- /// Highest precedence /// /// /// 2. Application configuration found in the directory the app was launched from ( /// ./.tui/appname.config.json). /// -/// 3. Application configuration found in the applications's resources (Resources/config.json). +/// 3. Application configuration found in the applications' resources (Resources/config.json). /// 4. Global configuration found in the user's home directory (~/.tui/config.json). /// 5. Global configuration found in the directory the app was launched from (./.tui/config.json). /// /// 6. Global configuration in Terminal.Gui.dll's resources (Terminal.Gui.Resources.config.json) -- -/// Lowest Precidence. +/// Lowest Precedence. /// /// public static class ConfigurationManager @@ -82,10 +83,10 @@ public enum ConfigLocations /// to get and set the property's value. /// /// Is until is called. - [System.Diagnostics.CodeAnalysis.SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] + [SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] internal static Dictionary? _allConfigProperties; - [System.Diagnostics.CodeAnalysis.SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] + [SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] internal static readonly JsonSerializerOptions _serializerOptions = new () { ReadCommentHandling = JsonCommentHandling.Skip, @@ -106,10 +107,10 @@ public enum ConfigLocations Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; - [System.Diagnostics.CodeAnalysis.SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] + [SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] internal static StringBuilder _jsonErrors = new (); - [System.Diagnostics.CodeAnalysis.SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] + [SuppressMessage ("Style", "IDE1006:Naming Styles", Justification = "")] private static readonly string _configFilename = "config.json"; /// The backing property for . @@ -284,7 +285,7 @@ public static void Load (bool reset = false) public static void OnApplied () { Debug.WriteLine ("ConfigurationManager.OnApplied()"); - Applied?.Invoke (null, new ConfigurationManagerEventArgs ()); + Applied?.Invoke (null, new ()); // TODO: Refactor ConfigurationManager to not use an event handler for this. // Instead, have it call a method on any class appropriately attributed @@ -298,7 +299,7 @@ public static void OnApplied () public static void OnUpdated () { Debug.WriteLine (@"ConfigurationManager.OnApplied()"); - Updated?.Invoke (null, new ConfigurationManagerEventArgs ()); + Updated?.Invoke (null, new ()); } /// Prints any Json deserialization errors that occurred during deserialization to the console. @@ -330,9 +331,9 @@ public static void Reset () ClearJsonErrors (); - Settings = new SettingsScope (); + Settings = new (); ThemeManager.Reset (); - AppSettings = new AppScope (); + AppSettings = new (); // To enable some unit tests, we only load from resources if the flag is set if (Locations.HasFlag (ConfigLocations.DefaultOnly)) @@ -359,18 +360,15 @@ internal static void AddJsonError (string error) /// /// System.Text.Json does not support copying a deserialized object to an existing instance. To work around this, - /// we implement a 'deep, memberwise copy' method. + /// we implement a 'deep, member-wise copy' method. /// /// TOOD: When System.Text.Json implements `PopulateObject` revisit https://github.com/dotnet/corefx/issues/37627 /// /// /// updated from - internal static object? DeepMemberwiseCopy (object? source, object? destination) + internal static object? DeepMemberWiseCopy (object? source, object? destination) { - if (destination is null) - { - throw new ArgumentNullException (nameof (destination)); - } + ArgumentNullException.ThrowIfNull (destination); if (source is null) { @@ -410,7 +408,7 @@ internal static void AddJsonError (string error) if (((IDictionary)destination).Contains (srcKey)) { ((IDictionary)destination) [srcKey] = - DeepMemberwiseCopy (((IDictionary)source) [srcKey], ((IDictionary)destination) [srcKey]); + DeepMemberWiseCopy (((IDictionary)source) [srcKey], ((IDictionary)destination) [srcKey]); } else { @@ -442,7 +440,7 @@ where destProp.CanWrite if (destVal is { }) { // Recurse - destProp.SetValue (destination, DeepMemberwiseCopy (sourceVal, destVal)); + destProp.SetValue (destination, DeepMemberWiseCopy (sourceVal, destVal)); } else { @@ -482,7 +480,7 @@ internal static void GetHardCodedDefaults () throw new InvalidOperationException ("Initialize must be called first."); } - Settings = new SettingsScope (); + Settings = new (); ThemeManager.GetHardCodedDefaults (); AppSettings?.RetrieveValues (); @@ -498,7 +496,7 @@ internal static void GetHardCodedDefaults () /// internal static void Initialize () { - _allConfigProperties = new Dictionary (); + _allConfigProperties = new (); _settings = null; Dictionary classesWithConfigProps = new (StringComparer.InvariantCultureIgnoreCase); @@ -553,18 +551,18 @@ from p in enumerable scp.OmitClassName ? ConfigProperty.GetJsonPropertyName (p) : $"{p.DeclaringType?.Name}.{p.Name}", - new ConfigProperty { PropertyInfo = p, PropertyValue = null } + new() { PropertyInfo = p, PropertyValue = null } ); } else { - throw new Exception ( - $"Property { - p.Name - } in class { - p.DeclaringType?.Name - } is not static. All SerializableConfigurationProperty properties must be static." - ); + throw new ( + $"Property { + p.Name + } in class { + p.DeclaringType?.Name + } is not static. All SerializableConfigurationProperty properties must be static." + ); } } } @@ -580,7 +578,7 @@ from p in enumerable //_allConfigProperties.ToList ().ForEach (x => Debug.WriteLine ($" Property: {x.Key}")); - AppSettings = new AppScope (); + AppSettings = new (); } /// Creates a JSON document with the configuration specified. diff --git a/UnitTests/Configuration/ConfigurationMangerTests.cs b/UnitTests/Configuration/ConfigurationMangerTests.cs index d2c96b341d..6d32738470 100644 --- a/UnitTests/Configuration/ConfigurationMangerTests.cs +++ b/UnitTests/Configuration/ConfigurationMangerTests.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Text.Json; using static Terminal.Gui.ConfigurationManager; +#pragma warning disable IDE1006 namespace Terminal.Gui.ConfigurationTests; @@ -45,65 +46,65 @@ void ConfigurationManager_Applied (object sender, ConfigurationManagerEventArgs } [Fact] - public void DeepMemberwiseCopyTest () + public void DeepMemberWiseCopyTest () { // Value types var stringDest = "Destination"; var stringSrc = "Source"; - object stringCopy = DeepMemberwiseCopy (stringSrc, stringDest); + object stringCopy = DeepMemberWiseCopy (stringSrc, stringDest); Assert.Equal (stringSrc, stringCopy); stringDest = "Destination"; stringSrc = "Destination"; - stringCopy = DeepMemberwiseCopy (stringSrc, stringDest); + stringCopy = DeepMemberWiseCopy (stringSrc, stringDest); Assert.Equal (stringSrc, stringCopy); stringDest = "Destination"; stringSrc = null; - stringCopy = DeepMemberwiseCopy (stringSrc, stringDest); + stringCopy = DeepMemberWiseCopy (stringSrc, stringDest); Assert.Equal (stringSrc, stringCopy); stringDest = "Destination"; stringSrc = string.Empty; - stringCopy = DeepMemberwiseCopy (stringSrc, stringDest); + stringCopy = DeepMemberWiseCopy (stringSrc, stringDest); Assert.Equal (stringSrc, stringCopy); var boolDest = true; var boolSrc = false; - object boolCopy = DeepMemberwiseCopy (boolSrc, boolDest); + object boolCopy = DeepMemberWiseCopy (boolSrc, boolDest); Assert.Equal (boolSrc, boolCopy); boolDest = false; boolSrc = true; - boolCopy = DeepMemberwiseCopy (boolSrc, boolDest); + boolCopy = DeepMemberWiseCopy (boolSrc, boolDest); Assert.Equal (boolSrc, boolCopy); boolDest = true; boolSrc = true; - boolCopy = DeepMemberwiseCopy (boolSrc, boolDest); + boolCopy = DeepMemberWiseCopy (boolSrc, boolDest); Assert.Equal (boolSrc, boolCopy); boolDest = false; boolSrc = false; - boolCopy = DeepMemberwiseCopy (boolSrc, boolDest); + boolCopy = DeepMemberWiseCopy (boolSrc, boolDest); Assert.Equal (boolSrc, boolCopy); // Structs var attrDest = new Attribute (Color.Black); var attrSrc = new Attribute (Color.White); - object attrCopy = DeepMemberwiseCopy (attrSrc, attrDest); + object attrCopy = DeepMemberWiseCopy (attrSrc, attrDest); Assert.Equal (attrSrc, attrCopy); // Classes var colorschemeDest = new ColorScheme { Disabled = new Attribute (Color.Black) }; var colorschemeSrc = new ColorScheme { Disabled = new Attribute (Color.White) }; - object colorschemeCopy = DeepMemberwiseCopy (colorschemeSrc, colorschemeDest); + object colorschemeCopy = DeepMemberWiseCopy (colorschemeSrc, colorschemeDest); Assert.Equal (colorschemeSrc, colorschemeCopy); // Dictionaries Dictionary dictDest = new () { { "Disabled", new Attribute (Color.Black) } }; Dictionary dictSrc = new () { { "Disabled", new Attribute (Color.White) } }; - Dictionary dictCopy = (Dictionary)DeepMemberwiseCopy (dictSrc, dictDest); + Dictionary dictCopy = (Dictionary)DeepMemberWiseCopy (dictSrc, dictDest); Assert.Equal (dictSrc, dictCopy); dictDest = new Dictionary { { "Disabled", new Attribute (Color.Black) } }; @@ -112,7 +113,7 @@ public void DeepMemberwiseCopyTest () { { "Disabled", new Attribute (Color.White) }, { "Normal", new Attribute (Color.Blue) } }; - dictCopy = (Dictionary)DeepMemberwiseCopy (dictSrc, dictDest); + dictCopy = (Dictionary)DeepMemberWiseCopy (dictSrc, dictDest); Assert.Equal (dictSrc, dictCopy); // src adds an item @@ -122,7 +123,7 @@ public void DeepMemberwiseCopyTest () { { "Disabled", new Attribute (Color.White) }, { "Normal", new Attribute (Color.Blue) } }; - dictCopy = (Dictionary)DeepMemberwiseCopy (dictSrc, dictDest); + dictCopy = (Dictionary)DeepMemberWiseCopy (dictSrc, dictDest); Assert.Equal (2, dictCopy.Count); Assert.Equal (dictSrc ["Disabled"], dictCopy ["Disabled"]); Assert.Equal (dictSrc ["Normal"], dictCopy ["Normal"]); @@ -133,7 +134,7 @@ public void DeepMemberwiseCopyTest () { "Disabled", new Attribute (Color.Black) }, { "Normal", new Attribute (Color.White) } }; dictSrc = new Dictionary { { "Disabled", new Attribute (Color.White) } }; - dictCopy = (Dictionary)DeepMemberwiseCopy (dictSrc, dictDest); + dictCopy = (Dictionary)DeepMemberWiseCopy (dictSrc, dictDest); Assert.Equal (2, dictCopy.Count); Assert.Equal (dictSrc ["Disabled"], dictCopy ["Disabled"]); Assert.Equal (dictDest ["Normal"], dictCopy ["Normal"]); @@ -379,7 +380,7 @@ public void TestConfigProperties () Assert.NotEmpty (Settings); - // test that all ConfigProperites have our attribute + // test that all ConfigProperties have our attribute Assert.All ( Settings, item => Assert.NotEmpty ( @@ -411,7 +412,7 @@ public void TestConfigProperties () [Fact] public void TestConfigPropertyOmitClassName () { - // Color.ColorShemes is serialzied as "ColorSchemes", not "Colors.ColorSchemes" + // Color.ColorSchemes is serialized as "ColorSchemes", not "Colors.ColorSchemes" PropertyInfo pi = typeof (Colors).GetProperty ("ColorSchemes"); var scp = (SerializableConfigurationProperty)pi.GetCustomAttribute (typeof (SerializableConfigurationProperty)); Assert.True (scp.Scope == typeof (ThemeScope)); @@ -624,7 +625,7 @@ public void TestConfigurationManagerInvalidJsonThrows () jsonException = Assert.Throws (() => Settings.Update (json, "test")); Assert.Equal ("Both Foreground and Background colors must be provided.", jsonException.Message); - // Unknown proeprty + // Unknown property json = @" { ""Unknown"" : ""Not known""