testcases/deploymentTemplate/Parameters-Must-Be-Referenced.test.ps1

<#
.Synopsis
    Ensures that parameters are referenced
.Description
    Ensures that all Azure Resource Manager Template
#>

param(
    # The Template Object
    [Parameter(Mandatory = $true, Position = 0)]
    [PSObject]
    $TemplateObject,

    # The Template JSON Text
    [Parameter(Mandatory = $true, Position = 0)]
    [PSObject]
    $TemplateText
)

$exprStrOrQuote = [Regex]::new('(?<!\\)[\[\"]', 'RightToLeft')
foreach ($parameter in $TemplateObject.parameters.psobject.properties) {
    # If the parameter name starts with two underscores,
    if ($parameter.Name -like '__*') { continue } # skip it.

    $escapedName = $Parameter.Name -replace '\s', '\s'
    # Create a Regex to find the parameter
    $findParam = [Regex]::new(@"
parameters # the parameters keyword
\s{0,} # optional whitespace
\( # opening parenthesis
\s{0,} # more optional whitespace
' # a single quote
$escapedName # the parameter name
' # a single quote
\s{0,} # more optional whitespace
\) # closing parenthesis
"@
,
    # The Regex needs to be case-insensitive
'Multiline,IgnoreCase,IgnorePatternWhitespace'
)
    $foundRefs = @($findParam.Matches($TemplateText)) # See if we found the parameter
    if (-not $foundRefs) { # If we didn't, error
        Write-Error -Message "Unreferenced parameter: $($Parameter.Name)" -ErrorId Parameters.Must.Be.Referenced -TargetObject $parameter
    } else {
        foreach ($fr in $foundRefs) { # Walk thru each reference
            $foundQuote =$exprStrOrQuote.Match($TemplateText, $fr.Index + 1) # make sure we hit a [ before a quote
            if ($foundQuote.Value -eq '"') { # if we don't, error
                Write-Error -Message "Parameter reference is not contained within an expression: $($Parameter.Name)" -ErrorId Parameters.Must.Be.Referenced.In.Expression -TargetObject $parameter
            }
        }
    }
}