diff --git a/Rules/AvoidDefaultValueForMandatoryParameter.cs b/Rules/AvoidDefaultValueForMandatoryParameter.cs index cb7aa31a4..f3d66d973 100644 --- a/Rules/AvoidDefaultValueForMandatoryParameter.cs +++ b/Rules/AvoidDefaultValueForMandatoryParameter.cs @@ -51,8 +51,10 @@ 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. + if (namedArgument.ExpressionOmitted + || (String.Equals(namedArgument.Argument.Extent.Text, "$true", StringComparison.OrdinalIgnoreCase)) + || (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 9948a9d13..c4fa2258d 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=0)]$Param1=''val1'') }' | + Where-Object { $_.RuleName -eq $ruleName } + $violations.Count | Should -Be 0 + } } }