diff --git a/.editorconfig b/.editorconfig index 88adceb6a..5fb6a86b8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -73,7 +73,6 @@ max_line_length = 160 end_of_line = crlf dotnet_style_prefer_simplified_boolean_expressions = true:suggestion -[*.cs] csharp_using_directive_placement = outside_namespace:silent csharp_prefer_simple_using_statement = true:suggestion csharp_prefer_braces = true:silent @@ -91,6 +90,18 @@ csharp_style_expression_bodied_local_functions = false:silent csharp_indent_labels = one_less_than_current csharp_style_prefer_primary_constructors = false:suggestion +# CA1848: Use the LoggerMessage delegates +dotnet_diagnostic.CA1848.severity = none + +# CA1727: Use PascalCase for named placeholders +dotnet_diagnostic.CA1727.severity = suggestion + +# CA2254: Template should be a static expression +dotnet_diagnostic.CA2254.severity = none + +# CA1822: Mark members as static +dotnet_diagnostic.CA1822.severity = suggestion + [Program.cs] dotnet_diagnostic.CA1050.severity = none dotnet_diagnostic.S1118.severity = none diff --git a/Altinn3.ruleset b/Altinn3.ruleset deleted file mode 100644 index 144dabf85..000000000 --- a/Altinn3.ruleset +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Directory.Build.props b/Directory.Build.props index 8ccd36190..7f5799428 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,6 +5,10 @@ latest + true + Minimum + strict + diff --git a/Settings.StyleCop b/Settings.StyleCop deleted file mode 100644 index fd124ef02..000000000 --- a/Settings.StyleCop +++ /dev/null @@ -1,237 +0,0 @@ - - - - preprocessor, pre-processor - shortlived, short-lived - - - altinn - arbeidsgiveravgift - aspx - BankID - brreg - Buypass - Commfides - compat - Compat.browser - Creuna - css - dequeue - Dequeue - deserializing - Determinator - enum - en-US - formset - Functoid - ID-Porten - js - leveranse - linq - msdn - oppgave - orid - participant - Porten - psa - referer - reportee - sone - ssn - subform - subforms - virksomhet - Winnovative - xfd - xsd - Guid - Api - OAuth - Auth - mpcId - mpc - Sdp - Difi - Difis - Rijndael - eq - orderby - Oppgaveregister - Seres - reportees - - 10000 - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - True - - - - - - - False - - - - - - - - - - False - - - - - False - - - - - - a1 - as - at - d - db - dn - do - dr - ds - dt - e - e2 - er - f - fs - go - id - if - in - ip - is - js - li - my - no - ns - on - or - pi - pv - sa - sb - se - si - so - sp - tc - to - tr - ui - un - wf - ws - x - y - - - - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - False - - - - - - - - - - False - - - - - - - - - - False - - - - - - - \ No newline at end of file diff --git a/src/Altinn.App.Api/Altinn.App.Api.csproj b/src/Altinn.App.Api/Altinn.App.Api.csproj index 80c867601..c3f17fbab 100644 --- a/src/Altinn.App.Api/Altinn.App.Api.csproj +++ b/src/Altinn.App.Api/Altinn.App.Api.csproj @@ -26,29 +26,10 @@ - - - all - runtime; build; native; contentfiles; analyzers - - - stylecop.json - - - - - ..\..\Altinn3.ruleset - - - - true - $(NoWarn);1591 - - diff --git a/src/Altinn.App.Api/Controllers/DataController.cs b/src/Altinn.App.Api/Controllers/DataController.cs index 3bd87dd4b..d1931c270 100644 --- a/src/Altinn.App.Api/Controllers/DataController.cs +++ b/src/Altinn.App.Api/Controllers/DataController.cs @@ -586,7 +586,7 @@ [FromRoute] Guid dataGuid } } - private ActionResult ExceptionResponse(Exception exception, string message) + private ObjectResult ExceptionResponse(Exception exception, string message) { _logger.LogError(exception, message); diff --git a/src/Altinn.App.Api/Controllers/DataTagsController.cs b/src/Altinn.App.Api/Controllers/DataTagsController.cs index 2de8025fa..49b3cabcb 100644 --- a/src/Altinn.App.Api/Controllers/DataTagsController.cs +++ b/src/Altinn.App.Api/Controllers/DataTagsController.cs @@ -168,9 +168,8 @@ [FromRoute] string tag return NotFound("Unable to find data element based on the given parameters."); } - if (dataElement.Tags.Contains(tag)) + if (dataElement.Tags.Remove(tag)) { - dataElement.Tags.Remove(tag); await _dataClient.Update(instance, dataElement); } diff --git a/src/Altinn.App.Api/Controllers/InstancesController.cs b/src/Altinn.App.Api/Controllers/InstancesController.cs index 257e04eb9..a32dfa55e 100644 --- a/src/Altinn.App.Api/Controllers/InstancesController.cs +++ b/src/Altinn.App.Api/Controllers/InstancesController.cs @@ -194,7 +194,7 @@ [FromQuery] int? instanceOwnerPartyId MultipartRequestReader parsedRequest = new MultipartRequestReader(Request); await parsedRequest.Read(); - if (parsedRequest.Errors.Any()) + if (parsedRequest.Errors.Count != 0) { return BadRequest($"Error when reading content: {JsonConvert.SerializeObject(parsedRequest.Errors)}"); } @@ -793,7 +793,7 @@ int instanceOwnerPartyId List activeInstances = await _instanceClient.GetInstances(queryParams); - if (!activeInstances.Any()) + if (activeInstances.Count == 0) { return Ok(new List()); } diff --git a/src/Altinn.App.Api/Controllers/ProcessController.cs b/src/Altinn.App.Api/Controllers/ProcessController.cs index 0d4828b5b..190ed80c5 100644 --- a/src/Altinn.App.Api/Controllers/ProcessController.cs +++ b/src/Altinn.App.Api/Controllers/ProcessController.cs @@ -631,7 +631,7 @@ private async Task ConvertAndAuthorizeActions(Instance instance return appProcessState; } - private ActionResult ExceptionResponse(Exception exception, string message) + private ObjectResult ExceptionResponse(Exception exception, string message) { _logger.LogError(exception, message); diff --git a/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs b/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs index 224d46b1c..e9d53242a 100644 --- a/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs +++ b/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs @@ -30,7 +30,7 @@ public bool IsMultipart get { return !string.IsNullOrEmpty(request.ContentType) - && request.ContentType.IndexOf("multipart/", StringComparison.OrdinalIgnoreCase) >= 0; + && request.ContentType.Contains("multipart/", StringComparison.OrdinalIgnoreCase); } } diff --git a/src/Altinn.App.Api/Infrastructure/Filters/ValidateAntiforgeryTokenIfAuthCookieAuthorizationFilter.cs b/src/Altinn.App.Api/Infrastructure/Filters/ValidateAntiforgeryTokenIfAuthCookieAuthorizationFilter.cs index fe6023452..6f305dc93 100644 --- a/src/Altinn.App.Api/Infrastructure/Filters/ValidateAntiforgeryTokenIfAuthCookieAuthorizationFilter.cs +++ b/src/Altinn.App.Api/Infrastructure/Filters/ValidateAntiforgeryTokenIfAuthCookieAuthorizationFilter.cs @@ -27,10 +27,7 @@ public ValidateAntiforgeryTokenIfAuthCookieAuthorizationFilter( IOptionsMonitor settings ) { - if (antiforgery == null) - { - throw new ArgumentNullException(nameof(antiforgery)); - } + ArgumentNullException.ThrowIfNull(antiforgery); _antiforgery = antiforgery; _settings = settings.CurrentValue; @@ -64,10 +61,7 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context) /// True if validation is needed. protected virtual bool ShouldValidate(AuthorizationFilterContext context) { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } + ArgumentNullException.ThrowIfNull(context); string method = context.HttpContext.Request.Method; if ( diff --git a/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler.cs b/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler.cs index 00cc4b75c..6a704f3ec 100644 --- a/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler.cs +++ b/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler.cs @@ -223,8 +223,10 @@ private async Task GetStatusesForShipment(string shipmentId) private static bool MessageDeliveredToKS(Statuses statuses) { - return statuses.Content.FirstOrDefault(s => s.Status.ToLower() == "levert" || s.Status.ToLower() == "lest") - != null; + return statuses.Content.FirstOrDefault(s => + s.Status.Equals("levert", StringComparison.OrdinalIgnoreCase) + || s.Status.Equals("lest", StringComparison.OrdinalIgnoreCase) + ) != null; } private static bool MessageTimedOutToKS(Statuses statuses, out string errorMessage) @@ -244,7 +246,9 @@ private static (bool Error, string ErrorMessage) CheckErrorStatus(Statuses statu bool isError = false; string errorMessage = string.Empty; - var status = statuses.Content.FirstOrDefault(s => s.Status.ToLower() == errorStatus); + var status = statuses.Content.FirstOrDefault(s => + s.Status.Equals(errorStatus, StringComparison.OrdinalIgnoreCase) + ); if (status != null) { isError = true; diff --git a/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler2.cs b/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler2.cs index a8e88452d..b5b23f5c6 100644 --- a/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler2.cs +++ b/src/Altinn.App.Core/EFormidling/Implementation/EformidlingStatusCheckEventHandler2.cs @@ -197,8 +197,10 @@ private async Task GetStatusesForShipment(string shipmentId) private static bool MessageDeliveredToKS(Statuses statuses) { - return statuses.Content.FirstOrDefault(s => s.Status.ToLower() == "levert" || s.Status.ToLower() == "lest") - != null; + return statuses.Content.FirstOrDefault(s => + s.Status.Equals("levert", StringComparison.OrdinalIgnoreCase) + || s.Status.Equals("lest", StringComparison.OrdinalIgnoreCase) + ) != null; } private static bool MessageTimedOutToKS(Statuses statuses, out string errorMessage) @@ -218,7 +220,9 @@ private static (bool Error, string ErrorMessage) CheckErrorStatus(Statuses statu bool isError = false; string errorMessage = string.Empty; - var status = statuses.Content.FirstOrDefault(s => s.Status.ToLower() == errorStatus); + var status = statuses.Content.FirstOrDefault(s => + s.Status.Equals(errorStatus, StringComparison.OrdinalIgnoreCase) + ); if (status != null) { isError = true; diff --git a/src/Altinn.App.Core/Extensions/ConfigurationBuilderExtensions.cs b/src/Altinn.App.Core/Extensions/ConfigurationBuilderExtensions.cs index fb6fe10a4..9d0301c85 100644 --- a/src/Altinn.App.Core/Extensions/ConfigurationBuilderExtensions.cs +++ b/src/Altinn.App.Core/Extensions/ConfigurationBuilderExtensions.cs @@ -34,7 +34,7 @@ public static void LoadAppConfig(this IConfigurationBuilder builder, string[]? a // Add values from environment and command line arguments last, to override values from other sources. builder.AddEnvironmentVariables(); - builder.AddCommandLine(args ?? new string[0]); + builder.AddCommandLine(args ?? []); } } } diff --git a/src/Altinn.App.Core/Features/Options/AppOptionsFactory.cs b/src/Altinn.App.Core/Features/Options/AppOptionsFactory.cs index 84338d417..107ff7cea 100644 --- a/src/Altinn.App.Core/Features/Options/AppOptionsFactory.cs +++ b/src/Altinn.App.Core/Features/Options/AppOptionsFactory.cs @@ -29,7 +29,7 @@ public IAppOptionsProvider GetOptionsProvider(string optionsId) foreach (var appOptionProvider in AppOptionsProviders) { - if (appOptionProvider.Id.ToLower() != optionsId.ToLower()) + if (!appOptionProvider.Id.Equals(optionsId, StringComparison.OrdinalIgnoreCase)) { continue; } diff --git a/src/Altinn.App.Core/Features/Options/InstanceAppOptionsFactory.cs b/src/Altinn.App.Core/Features/Options/InstanceAppOptionsFactory.cs index d796ef8f1..a859f8ed0 100644 --- a/src/Altinn.App.Core/Features/Options/InstanceAppOptionsFactory.cs +++ b/src/Altinn.App.Core/Features/Options/InstanceAppOptionsFactory.cs @@ -25,7 +25,7 @@ public IInstanceAppOptionsProvider GetOptionsProvider(string optionsId) { foreach (var instanceAppOptionProvider in InstanceAppOptionsProviders) { - if (instanceAppOptionProvider.Id.ToLower() != optionsId.ToLower()) + if (!instanceAppOptionProvider.Id.Equals(optionsId, StringComparison.OrdinalIgnoreCase)) { continue; } diff --git a/src/Altinn.App.Core/Helpers/AppTextHelper.cs b/src/Altinn.App.Core/Helpers/AppTextHelper.cs index f8939e862..8d8642846 100644 --- a/src/Altinn.App.Core/Helpers/AppTextHelper.cs +++ b/src/Altinn.App.Core/Helpers/AppTextHelper.cs @@ -21,11 +21,11 @@ string languageId ) { string text = key; - if (serviceText != null && serviceText.ContainsKey(key)) + if (serviceText != null && serviceText.TryGetValue(key, out var serviceTextMap)) { - if (serviceText[key].ContainsKey(languageId)) + if (serviceTextMap.TryGetValue(languageId, out var lookupText)) { - text = serviceText[key][languageId]; + text = lookupText; } if (textParams != null && textParams.Count > 0) diff --git a/src/Altinn.App.Core/Helpers/DataHelper.cs b/src/Altinn.App.Core/Helpers/DataHelper.cs index 20bf0314a..916e4c88a 100644 --- a/src/Altinn.App.Core/Helpers/DataHelper.cs +++ b/src/Altinn.App.Core/Helpers/DataHelper.cs @@ -133,7 +133,7 @@ object data string key = entry.Key; string? value = entry.Value; - if (originalDictionary.ContainsKey(key) && originalDictionary[key] != value) + if (originalDictionary.TryGetValue(key, out string? originalValue) && originalValue != value) { updatedValues.Add(key, value); } diff --git a/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs b/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs index eb01db83f..6dff9697b 100644 --- a/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs +++ b/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs @@ -98,7 +98,7 @@ public string[] GetResolvedKeys(string key) { if (_serviceModel is null) { - return new string[0]; + return []; } var keyParts = key.Split('.'); @@ -144,12 +144,12 @@ private string[] GetResolvedKeysRecursive( { if (currentModel is null) { - return new string[0]; + return []; } if (currentIndex == keyParts.Length) { - return new[] { currentKey }; + return [currentKey]; } var (key, groupIndex) = ParseKeyPart(keyParts[currentIndex]); @@ -157,7 +157,7 @@ private string[] GetResolvedKeysRecursive( var childModel = prop?.GetValue(currentModel); if (childModel is null) { - return new string[0]; + return []; } if (childModel is not string && childModel is System.Collections.IEnumerable childModelList) diff --git a/src/Altinn.App.Core/Helpers/MimeTypeMap.cs b/src/Altinn.App.Core/Helpers/MimeTypeMap.cs index 12ed19300..10f572a69 100644 --- a/src/Altinn.App.Core/Helpers/MimeTypeMap.cs +++ b/src/Altinn.App.Core/Helpers/MimeTypeMap.cs @@ -1,3 +1,4 @@ +using System.Collections.Frozen; using Altinn.App.Core.Models; namespace Altinn.App.Core.Helpers @@ -7,11 +8,11 @@ namespace Altinn.App.Core.Helpers /// public static class MimeTypeMap { - private static readonly Lazy> _mappings = new Lazy>( - BuildMappings - ); + private static readonly Lazy> _mappings = new Lazy< + FrozenDictionary + >(BuildMappings); - private static IDictionary BuildMappings() + private static FrozenDictionary BuildMappings() { var mappings = new Dictionary(StringComparer.OrdinalIgnoreCase) { @@ -620,7 +621,7 @@ private static IDictionary BuildMappings() #endregion }; - return mappings; + return mappings.ToFrozenDictionary(); } /// @@ -630,12 +631,9 @@ private static IDictionary BuildMappings() /// The mime type public static MimeType GetMimeType(string extension) { - if (extension == null) - { - throw new ArgumentNullException(nameof(extension)); - } + ArgumentNullException.ThrowIfNull(extension); - if (!extension.StartsWith(".")) + if (!extension.StartsWith('.')) { extension = "." + extension; } diff --git a/src/Altinn.App.Core/Helpers/RemoveBomExtentions.cs b/src/Altinn.App.Core/Helpers/RemoveBomExtentions.cs index 1f4c903a8..b2c96aafe 100644 --- a/src/Altinn.App.Core/Helpers/RemoveBomExtentions.cs +++ b/src/Altinn.App.Core/Helpers/RemoveBomExtentions.cs @@ -2,7 +2,7 @@ namespace Altinn.App.Core.Helpers; internal static class RemoveBomExtentions { - private static readonly byte[] _utf8bom = new byte[] { 0xEF, 0xBB, 0xBF }; + private static readonly byte[] _utf8bom = [0xEF, 0xBB, 0xBF]; internal static ReadOnlySpan RemoveBom(this byte[] bytes) { diff --git a/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs b/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs index 396e3a4e2..2dbcde16a 100644 --- a/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs +++ b/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs @@ -24,7 +24,7 @@ public static void SetInstanceAppSelfLinks(Instance instance, HttpRequest reques int start = selfLink.IndexOf("/instances"); if (start > 0) { - selfLink = selfLink.Substring(0, start) + "/instances"; + selfLink = string.Concat(selfLink.AsSpan(0, start), "/instances"); } selfLink += $"/{instance.Id}"; @@ -69,7 +69,7 @@ HttpRequest request int start = selfLink.IndexOf("/instances"); if (start > 0) { - selfLink = selfLink.Substring(0, start) + "/instances"; + selfLink = string.Concat(selfLink.AsSpan(0, start), "/instances"); } selfLink += $"/{instanceOwnerPartyId}/{instanceGuid.ToString()}"; diff --git a/src/Altinn.App.Core/Implementation/PrefillSI.cs b/src/Altinn.App.Core/Implementation/PrefillSI.cs index 6844898b8..f4e60aae9 100644 --- a/src/Altinn.App.Core/Implementation/PrefillSI.cs +++ b/src/Altinn.App.Core/Implementation/PrefillSI.cs @@ -110,7 +110,7 @@ public async Task PrefillDataModel( JObject userProfileJsonObject = JObject.FromObject(userProfile); _logger.LogInformation($"Started prefill from {USER_PROFILE_KEY}"); LoopThroughDictionaryAndAssignValuesToDataModel( - SwapKeyValuesForPrefil(userProfileDict), + SwapKeyValuesForPrefill(userProfileDict), userProfileJsonObject, dataModel ); @@ -138,7 +138,7 @@ public async Task PrefillDataModel( JObject orgJsonObject = JObject.FromObject(org); _logger.LogInformation($"Started prefill from {ER_KEY}"); LoopThroughDictionaryAndAssignValuesToDataModel( - SwapKeyValuesForPrefil(enhetsregisterPrefill), + SwapKeyValuesForPrefill(enhetsregisterPrefill), orgJsonObject, dataModel ); @@ -165,7 +165,7 @@ public async Task PrefillDataModel( JObject personJsonObject = JObject.FromObject(person); _logger.LogInformation($"Started prefill from {DSF_KEY}"); LoopThroughDictionaryAndAssignValuesToDataModel( - SwapKeyValuesForPrefil(folkeregisterPrefill), + SwapKeyValuesForPrefill(folkeregisterPrefill), personJsonObject, dataModel ); @@ -288,7 +288,7 @@ private void LoopThroughDictionaryAndAssignValuesToDataModel( } } - private Dictionary SwapKeyValuesForPrefil(Dictionary externalPrefil) + private Dictionary SwapKeyValuesForPrefill(Dictionary externalPrefil) { return externalPrefil.ToDictionary(x => x.Value, x => x.Key); } diff --git a/src/Altinn.App.Core/Infrastructure/Clients/Storage/DataClient.cs b/src/Altinn.App.Core/Infrastructure/Clients/Storage/DataClient.cs index 267655bbf..ce2679768 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/Storage/DataClient.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/Storage/DataClient.cs @@ -101,7 +101,7 @@ Type type _logger.Log( LogLevel.Error, - "unable to save form data for instance{0} due to response {1}", + "unable to save form data for instance {InstanceId} due to response {StatusCode}", instance.Id, response.StatusCode ); diff --git a/src/Altinn.App.Core/Internal/Events/EventHandlerResolver.cs b/src/Altinn.App.Core/Internal/Events/EventHandlerResolver.cs index 02959f232..aaae48cee 100644 --- a/src/Altinn.App.Core/Internal/Events/EventHandlerResolver.cs +++ b/src/Altinn.App.Core/Internal/Events/EventHandlerResolver.cs @@ -23,7 +23,7 @@ public IEventHandler ResolveEventHandler(string eventType) foreach (var handler in _eventHandlers) { - if (handler.EventType.ToLower() != eventType.ToLower()) + if (!handler.EventType.Equals(eventType, StringComparison.OrdinalIgnoreCase)) { continue; } diff --git a/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluator.cs b/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluator.cs index b8a96c1bf..d40942805 100644 --- a/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluator.cs +++ b/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluator.cs @@ -77,7 +77,7 @@ context.Component is RepeatingGroupComponent repGroup { foreach (var index in Enumerable.Range(0, context.RowLength.Value).Reverse()) { - var rowIndices = context.RowIndices?.Append(index).ToArray() ?? new[] { index }; + var rowIndices = context.RowIndices?.Append(index).ToArray() ?? [index]; var indexedBinding = state.AddInidicies(repGroup.DataModelBindings["group"], rowIndices); if (context.HiddenRows.Contains(index)) { diff --git a/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluatorState.cs b/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluatorState.cs index 5544bf19f..a249e2c4e 100644 --- a/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluatorState.cs +++ b/src/Altinn.App.Core/Internal/Expressions/LayoutEvaluatorState.cs @@ -347,7 +347,7 @@ context.Component is RepeatingGroupComponent repGroup var hiddenRows = new List(); foreach (var index in Enumerable.Range(0, context.RowLength.Value)) { - var rowIndices = context.RowIndices?.Append(index).ToArray() ?? new[] { index }; + var rowIndices = context.RowIndices?.Append(index).ToArray() ?? [index]; var childContexts = context.ChildContexts.Where(c => c.RowIndices?.Last() == index); var rowContext = new ComponentContext(context.Component, rowIndices, null, childContexts); var rowHidden = ExpressionEvaluator.EvaluateBooleanExpression(this, rowContext, "hiddenRow", false); diff --git a/src/Altinn.App.Core/Internal/Pdf/PdfService.cs b/src/Altinn.App.Core/Internal/Pdf/PdfService.cs index 187fb428e..17968c818 100644 --- a/src/Altinn.App.Core/Internal/Pdf/PdfService.cs +++ b/src/Altinn.App.Core/Internal/Pdf/PdfService.cs @@ -68,7 +68,7 @@ public async Task GenerateAndStorePdf(Instance instance, string taskId, Cancella // Avoid a costly call if the language is allready overriden by the user language = string.IsNullOrEmpty(language) ? await GetLanguage() : language; - var pdfContent = await GeneratePdfContent(instance, taskId, ct, language); + var pdfContent = await GeneratePdfContent(instance, taskId, language, ct); var appIdentifier = new AppIdentifier(instance); @@ -84,14 +84,14 @@ public async Task GeneratePdf(Instance instance, string taskId, Cancella // Avoid a costly call if the language is allready overriden by the user language = string.IsNullOrEmpty(language) ? await GetLanguage() : language; - return await GeneratePdfContent(instance, taskId, ct, language); + return await GeneratePdfContent(instance, taskId, language, ct); } private async Task GeneratePdfContent( Instance instance, string taskId, - CancellationToken ct, - string language + string language, + CancellationToken ct ) { var baseUrl = _generalSettings.FormattedExternalAppBaseUrl(new AppIdentifier(instance)); diff --git a/src/Altinn.App.Core/Models/AppIdentifier.cs b/src/Altinn.App.Core/Models/AppIdentifier.cs index 7d90c74df..5bb3af0e1 100644 --- a/src/Altinn.App.Core/Models/AppIdentifier.cs +++ b/src/Altinn.App.Core/Models/AppIdentifier.cs @@ -117,10 +117,7 @@ public override int GetHashCode() /// A new instance of public static AppIdentifier CreateFromUrl(string url) { - if (url == null) - { - throw new ArgumentNullException(nameof(url)); - } + ArgumentNullException.ThrowIfNull(url); if (!Uri.IsWellFormedUriString(url, UriKind.Absolute)) { diff --git a/src/Altinn.App.Core/Models/Expressions/ComponentContext.cs b/src/Altinn.App.Core/Models/Expressions/ComponentContext.cs index aaad82733..2cabed33f 100644 --- a/src/Altinn.App.Core/Models/Expressions/ComponentContext.cs +++ b/src/Altinn.App.Core/Models/Expressions/ComponentContext.cs @@ -72,7 +72,7 @@ public IEnumerable Decendants get { var stack = new Stack(ChildContexts); - while (stack.Any()) + while (stack.Count != 0) { var node = stack.Pop(); yield return node; diff --git a/src/Altinn.App.Core/Models/Layout/LayoutModel.cs b/src/Altinn.App.Core/Models/Layout/LayoutModel.cs index 6f57631f2..3ecb38466 100644 --- a/src/Altinn.App.Core/Models/Layout/LayoutModel.cs +++ b/src/Altinn.App.Core/Models/Layout/LayoutModel.cs @@ -48,7 +48,7 @@ public IEnumerable GetComponents() { // Use a stack in order to implement a depth first search var nodes = new Stack(Pages.Values); - while (nodes.Any()) + while (nodes.Count != 0) { var node = nodes.Pop(); yield return node; diff --git a/stylecop.json b/stylecop.json deleted file mode 100644 index 4eef0f17a..000000000 --- a/stylecop.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - // ACTION REQUIRED: This file was automatically added to your project, but it - // will not take effect until additional steps are taken to enable it. See the - // following page for additional information: - // - // https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md - - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": { - "documentationRules": { - "companyName": "PlaceholderCompany" - }, - "orderingRules": { - "usingDirectivesPlacement": "outsideNamespace", - "systemUsingDirectivesFirst": true, - "blankLinesBetweenUsingGroups": "allow" - }, - "namingRules": { - "allowCommonHungarianPrefixes": true, - "allowedHungarianPrefixes": [ - "as", - "d", - "db", - "dn", - "do", - "dr", - "ds", - "dt", - "e", - "e2", - "er", - "f", - "fs", - "go", - "id", - "if", - "in", - "ip", - "is", - "js", - "li", - "my", - "no", - "ns", - "on", - "or", - "pi", - "pv", - "sa", - "sb", - "se", - "si", - "so", - "sp", - "tc", - "to", - "tr", - "ui", - "un", - "wf", - "ws", - "x", - "y", - "j", - "js" - ] - } - } -} diff --git a/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj b/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj index c0c86e3a6..d472686d2 100644 --- a/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj +++ b/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj @@ -5,12 +5,6 @@ enable enable false - $(NoWarn);CS1591;CS0618;CS7022 - diff --git a/test/Altinn.App.Api.Tests/Controllers/ValidateControllerValidateDataTests.cs b/test/Altinn.App.Api.Tests/Controllers/ValidateControllerValidateDataTests.cs index 6b289572a..662a971ab 100644 --- a/test/Altinn.App.Api.Tests/Controllers/ValidateControllerValidateDataTests.cs +++ b/test/Altinn.App.Api.Tests/Controllers/ValidateControllerValidateDataTests.cs @@ -146,7 +146,7 @@ public IEnumerator GetEnumerator() List testData = new List(); foreach (var d in _data) { - testData.Add(new object[] { d }); + testData.Add([d]); } return testData.GetEnumerator(); diff --git a/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj b/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj index a360e5532..bf3475ae0 100644 --- a/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj +++ b/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj @@ -57,16 +57,6 @@ - - - all - runtime; build; native; contentfiles; analyzers - - - stylecop.json - - - @@ -109,9 +99,4 @@ - - ..\..\Altinn3.ruleset - - - diff --git a/test/Altinn.App.Core.Tests/GlobalSuppressions.cs b/test/Altinn.App.Core.Tests/GlobalSuppressions.cs deleted file mode 100644 index f825eb5b4..000000000 --- a/test/Altinn.App.Core.Tests/GlobalSuppressions.cs +++ /dev/null @@ -1,13 +0,0 @@ -// This file is used by Code Analysis to maintain SuppressMessage -// attributes that are applied to this project. -// Project-level suppressions either have no target or are given -// a specific target and scoped to a namespace, type, member, etc. - -using System.Diagnostics.CodeAnalysis; - -[assembly: SuppressMessage( - "StyleCop.CSharp.DocumentationRules", - "SA1600:Elements should be documented", - Justification = "Test description should be in the name of the test.", - Scope = "module" -)] diff --git a/test/Altinn.App.Core.Tests/Helpers/JsonDataModel.cs b/test/Altinn.App.Core.Tests/Helpers/JsonDataModel.cs index b3d73f877..e5f63e48f 100644 --- a/test/Altinn.App.Core.Tests/Helpers/JsonDataModel.cs +++ b/test/Altinn.App.Core.Tests/Helpers/JsonDataModel.cs @@ -169,7 +169,7 @@ public string[] GetResolvedKeys(string key) { if (_modelRoot is null) { - return new string[0]; + return []; } var keyParts = key.Split('.'); @@ -185,12 +185,12 @@ private string[] GetResolvedKeysRecursive( { if (currentModel is null) { - return new string[0]; + return []; } if (currentIndex == keyParts.Length) { - return new[] { currentKey }; + return [currentKey]; } var (key, groupIndex) = DataModel.ParseKeyPart(keyParts[currentIndex]); @@ -199,7 +199,7 @@ currentModel is not JsonObject || !currentModel.AsObject().TryGetPropertyValue(key, out JsonNode? childModel) ) { - return new string[0]; + return []; } if (childModel is JsonArray childArray) diff --git a/test/Altinn.App.Core.Tests/Helpers/ObjectUtils_XmlSerializationTests.cs b/test/Altinn.App.Core.Tests/Helpers/ObjectUtils_XmlSerializationTests.cs index 48a936a59..696540bf5 100644 --- a/test/Altinn.App.Core.Tests/Helpers/ObjectUtils_XmlSerializationTests.cs +++ b/test/Altinn.App.Core.Tests/Helpers/ObjectUtils_XmlSerializationTests.cs @@ -13,7 +13,6 @@ using Xunit.Abstractions; // ReSharper disable InconsistentNaming -#pragma warning disable SA1300 // Inconsistent casing on property namespace Altinn.App.Core.Tests.Helpers; diff --git a/test/Altinn.App.Core.Tests/Implementation/InstanceClientTests.cs b/test/Altinn.App.Core.Tests/Implementation/InstanceClientTests.cs index 8191aa0f8..6dee3de07 100644 --- a/test/Altinn.App.Core.Tests/Implementation/InstanceClientTests.cs +++ b/test/Altinn.App.Core.Tests/Implementation/InstanceClientTests.cs @@ -52,7 +52,7 @@ public async Task AddCompleteConfirmation_SuccessfulCallToStorage() Content = new StringContent(JsonConvert.SerializeObject(instance), Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "complete" }); + InitializeMocks([httpResponseMessage], ["complete"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -81,7 +81,7 @@ public async Task AddCompleteConfirmation_StorageReturnsNonSuccess_ThrowsPlatfor Content = new StringContent("Error message", Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "complete" }); + InitializeMocks([httpResponseMessage], ["complete"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -121,7 +121,7 @@ public async Task UpdateReadStatus_StorageReturnsNonSuccess_LogsErrorAppContinue Content = new StringContent("Error message", Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "read" }); + InitializeMocks([httpResponseMessage], ["read"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -163,7 +163,7 @@ public async Task UpdateReadStatus_StorageReturnsSuccess() Content = new StringContent(JsonConvert.SerializeObject(expected), Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "read" }); + InitializeMocks([httpResponseMessage], ["read"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -201,7 +201,7 @@ public async Task UpdateSubtatus_StorageReturnsSuccess() Content = new StringContent(JsonConvert.SerializeObject(expected), Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "substatus" }); + InitializeMocks([httpResponseMessage], ["substatus"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -236,7 +236,7 @@ public async Task UpdateSubtatus_StorageReturnsNonSuccess_ThrowsPlatformHttpExce Content = new StringContent("Error message", Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "substatus" }); + InitializeMocks([httpResponseMessage], ["substatus"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -285,7 +285,7 @@ public async Task DeleteInstance_StorageReturnsSuccess() Content = new StringContent(JsonConvert.SerializeObject(expected), Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "1337" }); + InitializeMocks([httpResponseMessage], ["1337"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -317,7 +317,7 @@ public async Task DeleteInstance_StorageReturnsNonSuccess_ThrowsPlatformHttpExce Content = new StringContent("Error message", Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "1337" }); + InitializeMocks([httpResponseMessage], ["1337"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -359,7 +359,7 @@ public async Task UpdatePresentationTexts_StorageReturnsNonSuccess_ThrowsPlatfor Content = new StringContent("Error message", Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "1337" }); + InitializeMocks([httpResponseMessage], ["1337"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -408,7 +408,7 @@ public async Task UpdatePresentationTexts_SuccessfulCallToStorage() Content = new StringContent(JsonConvert.SerializeObject(expected), Encoding.UTF8, "application/json"), }; - InitializeMocks(new HttpResponseMessage[] { httpResponseMessage }, new string[] { "presentationtexts" }); + InitializeMocks([httpResponseMessage], ["presentationtexts"]); HttpClient httpClient = new HttpClient(handlerMock.Object); @@ -472,10 +472,7 @@ public async Task QueryInstances_QueryResponseContainsNext() ), }; - InitializeMocks( - new HttpResponseMessage[] { httpResponseMessage1, httpResponseMessage2 }, - new string[] { urlPart1, urlPart2 } - ); + InitializeMocks([httpResponseMessage1, httpResponseMessage2], [urlPart1, urlPart2]); HttpClient httpClient = new HttpClient(handlerMock.Object); diff --git a/test/Altinn.App.Core.Tests/LayoutExpressions/FullTests/Test1/RunTest1.cs b/test/Altinn.App.Core.Tests/LayoutExpressions/FullTests/Test1/RunTest1.cs index 046e408f9..6ccab17a2 100644 --- a/test/Altinn.App.Core.Tests/LayoutExpressions/FullTests/Test1/RunTest1.cs +++ b/test/Altinn.App.Core.Tests/LayoutExpressions/FullTests/Test1/RunTest1.cs @@ -47,7 +47,7 @@ public async Task RemoveData_WhenPageExpressionIsTrue() "Test1" ); var hidden = LayoutEvaluator.GetHiddenFieldsForRemoval(state); - hidden.Should().BeEquivalentTo(new string[] { "some.data.binding2" }); + hidden.Should().BeEquivalentTo(["some.data.binding2"]); } [Fact] diff --git a/test/Altinn.App.Core.Tests/LayoutExpressions/TestDataModel.cs b/test/Altinn.App.Core.Tests/LayoutExpressions/TestDataModel.cs index 6f118a3df..97a2ac37f 100644 --- a/test/Altinn.App.Core.Tests/LayoutExpressions/TestDataModel.cs +++ b/test/Altinn.App.Core.Tests/LayoutExpressions/TestDataModel.cs @@ -20,7 +20,7 @@ public void TestSimpleGet() var modelHelper = new DataModel(model); modelHelper.GetModelData("does.not.exist", default).Should().BeNull(); modelHelper.GetModelData("name.value", default).Should().Be(model.Name.Value); - modelHelper.GetModelData("name.value", new int[] { 1, 2, 3 }).Should().Be(model.Name.Value); + modelHelper.GetModelData("name.value", [1, 2, 3]).Should().Be(model.Name.Value); } [Fact] @@ -74,22 +74,22 @@ public void RecursiveLookup() IDataModelAccessor modelHelper = new DataModel(model); modelHelper.GetModelData("friends.name.value", default).Should().BeNull(); modelHelper.GetModelData("friends[0].name.value", default).Should().Be("Donald Duck"); - modelHelper.GetModelData("friends.name.value", new int[] { 0 }).Should().Be("Donald Duck"); + modelHelper.GetModelData("friends.name.value", [0]).Should().Be("Donald Duck"); modelHelper.GetModelData("friends[0].age", default).Should().Be(123); - modelHelper.GetModelData("friends.age", new int[] { 0 }).Should().Be(123); + modelHelper.GetModelData("friends.age", [0]).Should().Be(123); modelHelper.GetModelData("friends[1].name.value", default).Should().Be("Dolly Duck"); - modelHelper.GetModelData("friends.name.value", new int[] { 1 }).Should().Be("Dolly Duck"); + modelHelper.GetModelData("friends.name.value", [1]).Should().Be("Dolly Duck"); // Run the same tests with JsonDataModel var doc = JsonSerializer.Deserialize(JsonSerializer.Serialize(model)); modelHelper = new JsonDataModel(doc); modelHelper.GetModelData("friends.name.value", default).Should().BeNull(); modelHelper.GetModelData("friends[0].name.value", default).Should().Be("Donald Duck"); - modelHelper.GetModelData("friends.name.value", new int[] { 0 }).Should().Be("Donald Duck"); + modelHelper.GetModelData("friends.name.value", [0]).Should().Be("Donald Duck"); modelHelper.GetModelData("friends[0].age", default).Should().Be(123); - modelHelper.GetModelData("friends.age", new int[] { 0 }).Should().Be(123); + modelHelper.GetModelData("friends.age", [0]).Should().Be(123); modelHelper.GetModelData("friends[1].name.value", default).Should().Be("Dolly Duck"); - modelHelper.GetModelData("friends.name.value", new int[] { 1 }).Should().Be("Dolly Duck"); + modelHelper.GetModelData("friends.name.value", [1]).Should().Be("Dolly Duck"); } [Fact] @@ -134,37 +134,37 @@ public void DoubleRecursiveLookup() IDataModelAccessor modelHelper = new DataModel(model); modelHelper.GetModelData("friends[1].friends[0].name.value", default).Should().Be("Onkel Skrue"); - modelHelper.GetModelData("friends[1].friends.name.value", new int[] { 0, 0 }).Should().BeNull(); + modelHelper.GetModelData("friends[1].friends.name.value", [0, 0]).Should().BeNull(); modelHelper - .GetModelData("friends[1].friends.name.value", new int[] { 1, 0 }) + .GetModelData("friends[1].friends.name.value", [1, 0]) .Should() .BeNull("context indexes should not be used after literal index is used"); - modelHelper.GetModelData("friends[1].friends.name.value", new int[] { 1 }).Should().BeNull(); - modelHelper.GetModelData("friends.friends[0].name.value", new int[] { 1, 4, 5, 7 }).Should().Be("Onkel Skrue"); + modelHelper.GetModelData("friends[1].friends.name.value", [1]).Should().BeNull(); + modelHelper.GetModelData("friends.friends[0].name.value", [1, 4, 5, 7]).Should().Be("Onkel Skrue"); modelHelper.GetModelDataCount("friends[1].friends", Array.Empty()).Should().Be(1); - modelHelper.GetModelDataCount("friends.friends", new int[] { 1 }).Should().Be(1); - modelHelper.GetModelDataCount("friends[1].friends.friends", new int[] { 1, 0, 0 }).Should().BeNull(); - modelHelper.GetModelDataCount("friends[1].friends[0].friends", new int[] { 1, 0, 0 }).Should().Be(2); - modelHelper.GetModelDataCount("friends.friends.friends", new int[] { 1, 0, 0 }).Should().Be(2); - modelHelper.GetModelDataCount("friends.friends", new int[] { 1 }).Should().Be(1); + modelHelper.GetModelDataCount("friends.friends", [1]).Should().Be(1); + modelHelper.GetModelDataCount("friends[1].friends.friends", [1, 0, 0]).Should().BeNull(); + modelHelper.GetModelDataCount("friends[1].friends[0].friends", [1, 0, 0]).Should().Be(2); + modelHelper.GetModelDataCount("friends.friends.friends", [1, 0, 0]).Should().Be(2); + modelHelper.GetModelDataCount("friends.friends", [1]).Should().Be(1); // Run the same tests with JsonDataModel var doc = JsonSerializer.Deserialize(JsonSerializer.Serialize(model)); modelHelper = new JsonDataModel(doc); modelHelper.GetModelData("friends[1].friends[0].name.value", default).Should().Be("Onkel Skrue"); - modelHelper.GetModelData("friends[1].friends.name.value", new int[] { 0, 0 }).Should().BeNull(); + modelHelper.GetModelData("friends[1].friends.name.value", [0, 0]).Should().BeNull(); modelHelper - .GetModelData("friends[1].friends.name.value", new int[] { 1, 0 }) + .GetModelData("friends[1].friends.name.value", [1, 0]) .Should() .BeNull("context indexes should not be used after literal index is used"); - modelHelper.GetModelData("friends[1].friends.name.value", new int[] { 1 }).Should().BeNull(); - modelHelper.GetModelData("friends.friends[0].name.value", new int[] { 1, 4, 5, 7 }).Should().Be("Onkel Skrue"); + modelHelper.GetModelData("friends[1].friends.name.value", [1]).Should().BeNull(); + modelHelper.GetModelData("friends.friends[0].name.value", [1, 4, 5, 7]).Should().Be("Onkel Skrue"); modelHelper.GetModelDataCount("friends[1].friends", Array.Empty()).Should().Be(1); - modelHelper.GetModelDataCount("friends.friends", new int[] { 1 }).Should().Be(1); - modelHelper.GetModelDataCount("friends[1].friends.friends", new int[] { 1, 0, 0 }).Should().BeNull(); - modelHelper.GetModelDataCount("friends[1].friends[0].friends", new int[] { 1, 0, 0 }).Should().Be(2); - modelHelper.GetModelDataCount("friends.friends.friends", new int[] { 1, 0, 0 }).Should().Be(2); - modelHelper.GetModelDataCount("friends.friends", new int[] { 1 }).Should().Be(1); + modelHelper.GetModelDataCount("friends.friends", [1]).Should().Be(1); + modelHelper.GetModelDataCount("friends[1].friends.friends", [1, 0, 0]).Should().BeNull(); + modelHelper.GetModelDataCount("friends[1].friends[0].friends", [1, 0, 0]).Should().Be(2); + modelHelper.GetModelDataCount("friends.friends.friends", [1, 0, 0]).Should().Be(2); + modelHelper.GetModelDataCount("friends.friends", [1]).Should().Be(1); } [Fact] @@ -316,13 +316,13 @@ public void TestErrorCases() modelHelper.GetModelData("friends[3]").Should().BeNull(); modelHelper - .Invoking(m => m.AddIndicies("tull.sd", new int[] { 2 })) + .Invoking(m => m.AddIndicies("tull.sd", [2])) .Should() .Throw() .WithMessage("Unknown model property tull in*"); modelHelper - .Invoking(m => m.AddIndicies("id[4]", new int[] { 6 })) + .Invoking(m => m.AddIndicies("id[4]", [6])) .Should() .Throw() .WithMessage("Index on non indexable property"); @@ -340,7 +340,7 @@ public void TestEdgeCaseWithNonGenericEnumerableForCoverage() } ); modelHelper - .Invoking(m => m.AddIndicies("friends", new int[] { 0 })) + .Invoking(m => m.AddIndicies("friends", [0])) .Should() .Throw() .WithMessage("DataModels must have generic IEnumerable<> implementation for list"); @@ -358,16 +358,16 @@ public void TestAddIndicies() ); // Plain add indicies - modelHelper.AddIndicies("friends.friends", new int[] { 0, 1 }).Should().Be("friends[0].friends[1]"); + modelHelper.AddIndicies("friends.friends", [0, 1]).Should().Be("friends[0].friends[1]"); // Ignore extra indicies - modelHelper.AddIndicies("friends.friends", new int[] { 0, 1, 4, 6 }).Should().Be("friends[0].friends[1]"); + modelHelper.AddIndicies("friends.friends", [0, 1, 4, 6]).Should().Be("friends[0].friends[1]"); // Don't add indicies if they are specified in input - modelHelper.AddIndicies("friends[3]", new int[] { 0 }).Should().Be("friends[3]"); + modelHelper.AddIndicies("friends[3]", [0]).Should().Be("friends[3]"); // First index is ignored if it is explicit - modelHelper.AddIndicies("friends[0].friends", new int[] { 2, 3 }).Should().Be("friends[0].friends[3]"); + modelHelper.AddIndicies("friends[0].friends", [2, 3]).Should().Be("friends[0].friends[3]"); } [Fact] @@ -377,7 +377,7 @@ public void AddIndicies_WhenGivenIndexOnNonIndexableProperty_ThrowsError() // Throws because id is not indexable modelHelper - .Invoking(m => m.AddIndicies("id[0]", new int[] { 1, 2, 3 })) + .Invoking(m => m.AddIndicies("id[0]", [1, 2, 3])) .Should() .Throw() .WithMessage("Index on non indexable property"); diff --git a/test/Directory.Build.props b/test/Directory.Build.props new file mode 100644 index 000000000..c4a3a4e9b --- /dev/null +++ b/test/Directory.Build.props @@ -0,0 +1,15 @@ + + + + + + Default + $(NoWarn);CS1591;CS0618;CS7022;CA1707 + + + +