From 794ad854b5a082bad03c074fff62ae541569ac9b Mon Sep 17 00:00:00 2001 From: kalgiz Date: Thu, 12 Apr 2018 15:08:15 -0700 Subject: [PATCH 1/3] AvoidDefaultValueForMandatoryParameter triggers when the field has specification: Mandatory=value and value!=0 --- Rules/AvoidDefaultValueForMandatoryParameter.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Rules/AvoidDefaultValueForMandatoryParameter.cs b/Rules/AvoidDefaultValueForMandatoryParameter.cs index cb7aa31a4..a827e8a7b 100644 --- a/Rules/AvoidDefaultValueForMandatoryParameter.cs +++ b/Rules/AvoidDefaultValueForMandatoryParameter.cs @@ -51,8 +51,11 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) { if (String.Equals(namedArgument.ArgumentName, "mandatory", StringComparison.OrdinalIgnoreCase)) { - // 2 cases: [Parameter(Mandatory)] and [Parameter(Mandatory=$true)] - if (namedArgument.ExpressionOmitted || (!namedArgument.ExpressionOmitted && String.Equals(namedArgument.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase))) + // 3 cases: [Parameter(Mandatory)], [Parameter(Mandatory=$true)] and [Parameter(Mandatory=value)] where value is not equal to 0. + int mandatoryValue = 0; + if (namedArgument.ExpressionOmitted + || (String.Equals(namedArgument.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase)) + || (int.TryParse(namedArgument.Argument.Extent.Text, out mandatoryValue) && mandatoryValue != 0)) { mandatory = true; break; From a49cdafb3b5b635fe8ecb74d7818000d73961167 Mon Sep 17 00:00:00 2001 From: kalgiz Date: Thu, 12 Apr 2018 15:57:29 -0700 Subject: [PATCH 2/3] Add tests for AvoidDefaultValueForMandatoryParameter rule. --- .../AvoidDefaultValueForMandatoryParameter.tests.ps1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 b/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 index 9948a9d13..ab86ec434 100644 --- a/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 +++ b/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 @@ -13,6 +13,12 @@ Describe "AvoidDefaultValueForMandatoryParameter" { Where-Object { $_.RuleName -eq $ruleName } $violations.Count | Should -Be 1 } + + It "returns violations when the parameter is specified as mandatory=1 and has a default value" { + $violations = Invoke-ScriptAnalyzer -ScriptDefinition 'Function foo{ Param([Parameter(Mandatory=1)]$Param1=''defaultValue'') }' | + Where-Object { $_.RuleName -eq $ruleName } + $violations.Count | Should -Be 1 + } } Context "When there are no violations" { @@ -21,5 +27,11 @@ Describe "AvoidDefaultValueForMandatoryParameter" { Where-Object { $_.RuleName -eq $ruleName } $violations.Count | Should -Be 0 } + + It "returns no violations when the parameter is specified as mandatory=0 and has a default value" { + $violations = Invoke-ScriptAnalyzer -ScriptDefinition 'Function foo{ Param([Parameter(Mandatory=$false)]$Param1=''val1'', [Parameter(Mandatory)]$Param2=''val2'', $Param3=''val3'') }' | + Where-Object { $_.RuleName -eq $ruleName } + $violations.Count | Should -Be 0 + } } } From b84ef47d45dc6f7f2cc7e4d00e98250b601a9aa0 Mon Sep 17 00:00:00 2001 From: kalgiz Date: Mon, 16 Apr 2018 10:43:24 -0700 Subject: [PATCH 3/3] Code cleanup for AvoidDefaultValueForMandatoryParameter rule fix. --- Rules/AvoidDefaultValueForMandatoryParameter.cs | 3 +-- Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Rules/AvoidDefaultValueForMandatoryParameter.cs b/Rules/AvoidDefaultValueForMandatoryParameter.cs index a827e8a7b..f3d66d973 100644 --- a/Rules/AvoidDefaultValueForMandatoryParameter.cs +++ b/Rules/AvoidDefaultValueForMandatoryParameter.cs @@ -52,10 +52,9 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) if (String.Equals(namedArgument.ArgumentName, "mandatory", StringComparison.OrdinalIgnoreCase)) { // 3 cases: [Parameter(Mandatory)], [Parameter(Mandatory=$true)] and [Parameter(Mandatory=value)] where value is not equal to 0. - int mandatoryValue = 0; if (namedArgument.ExpressionOmitted || (String.Equals(namedArgument.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase)) - || (int.TryParse(namedArgument.Argument.Extent.Text, out mandatoryValue) && mandatoryValue != 0)) + || (int.TryParse(namedArgument.Argument.Extent.Text, out int mandatoryValue) && mandatoryValue != 0)) { mandatory = true; break; diff --git a/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 b/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 index ab86ec434..c4fa2258d 100644 --- a/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 +++ b/Tests/Rules/AvoidDefaultValueForMandatoryParameter.tests.ps1 @@ -29,7 +29,7 @@ Describe "AvoidDefaultValueForMandatoryParameter" { } It "returns no violations when the parameter is specified as mandatory=0 and has a default value" { - $violations = Invoke-ScriptAnalyzer -ScriptDefinition 'Function foo{ Param([Parameter(Mandatory=$false)]$Param1=''val1'', [Parameter(Mandatory)]$Param2=''val2'', $Param3=''val3'') }' | + $violations = Invoke-ScriptAnalyzer -ScriptDefinition 'Function foo{ Param([Parameter(Mandatory=0)]$Param1=''val1'') }' | Where-Object { $_.RuleName -eq $ruleName } $violations.Count | Should -Be 0 }